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

📄 ofdm_bench.c.bak

📁 ofdm的完整系统模型,包含信道参数,多径模型,doppler频移等都可以自由修改!是您做仿真的有力帮助.c语言运行速度快!
💻 BAK
字号:
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <ctype.h>
#include <string.h>

#include "cgs.h"
#include "ofdm_system.h"

Ovector			Data_Buff;
//RayParams		ray_params_1[12];
RayParams		ray_params_1;
GauParams		gauss_params_1;
FreqParams		freq_params_1;
double			Noise_Sigma;
double			Ch_Norm_Factor;

void main( )
{
	int i, j, loop_idx, frm_num, blk_num;
	static long rand_bitseed = 100;
	
	float tmp_real, tmp_imag;
	FILE *fp_true;

	static Complex ofdm_buffer_tx[SUBCARRIERS+CP_LENGTH];
	static Complex ofdm_buffer_rx[SUBCARRIERS+CP_LENGTH];
	
	static Complex pilot_buf1[1024][PILOT_LENGTH];			// noise free
	static Complex pilot_buf2[1024][PILOT_LENGTH];			// LS 
	static Complex pilot_buf3[1024][PILOT_LENGTH];			// MST
	static Complex pilot_buf4[1024][PILOT_LENGTH];			// FILT_STP1
	static Complex pilot_buf5[1024][PILOT_LENGTH];			// FILT_STP2

	static Complex pilot_poly_buf2[1024][PILOT_LENGTH];			// LS 
	static Complex pilot_poly_buf3[1024][PILOT_LENGTH];			// MST
	static Complex pilot_poly_buf4[1024][PILOT_LENGTH];			// poly_step1
	static Complex pilot_poly_buf5[1024][PILOT_LENGTH];			// poly_step2

	static Complex data_buf1[1024][DATA_SUBC_LEN];			// original data
	static Complex data_buf2[1024][DATA_SUBC_LEN];			// with noise

	int	snr_idx;
	double SN_Ratio;
		double	mse_sym_2[1024];	double	mse_sym_3[1024];
	double	mse_sym_4[1024];	double	mse_sym_5[1024];	double	mse_blk_2[300];	double	mse_blk_3[300];	double	mse_blk_4[300];	double	mse_blk_5[300];	double	mse_2[30];	double	mse_3[30];	double	mse_4[30];	double	mse_5[30];		double	ber_sym_1[1024];	double	ber_sym_2[1024];	double	ber_sym_3[1024];	double	ber_sym_4[1024];	double	ber_sym_5[1024];	double	ber_blk_1[300];	double	ber_blk_2[300];	double	ber_blk_3[300];	double	ber_blk_4[300];	double	ber_blk_5[300];		double	ber_1[30];	double	ber_2[30];	double	ber_3[30];	double	ber_4[30];	double	ber_5[30];
	
	initial_matrix(1024,PILOT_LENGTH,pilot_poly_buf2[0]);
	initial_matrix(1024,PILOT_LENGTH,pilot_poly_buf3[0]);
	initial_matrix(1024,PILOT_LENGTH,pilot_poly_buf4[0]);
	initial_matrix(1024,PILOT_LENGTH,pilot_poly_buf5[0]);
//	write_file(target2_file, pilot_poly_buf5[0], 1024, PILOT_LENGTH);
	// [0 : 5 : 30] dB
	for (snr_idx = 0; snr_idx < 1; snr_idx++) {	
		
		/* initial SNR */
		SN_Ratio = SNR_INI + snr_idx * 5.0;
		SN_Ratio = 100;
		/* initial channel */
		initial_sel(&ray_params_1);
		initial_gauss(&gauss_params_1, CHANNEL_DELAY, SIGNAL_POWER, SN_Ratio);
		
		blk_num = 1;
		fp_true = fopen(LOG_TAP_TRUE, "r");
	
		for (loop_idx = 0; loop_idx < blk_num; loop_idx++) {
			printf("fd=%dHz, SNR=%gdB, loop(%d): %d\n", CH_DOPPLER_FREQ, SN_Ratio, blk_num, loop_idx);
	
			for (frm_num = 0; frm_num < 1024; frm_num++) {
	
				ofdm_pakgen(&rand_bitseed, ofdm_buffer_tx, data_buf1[frm_num]);
	
				for (i = 0; i < SUBCARRIERS+CP_LENGTH; i++) {
					ofdm_buffer_rx[i] = rayleigh_sel(ofdm_buffer_tx[i], &ray_params_1);
					ofdm_buffer_rx[i] = awgn_channel(ofdm_buffer_rx[i], &gauss_params_1);
				}
				ofdm_depak(ofdm_buffer_rx, data_buf2[frm_num], pilot_buf2[frm_num]);
			}
			
			/* convert to delay spread domain */
			for (frm_num = 0; frm_num < 1024; frm_num++) {
				freq2tau(pilot_buf2[frm_num]);
			}
//	
//			/* MST channel estimation */
//			for (frm_num = 0; frm_num < 1024; frm_num++) {
//				channel_mst(pilot_buf2[frm_num], pilot_buf3[frm_num]);
//			}
//	
//			/* FILT channel estimation */
//	//		channel_filt(pilot_buf2[0], pilot_buf4[0], pilot_buf5[0], 2.25);
//			
			/* channel transmission */
			channel_trans(pilot_buf2[0], pilot_poly_buf2[0]);
	
			/*new MST channel estimation*/
			for (frm_num = 0; frm_num < 1024; frm_num++) {
				channel_mst(pilot_poly_buf2[frm_num], pilot_poly_buf3[frm_num]);
			}
	
			/*function : MST + polynomial algorithm*/
			channel_poly(pilot_buf2[0], pilot_poly_buf4[0], pilot_poly_buf5[0]);
			/* read channel infor from file */
			for (i = 0; i < 1024; i++) {
				for (j = 0; j < PILOT_LENGTH; j++) {
					fscanf(fp_true, "%f,%f\n", &tmp_real, &tmp_imag);
					pilot_buf1[i][j].real = tmp_real;
					pilot_buf1[i][j].imag = tmp_imag;
				}
			}
			
			/* caculate mse */
			for (i = 0; i < 1024; i++) {
				mse_caculate(pilot_buf1[i], pilot_poly_buf2[i], mse_sym_2, i);
				mse_caculate(pilot_buf1[i], pilot_poly_buf3[i], mse_sym_3, i);
				mse_caculate(pilot_buf1[i], pilot_poly_buf4[i], mse_sym_4, i);
				mse_caculate(pilot_buf1[i], pilot_poly_buf5[i], mse_sym_5, i);
			}
			
			/* frequency interpolate, demodulate & ber count */
			for (frm_num = 0; frm_num < 1024; frm_num++) {
				chn_equalize(pilot_buf1[frm_num], data_buf1[frm_num], data_buf2[frm_num], ber_sym_1, frm_num);
				chn_equalize(pilot_poly_buf2[frm_num], data_buf1[frm_num], data_buf2[frm_num], ber_sym_2, frm_num);
				chn_equalize(pilot_poly_buf3[frm_num], data_buf1[frm_num], data_buf2[frm_num], ber_sym_3, frm_num);
				chn_equalize(pilot_poly_buf4[frm_num], data_buf1[frm_num], data_buf2[frm_num], ber_sym_4, frm_num);
				chn_equalize(pilot_poly_buf5[frm_num], data_buf1[frm_num], data_buf2[frm_num], ber_sym_5, frm_num);
			}			average_func(mse_sym_2, mse_blk_2, 1024, loop_idx);			average_func(mse_sym_3, mse_blk_3, 1024, loop_idx);			average_func(mse_sym_4, mse_blk_4, 1024, loop_idx);			average_func(mse_sym_5, mse_blk_5, 1024, loop_idx);						average_func(ber_sym_1, ber_blk_1, 1024, loop_idx);			average_func(ber_sym_2, ber_blk_2, 1024, loop_idx);			average_func(ber_sym_3, ber_blk_3, 1024, loop_idx);			average_func(ber_sym_4, ber_blk_4, 1024, loop_idx);			average_func(ber_sym_5, ber_blk_5, 1024, loop_idx);	
		}		average_func(mse_blk_2, mse_2, blk_num, snr_idx);		average_func(mse_blk_3, mse_3, blk_num, snr_idx);		average_func(mse_blk_4, mse_4, blk_num, snr_idx);		average_func(mse_blk_5, mse_5, blk_num, snr_idx);				average_func(ber_blk_1, ber_1, blk_num, snr_idx);		average_func(ber_blk_2, ber_2, blk_num, snr_idx);		average_func(ber_blk_3, ber_3, blk_num, snr_idx);		average_func(ber_blk_4, ber_4, blk_num, snr_idx);		average_func(ber_blk_5, ber_5, blk_num, snr_idx);
		fclose(fp_true);
		write_file(target1_file, pilot_buf1[0], 1024, PILOT_LENGTH);
		write_file(target2_file, pilot_poly_buf5[0], 1024, PILOT_LENGTH);
		/* free the channel */
		free_rayleigh_sel(&ray_params_1);
		free_gauss(&gauss_params_1);
	}
	write_file_double(LOG_POLY_MSE_LS, mse_sym_2, 1, 30);
	write_file_double(LOG_POLY_MSE_MST, mse_sym_3, 1, 30);
	write_file_double(LOG_POLY_MSE_STP1, mse_sym_4, 1, 30);
	write_file_double(LOG_POLY_MSE_STP2, mse_sym_5, 1, 30);

	write_file_double(LOG_POLY_BER_IDEAL, ber_1, 1, 30);
	write_file_double(LOG_POLY_BER_LS, ber_2, 1, 30);
	write_file_double(LOG_POLY_BER_MST, ber_3, 1, 30);
	write_file_double(LOG_POLY_BER_STP1, ber_4, 1, 30);
	write_file_double(LOG_POLY_BER_STP2, ber_5, 1, 30);
}

⌨️ 快捷键说明

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