⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sync.c

📁 完整的OFDM系统,含Matlab仿真代码和DSP源代码下载.平台Tms320C6000.含项目说明文档.绝对高质量的源代码.
💻 C
字号:
//sync.c
//
// Project Red 2002: High Performance OFDM Modem 
// Against Channel Imperfections
// Auther: Linus Falk

#include "ofdm.h"

#define SYNC_BUFFER_SIZE	320
#define COMPLEX_SYNC_BUFFER_SIZE	(SYNC_BUFFER_SIZE*2)
#define COR_LENGTH	636

//frediks sync
#define length_observed_symbols	SYNC_BUFFER_SIZE
#define nr_channels 256
#define L	32

float sync_buffer1[COMPLEX_SYNC_BUFFER_SIZE]; 
float sync_buffer2[COMPLEX_SYNC_BUFFER_SIZE];
float *write_sync_buffer = sync_buffer1;
unsigned short write_next = 0;
float cor[COR_LENGTH];
short sync_adjust = 0;
#pragma DATA_SECTION (sync_adjustV, ".sysmem");
short sync_adjustV[1000] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
short sync_next = 16;
int sync_diff = 0;
int nr_of_frames =0 ;
int nr_of_framesV[11] = {0,0,0,0,0,0,0,0,0,0,0};

void calc_autocor(float *buffer);

void sync(float observed_symbols[COMPLEX_SYNC_BUFFER_SIZE]){
	int theta;
	int k;
	float sum1;
	float sum2;
	float gamma[33];
	float phi[33];
	int	  theta_ml =0;
	float theta_hat[32];
	float arg_max = 0;
	int adj_theta;
	
	
	for(theta=0; theta< (length_observed_symbols-nr_channels-L+1); theta++){
		sum1 =0;
		sum2 =0;
		for(k=theta; k<=(theta+L-1); k++){
			sum1 = sum1 + observed_symbols[k*2]*observed_symbols[(k+nr_channels)*2];
			sum2 = sum2 +0.5*(observed_symbols[k*2]*observed_symbols[k*2]+observed_symbols[(k+nr_channels)*2]*observed_symbols[(k+nr_channels)*2]);
		}
		gamma[theta] = sum1;
		phi[theta] = sum2;
		if(gamma[theta] < 0){
			theta_hat[theta] = -gamma[theta] - phi[theta];
		}else{
			theta_hat[theta] = gamma[theta] - phi[theta];
		}
	}
	
	//find max theta_hat
	arg_max = theta_hat[0];
	for(k=1; k<length_observed_symbols-nr_channels-L+1; k++){
		if(arg_max < theta_hat[k]){
			arg_max = theta_hat[k];
			theta_ml = k;
		}
	}
	//calculate sync diff
	sync_diff = theta_ml - sync_next;
	if(theta_ml < 16){
		sync_next = theta_ml + 1;
	}else if(theta_ml > 16){
		sync_next = theta_ml - 1;
	}else{
		sync_next = 16;
	}
		
	//calculate sync adjust
	sync_adjust = 16 - theta_ml;	//adjust the next sampeled frame so that it stays i the center.
	//adjust startingpoint
	adj_theta = theta_ml + 16;
	//extract symbols
	extract(observed_symbols+adj_theta*2);
}


//blir fel om energi hittas i f鰎sta delframe
void fill_sync_buffer(volatile short *frame_p, unsigned short length){
	int i;
	
	float one_over_amp = 0.004;
	
	for(i=0; i<length; i++){
		write_sync_buffer[write_next++] = (float)frame_p[i*2]*one_over_amp; //Re
		write_sync_buffer[write_next++] = 0;
						
		if(write_next == COMPLEX_SYNC_BUFFER_SIZE){	//buffer full, skicka till sync och byt.
			nr_of_frames++;
			//nr_of_framesV[nr_of_frames]++;
			if(nr_of_frames == 1000){ //just to enable breakpoint after x nr of frames.
				nr_of_frames = 0;
			}
			sync(write_sync_buffer);
			write_next = 0;
						
			if(write_sync_buffer == sync_buffer1){
				write_sync_buffer = sync_buffer2;
			}else{
				write_sync_buffer = sync_buffer1;
			}
			
			//adjust frame position
			sync_adjustV[nr_of_frames] = sync_adjust;
			if(sync_adjust < 0){ //skip one sample
				i++; 
			}else if(sync_adjust > 0){ //sample later
				write_sync_buffer[write_next++] = 0;
				write_sync_buffer[write_next++] = 0;
			}			
		}
	}
}



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -