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

📄 3.cpp

📁 本程序用c++语言实现了wcdma系统当中的信道预测算法
💻 CPP
📖 第 1 页 / 共 2 页
字号:

void main()
{
	Uniform::Set(0.256);

	//中间参量
	int isACK;				//CRC校验是否成功
	int delayedACK;			//延时的ACK反馈
	int iDelayCounter(0);
	int aACKs[prestep+1];		//保存时延的ACK
	bool aIsTx[prestep+1];		//保存相应时刻是否进行传输
	int  aMCSs[prestep+1];		//保存时延的MCS等级
	bool bIsTxNow;				//对应当前时刻是否进行传输
	int delayedMCS;			//延时的MCS等级标志
	int framenumber;		//当前TTI编号
	int i,j,k;
	double resultFER;		//当前SNR对应的FER 
	double currentfading;	//当前衰落
	double receivedCtoI;	//当前帧传输的SNR
	double randomFER;		//random number表示的FER值
	bool   bIsAdjust;	//表示当前是否进行门限调整
	//统计量
	int ierrnumInterval[IntervalNum];			//统计间隔内错误帧数
	double FER[IntervalNum];				//在每个统计间隔内整体FER		
	double intervalMCSFER[4][IntervalNum];	//每个统计间隔内各个MCS的FER情况
	double MCSFER[4];						//统计时间内每个MCS的FER
	double MCSRatio[4];						//在当前总帧数中MCS被选上的概率		

	int MCSnumber[4];						//MCS传输的帧数
	int MCSerror[4];						//MCS传输错误的帧数
	int intervalMCSnumber[4][IntervalNum];	//统计间隔中MCS传输的帧数
	int intervalMCSerror[4][IntervalNum];	//统计间隔中MCS传输错误的帧数

	//HARQ parameter
	int TTINum;
	double C2I;
	double rCtoI;
	double C2IindB;
	int tran;       //传输次数
	bool newData;   //是否为新数据

	int SucfulTrans[4][MaxTranNum];//MCS级下传输X次传输正确的块数
    double SucfulTransRatio[4][MaxTranNum];

	int InterSucfulTrans[4][MaxTranNum][IntervalNum];//区间内MCS级下传输X次传输正确的块数
	double InterSucfulRatio[4][MaxTranNum][IntervalNum];
    

	//初始化快衰值和FER数据
	Initialization();
	//初始化参数
	MCS=1;	
	TTINum=1;
	C2I=0.0;
	C2IindB=0.0;
	tran=0;
	newData=true;
	
	//门限值初始化
	T[0][0]=Threshold1;
	T[1][0]=Threshold2;
	T[2][0]=Threshold3;
	T[3][0]=Threshold4;

	//HARQ统计量初始化
	for (i=0;i<4;i++)
	{
		for(j=0;j<MaxTranNum;j++)
		{
			for(k=0;k<IntervalNum;k++)
			{
                InterSucfulTrans[i][j][k]=0;
			    InterSucfulRatio[i][j][k]=0.0;
			}
		    SucfulTrans[i][j]=0;
		    SucfulTransRatio[i][j]=0.0;	
		}
		
	}

	//传输间隔统计量初始化
	for(i=0;i<4;i++)
	{
		for(j=0;j<IntervalNum;j++)
		{
			FER[j]=0;
			ierrnumInterval[j]=0;
			intervalMCSnumber[i][j]=0;
			intervalMCSerror[i][j]=0;
			intervalMCSFER[i][j]=0;
		}
		MCSnumber[i]=0;
		MCSFER[i]=.0;
		MCSerror[i]=0;
	}

	//循环初值
	i=0;	//初始化统计段标识,共IntervNum个统计段,从0开始
	int iTotalTxFrameNum = 0; //总的传输帧数统计,逐渐累加
	int iIntervalTxFrameNum[IntervalNum];			//统计间隔中传输帧数,实际传输中要除去没有传输的帧
	int iIntervalFrameNum = (SIMTTILENGTH - InitTTI)/IntervalNum;	
	for(int iloop =0;iloop<IntervalNum;iloop++)
	{
		iIntervalTxFrameNum[iloop] = 0 ;
	}
	
	for (iloop = 0;iloop<prestep+1;iloop++)
	{
		aACKs[i] = 0;
		aIsTx[i] = true;
		aMCSs[i] = 1;
	}
	//输出标题
	cout<<"FrameNum"<<"	TTINum"<<"	isACK"<<"	MCS"<<"	received C/I"<<"	C/I"<<"	precise FER"<<"	Threshold1"<<"	Threshold2"<<"	Threshold3"
		<<"	MCS1CurFER"<<"	MCS2CurFER"<<"	MCS3CurFER"<<"	MCS4CurFER"<<endl;

	//预测信道衰落
	if ( ISPREDICT == true)
	{
		predict(orders,prestep,mu,fastfading,SIMTTILENGTH);
	}
	
	////整体循环
	for(framenumber=prestep;framenumber<SIMTTILENGTH;framenumber++)
	{
		//判断当前帧是否正确传输
		currentfading=fastfading[framenumber];
		receivedCtoI=10*log10(currentfading*currentfading)+fGeometrydB+EctoIorindB;
        rCtoI=(double)pow(10,receivedCtoI/10);
		C2I += rCtoI;
		C2IindB=10*log10(C2I);
		resultFER=GetFER(C2IindB,MCS);
		randomFER=xUniform(0.0,1.0);
        tran++;
		//如果低于最低门限则不统计
		if( MCS!=0)
		{			
			if(resultFER<=randomFER)
			{
				isACK=1;
			    newData=true;
				if(framenumber>= InitTTI)
				{
					SucfulTrans[MCS-1][tran-1]++;
					intervalMCSnumber[MCS-1][i]++;
    				InterSucfulTrans[MCS-1][tran-1][i]++;
				}
					
				iIntervalTxFrameNum[i]++;
					 
				tran=0;
				//初始化时间之后的统计
				if( framenumber>= InitTTI)
				{
					MCSnumber[MCS-1]++;
					iTotalTxFrameNum++;
				}
			}
			else
			{
				if(tran<MaxTranNum)
				{	
					isACK=0;
			        newData=false;
				}
				else
				{
					isACK=0;
			        tran=0;
			        newData=true;
			        ierrnumInterval[i]++;
					if ( framenumber >= InitTTI	)
					{
						intervalMCSnumber[MCS-1][i]++;
				        intervalMCSerror[MCS-1][i]++;
				
						MCSerror[MCS-1]++;
					    MCSnumber[MCS-1]++;
						iTotalTxFrameNum++;
					}
					    
					iIntervalTxFrameNum[i]++;
				 }
			}	
			bIsTxNow = true;
		}
		else
		{
			tran=0;
			newData=true;
			bIsTxNow = false;
		}

		
		double receivedCtoIinDelay,delayedfading;
		for (int iloop=0;iloop<prestep;iloop++)
		{
			aACKs[iloop] = aACKs[iloop+1];
			aIsTx[iloop] = aIsTx[iloop+1];
			aMCSs[iloop] = aMCSs[iloop+1];
		}
		aACKs[prestep] = isACK;
		aIsTx[prestep] = bIsTxNow;
		aMCSs[prestep] = MCS;
		delayedACK = aACKs[0];
		bIsAdjust = aIsTx[0];
		delayedMCS = aMCSs[0];

		//确定延时后的反馈量,进行MCS选择
		if(newData==true)
		{
			//根据是否采用预测算法选择自适应调整的参量
			if (ISPREDICT == true)
			{
				receivedCtoIinDelay=10*log10(predictfading[framenumber+1]*predictfading[framenumber+1])+fGeometrydB+EctoIorindB;
				delayedfading = predictfading[framenumber];
			}
			else
			{
				receivedCtoIinDelay=10*log10(fastfading[framenumber-prestep]*fastfading[framenumber-prestep])+fGeometrydB+EctoIorindB;
				delayedfading = fastfading[framenumber-prestep];
			}

			MCS=AMC(framenumber,receivedCtoIinDelay,delayedACK,delayedMCS,bIsAdjust);	//确定下一帧的MCS
//			MCS=AMC(framenumber,receivedCtoIinDelay,isACK,MCS,true);	//确定下一帧的MCS
		    C2I=0.0;
		}
		else
		{
			if(framenumber!=0)
			{
				MCS=MCS;
		        T[0][framenumber]=T[0][framenumber-1];
			    T[1][framenumber]=T[1][framenumber-1];
			    T[2][framenumber]=T[2][framenumber-1];
			    T[3][framenumber]=T[3][framenumber-1];
			}
			else
			{
				MCS=MCS;
		        T[0][framenumber]=T[0][0];
			    T[1][framenumber]=T[1][0];
		        T[2][framenumber]=T[2][0];
			    T[3][framenumber]=T[3][0];
			}
			
		}
		

		
		//更新传输帧编号
		if(newData==true&&MCS!=0)
			TTINum++;

		//修改循环标识
		if( (framenumber >= InitTTI) && (framenumber-InitTTI +1)%(iIntervalFrameNum)==0)
		{
			FER[i]=(double)ierrnumInterval[i]/iIntervalTxFrameNum[i];
			i++;
		}
	
		//计算输出量
		for (iloop =0 ; iloop < 4; iloop ++)
		{
			if(MCSnumber[iloop] != 0)
				MCSFER[iloop] = (double)MCSerror[iloop]/(double)MCSnumber[iloop];
			else
				MCSFER[iloop] = .0;
		}
		//对于调整算法的更新
		//如果满足了FER的要求则将当前MCS等级提高试图在满足FER的情况下增加吞吐量
//		if ( MCS >0 && MCS <4 && framenumber >= InitTTI )
//		{
//			if ( MCSFER[MCS - 1 ] <targetFER && MCSFER [MCS] < targetFER)
//			{	
//				MCS +=1;
//				bIsAdjust = false;
//			}
//			else
//				bIsAdjust = true;
//		}
//		else
// 			bIsAdjust = true;

 		bIsAdjust = true;

		//输出部分
		cout<<framenumber<<"	"<<iTotalTxFrameNum<<"	"<<isACK<<"	"<<MCS<<"	"
			<<receivedCtoIinDelay<<"	"<<C2IindB<<"	"<<resultFER<<"	"
			<<T[0][framenumber]<<"	"<<T[1][framenumber]<<"	"
			<<T[2][framenumber]<<"	"<<T[3][framenumber]<<"	"
			<<MCSFER[0]<<"	"<<MCSFER[1]<<"	"<<MCSFER[2]<<"	"
			<<MCSFER[3]<<"	"<<endl;
		
// 		cout<<framenumber<<"	"
//			<<currentfading<<"	"<<receivedCtoI<<"	"
//			<<delayedfading<<"	"<<receivedCtoIinDelay<<"	"
//			<<T[0][framenumber]<<"	"<<T[1][framenumber]<<"	"
//			<<T[2][framenumber]<<"	"<<T[3][framenumber]<<endl;

	}


	
	for(j=0;j<IntervalNum;j++)
	{
		cout<<FER[j]<<endl;	
	}
	for(i=0;i<4;i++)
	{
		MCSFER[i]=(double)MCSerror[i]/MCSnumber[i];
		MCSRatio[i] = (double)MCSnumber[i]/iTotalTxFrameNum;
		cout<<MCSFER[i]<<"	";
		cout<<MCSRatio[i]<<"	";
	}

	double dRatio = (double)iTotalTxFrameNum/(SIMTTILENGTH - InitTTI);
	cout<<dRatio<<"	"<<endl;
	for(i=0;i<4;i++)
	{
		cout<<"MCS"<<(i+1)<<"  intervalFER"<<endl;
		for(j=0;j<IntervalNum;j++)
		{
			intervalMCSFER[i][j]=(double)intervalMCSerror[i][j]/intervalMCSnumber[i][j];
			cout<<intervalMCSFER[i][j]<<"	";
		}
		cout<<endl;
	}
	
	for(i=0;i<4;i++)
	{
	    for(j=0;j<MaxTranNum;j++)
		{
		   SucfulTransRatio[i][j]=(double)SucfulTrans[i][j]/MCSnumber[i];
		   cout<<SucfulTransRatio[i][j]<<"	";
		}
	    cout<<endl;
	}
	
	for(i=0;i<4;i++)
	{	
	   for(j=0;j<MaxTranNum;j++)
	   {
		   cout<<"MCS="<<(i+1)<<"	TransNum="<<(j+1)<<"  intervalRatio"<<endl;
		   for(k=0;k<IntervalNum;k++)
		   {
			  InterSucfulRatio[i][j][k]=(double)InterSucfulTrans[i][j][k]/intervalMCSnumber[i][k];
			  cout<<InterSucfulRatio[i][j][k]<<"	";
		   }
		   cout<<endl;
	   }
	}

	int aftererror(0);
	int aftertotal(0);
	double afterratio(0.0);
	for (i=0;i<4;i++)
	{
        aftererror=MCSnumber[i];
		aftertotal=MCSnumber[i];
		for(j=0;j<MaxTranNum;j++)
	   {
		   aftererror-=SucfulTrans[i][j];
           afterratio=(double)aftererror/aftertotal;
		   aftertotal-=SucfulTrans[i][j];
		   cout<<afterratio<<"	";
	   }
	   cout<<endl;	

	}
	double throughput;
	throughput=((MCSnumber[0]-MCSerror[0])*240+(MCSnumber[1]-MCSerror[1])*360+(MCSnumber[2]-MCSerror[2])*480+(MCSnumber[3]-MCSerror[3])*720)/(TTILENGTH - InitTTI);
	cout<<throughput<<endl;

}

⌨️ 快捷键说明

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