📄 run_receiver.c
字号:
//run_receiver.c
//
// Project Red 2002: High Performance OFDM Modem
// Against Channel Imperfections
// Auther: Linus Falk
#include "receiver.h"
#include "ofdm.h"
#include "sync.h"
volatile short frame1[SAMPLE_BUFFER_LENGTH];
volatile short frame2[SAMPLE_BUFFER_LENGTH];
volatile short *current_frame = frame1;
volatile short *sync_start_p;
short backup_guard[32] = {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,0,0,0,0}; //used to backup guard-bits before energy detect
static short energy_detected = FALSE;
#define ENERGY_THRESHOLD 600000
int frame_counter = 0;
void sync_frame(void);
int detect_energy(volatile short *frame_seq);
void run_receiver(void);
interrupt void isr_sync_frame(void);
void run_receiver(void){
DMA_AUTO_START(DMA_CH2);
while(1){
}
}
interrupt void isr_sync_frame(void){ // ISR for DMA channel 2
unsigned int sec_ctrl;
// Read memory-mapped register
sec_ctrl = REG_READ(DMA2_SECONDARY_CTRL_ADDR);
// Get BLOCK COND bit
if (GET_BIT(&sec_ctrl, BLOCK_COND))
RESET_BIT(&sec_ctrl, BLOCK_COND); // Reset/clear bit
// Write to memory-mapped register
REG_WRITE(DMA2_SECONDARY_CTRL_ADDR, sec_ctrl);
DMA_GADDR_B = (unsigned int) current_frame;
// Performs signal processing on current block
if(frame_counter > 10){ //skip the first 10 frames, to skip trancient
sync_frame();
}else{
frame_counter++;
}
//switch frame
if(current_frame == frame1){
current_frame = frame2;
}else{
current_frame = frame1;
}
}
//detects energy, converts the data to float, and performs sync
void sync_frame(void){
static int iterator;
if(energy_detected == FALSE){ // if the energy threshold hasn't been reached before
for(iterator=0; iterator<SAMPLE_BUFFER_LENGTH;){ //try to find the energy in this frame
if(detect_energy(current_frame+iterator) == TRUE){ //if energy found in subframe
energy_detected = TRUE; //energy detected
if(iterator == 0){ //first sub-frame
fill_sync_buffer(backup_guard, 16); //fill buffer with backup data
fill_sync_buffer(current_frame,NR_OF_COMPLEX_SAMPLES);
}else{
fill_sync_buffer(current_frame+iterator-32, NR_OF_COMPLEX_SAMPLES-iterator/2+16);
}
break; //stop searching
}else{ //else
iterator += ENERGY_DETECTION_LENGTH*2; //jump one subframe
if(iterator == SAMPLE_BUFFER_LENGTH){ //last sub frame
memcpy(backup_guard,(const void *)(current_frame+iterator-32),ENERGY_DETECTION_LENGTH*sizeof(short)); //backup possible guard-bits
}
}
}
}else{ //energy found
fill_sync_buffer(current_frame,NR_OF_COMPLEX_SAMPLES); //convert and copy indata to sync_frame
}
}
int detect_energy(volatile short *frame_seq){
int i;
int energy;
#pragma MUST_ITERATE(ENERGY_DETECTION_LENGTH,ENERGY_DETECTION_LENGTH);
for(i=0, energy=0; i<ENERGY_DETECTION_LENGTH; i++){ //calculate energy
energy += frame_seq[i*2]*frame_seq[i*2]; //just use right channel
}
if(energy >= ENERGY_THRESHOLD){ //energy detected
return TRUE;
}else{
return FALSE;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -