📄 3.cpp
字号:
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 + -