📄 sync.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 + -