?? ofdm_bench.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 + -