📄 main.cpp
字号:
#include"VITERBI_hard.h"
#include"VITERBI_soft.h"
#include"AWGN.h"
#include"define.h"
#include"QPSK.h"
#include"QAM_16.h"
#include"RANDOM.h"
#include"Sefade.h"
#include"FFT.h"
#include"GI.h"
void main()
{
//----------------define the variables-------------------------
ofstream fout1("indata.txt");
ofstream fout2("outdata.txt");
ofstream fout3("ber.txt");
//----------------declare class-------------------------------
AWGN awgn;
QPSK modulation_QPSK;
QAM_16 modulation_16QAM;
RANDOM ran;
VITERBI_hard code_hard;
VITERBI_soft code_soft;
Sefade rayleigh;
FFT wfft;
GI wgi;
//-----------------Define---------------------------------------
int LoopMax=1;
int Frame_Bit=20480;
int Nmod=2;//QPSK:2,16_QAM:4
int G[rate][Ntap]={{1,0,1,1,1,0,0,0,1},{1,1,1,1,0,1,0,1,1}};
// int G[rate][Ntap]={{1,0,1,1,0,1,1,1,1},{1,1,0,1,1,0,0,1,1},{1,1,1,0,0,1,0,0,1}};
//----------------------Rayleigh fading channel define-----------
double flat=1.0;
double fd=200;//55.55;//222.2;
int n0=16;
int itnd0=1000;
int now1=6;//4;
double tstp=1.0*pow(10,-8);
int itau[6]={0,31,71,109,173,251};
double itnd1[6]={50000,100000,150000,200000,250000,300000};
double dlvl[6]={0,-1.0,-9.0,-10.0,-15.0,-20.0};
//int itau[4]={0,11,19,41};//{0,5,9,20};//{0,11,19,41};//arrival time for each multipath normalized by tstp
//double itnd1[4]={50000,100000,150000,200000};//initial value of fading counter
//double dlvl[4]={0,-9.7,-19.2,-22.8};//mean value for each multipath normalized by direct wave
//---------------------------------------------------------------
int i,ebn0,loop,sum;
double ber,awgn_attn;
int *data,*indata,*code_data,*decode_data,*demod_data;
double *mod_ich,*mod_qch,*theta,*ramp,*awgn_data;
data=new int [Frame_Bit];
indata=new int [Frame_Bit];
code_data=new int [Frame_Bit*rate];
decode_data=new int [Frame_Bit];
//mod_data=new int [Frame_Bit*rate];
demod_data=new int [Frame_Bit*rate];
mod_ich=new double [Frame_Bit*rate*(Nfft+Ngi)/Nfft/Nmod];
mod_qch=new double [Frame_Bit*rate*(Nfft+Ngi)/Nfft/Nmod];
awgn_data=new double [Frame_Bit*rate];
theta=new double [Frame_Bit*(Nfft+Ngi)/Nfft*rate/Nmod];
ramp=new double [Frame_Bit*rate*(Nfft+Ngi)/Nfft/Nmod];
awgn.InitRnd((unsigned) time(NULL));
//----------------------Start Loop------------------------------
for(ebn0=2;ebn0<3;ebn0=ebn0+1)
{
sum=0;
for(loop=0;loop<LoopMax;loop++)
{
printf(" e:%d l:%d \r",ebn0,loop);
ran.random(data,Frame_Bit);
for(i=0;i<Frame_Bit;i++)
indata[i]=data[i];
for(i=0;i<Frame_Bit;i++)
{
fout1<<indata[i]<<endl;
}
//-------------------------------soft coded ber (QPSK)----------------------------------------
code_soft.encode(G,indata,code_data,Frame_Bit);
modulation_QPSK.qpsk(code_data,mod_ich,mod_qch,Frame_Bit*rate);
// modulation_16QAM.qam(indata,mod_ich,mod_qch,Frame_Bit*rate);
// wfft.ifft(mod_ich,mod_qch,Frame_Bit*rate/Nmod/Nfft);
// wgi.insert(mod_ich,mod_qch,Frame_Bit*rate/Nmod/Nfft);
awgn.attn(mod_ich,mod_qch,ebn0,rate*1.0,Nmod,Frame_Bit*rate*(Nfft+Ngi)/Nfft/Nmod,awgn_attn);
// rayleigh.sefd(mod_ich,mod_qch,itau,dlvl,theta,n0,itnd1,now1,Frame_Bit*rate*(Nfft+Ngi)/Nfft/Nmod,tstp,fd,flat,ramp);
// for(i=0;i<now1;i++)
// itnd1[i]+=itnd0;
awgn.aw(mod_ich,mod_qch,Frame_Bit*rate*(Nfft+Ngi)/Nfft/Nmod,awgn_attn);
// wgi.remove(mod_ich,mod_qch,Frame_Bit*rate/Nmod/Nfft);
// wfft.fft(mod_ich,mod_qch,Frame_Bit*rate/Nmod/Nfft);
for(i=0;i<Frame_Bit*rate/Nmod;i++)
{
awgn_data[i*Nmod+0]=mod_ich[i];
awgn_data[i*Nmod+1]=mod_qch[i];
}
// modulation_QPSK.de_qpsk(mod_ich,mod_qch,demod_data,Frame_Bit*rate/Nmod);
// modulation_16QAM.de_qam(mod_ich,mod_qch,demod_data,Frame_Bit*rate/Nmod);
code_soft.decode(awgn_data,decode_data,G,Frame_Bit*rate,ebn0);
// for(i=0;i<Frame_Bit;i++)
// cout<<decode_data[i]<<endl;
for(i=0;i<Frame_Bit;i++)
if(decode_data[i]!=data[i])
{
cout<<i<<endl;
sum++;
}
//--------------------------------------------------------------------------------------------
//-----------------------------------coded ber(SOFT DECISION)-------------------------------------------
}
ber=sum*1.0/(Frame_Bit*LoopMax);
cout<<ber<<endl;
fout3<<ber<<endl;
}
fout1.close();
fout2.close();
fout3.close();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -