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

📄 main.cpp

📁 有关卷积编码的维特比算法,是硬判决的啊,希望大家
💻 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 + -