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

📄 run_receiver.c

📁 完整的OFDM系统,含Matlab仿真代码和DSP源代码下载.平台Tms320C6000.含项目说明文档.绝对高质量的源代码.
💻 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 + -