?? 3.cpp
字號:
//////////////////////
//#define CRTDBG_MAP_ALLOC
#include <stdlib.h>
//#include <crtdbg.h>
#include <afxtempl.h>
/////////////////////
#include "math.h"
#include "time.h"
#include "conio.h"
//#include "stdlib.h"
#include "afxtempl.h"////
//#include "stdafx.h"/////////
#include "include.h"
#include "fstream.h"
#include "extreal.h"
#include "boolean.h"
#include "newran.h"
#include "myexcept.h"
#define targetFER 0.14
#define downstep 0.01
#define downstep_small 0.01
#define Threshold1 -14
#define Threshold2 -9
#define Threshold3 -6
#define Threshold4 -3
#define TTILENGTH 30000
#define SIMTTILENGTH 30000
#define fGeometrydB -3
#define EctoIorindB 0 //100%功率
#define InitTTI 10000 //初始化時間為6000幀
#define IntervalNum 20
#define MaxTranNum 1
#define ISPREDICT true //表示當前是否采用預測算法
#define mu 0.02
#define orders 50
#define prestep 2 //意義上等同于時延,延時以幀為單位
double receivedCtoI[4][50],FER[4][50];
double fastfading[SIMTTILENGTH];
double predictfading[SIMTTILENGTH];
int MCS;
double T[4][SIMTTILENGTH];
double xUniform(double down,double up)
{
Uniform y;
double rn,fact;
fact=up-down;
rn=y.Next()*fact-down;
return rn;
}
void Initialization()
{
//讀取C/I和FER的值
CStdioFile f1; //定義一個I/O文件對象
double x;
int i, j;
char *q;
/* 打開數據文件準備讀*/
if( !f1.Open( "snr-per-3km.txt",
CFile::modeRead ) )
{
#ifdef _DEBUG
afxDump<<"Unable to open file"<<"\n"; //異常處理
#endif
}
char buf[100]; //定義一個數據緩沖區,用于存放一行字符串
for(i=0;i<4;i++)
for( j=0; j<45; j++)
{
f1.ReadString( buf, 100 );
x = strtod( buf, &q ); //C/I 有待和地理因子的換算
receivedCtoI[i][j] = (float)x;
strcpy( buf, q );
x=strtod( buf, &q ); //FER
FER[i][j] = (float)x;
}
f1.Close();
//讀取快衰值
double temp[12];
double *tempfading = new double[TTILENGTH];
ifstream infile("3KM.txt");
if(!infile)
{
cerr<<"unable"<<endl;
}
for(i=0;i<TTILENGTH;i++)
{
for(int k=0;k<12;k++)
{
temp[j]=0;
infile>>temp[k];
tempfading[i]+=temp[k];
}
tempfading[i]/=12;
// //by cmy 鏈路級衰落要歸一化
// tempfading[i]/=sqrt(2);
}
for (i=0;i<SIMTTILENGTH;i++)
{
int iIndex = i%TTILENGTH;
fastfading[i] = tempfading[iIndex ];
}
delete [] tempfading;
}
double GetFER( double fCurMeanC2I, int iCurMCSMode)
{
int i,j;
double dC2I1,dC2I2;
double dTempFER1,dTempFER2;
for( i=0; i < 4; i++)
if( i == iCurMCSMode-1)
{
for ( j=0; j < 45; j++)
{
dTempFER2=FER[i][j];
dC2I2 = receivedCtoI[i][j];
if( receivedCtoI[i][j] > fCurMeanC2I )
break;
dC2I1 = receivedCtoI[i][j];
dTempFER1=FER[i][j];
}
if( j == 0 )
dTempFER1 = dTempFER2;
}
double x, y, x1, y1, x2, y2;
x = fCurMeanC2I;
x1 = dC2I1;
y1 = dTempFER1;
x2 = dC2I2;
y2 = dTempFER2;
if (y1<1e-4)
y1=-4;
else
y1=(float)log10(y1);
if (y2<1e-4)
y2=-4;
else
y2=(float)log10(y2);
if( x1 == x2 )
y = (y1 + y2) / 2;
else
y = ( (x2-x)*y1 + (x-x1)*y2 ) / (x2-x1);
y = (float)pow(10,y);
return y;
}
int AMC(int framenumber,double receivedCtoI,int Ack,int lastMCS,bool bIsAdjust)
{
//by cmy 這里加入了最低速率的下門限
int i;
int presenti=0;
double up,upstep_small;
bool inrange;
// inrange = false; //設置為FALSE表示當前不進行門限調整
inrange = (receivedCtoI >= T[0][framenumber-1]);
up=downstep*((1-targetFER)/targetFER);
upstep_small = downstep_small*((1-targetFER)/targetFER);
//先根據上一幀的對錯調整門限
if(framenumber!=0 )
{
if(inrange && bIsAdjust )
{
if(Ack==1)
{
if(lastMCS==1)
{
//MCS取值為1、2、3、4,數組下標從0開始
T[0][framenumber]=T[0][framenumber-1]-downstep;
T[1][framenumber]=T[1][framenumber-1];
T[2][framenumber]=T[2][framenumber-1];
T[3][framenumber]=T[3][framenumber-1];
}
else if(lastMCS==2)
{
T[0][framenumber]=T[0][framenumber-1];
T[1][framenumber]=T[1][framenumber-1]-downstep;
T[2][framenumber]=T[2][framenumber-1];
T[3][framenumber]=T[3][framenumber-1];
}
else if(lastMCS==3)
{
T[0][framenumber]=T[0][framenumber-1];
T[1][framenumber]=T[1][framenumber-1];
T[2][framenumber]=T[2][framenumber-1]-downstep;
T[3][framenumber]=T[3][framenumber-1];
}
else if(lastMCS == 4)
{
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]-downstep_small;
}
else
{
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
{
if(lastMCS==1)
{
T[0][framenumber]=T[0][framenumber-1]+up;
T[1][framenumber]=T[1][framenumber-1];
T[2][framenumber]=T[2][framenumber-1];
T[3][framenumber]=T[3][framenumber-1];
}
else if(lastMCS==2)
{
T[0][framenumber]=T[0][framenumber-1];
T[1][framenumber]=T[1][framenumber-1]+up;
T[2][framenumber]=T[2][framenumber-1];
T[3][framenumber]=T[3][framenumber-1];
}
else if(lastMCS==3)
{
T[0][framenumber]=T[0][framenumber-1];
T[1][framenumber]=T[1][framenumber-1];
T[2][framenumber]=T[2][framenumber-1]+up;
T[3][framenumber]=T[3][framenumber-1];
}
else if(lastMCS==4)
{
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]+upstep_small;
}
else
{
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
{
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];
}
}
for(i=3;i>=0;i--)
{
if(receivedCtoI>T[i][framenumber])
{
return i+1;
}
}
return 0; //在當前門限低于最低門限時,不進行傳輸
}
void predict(int order,int predictstep,double updatestep,double *input,int inputlength)
{
double weight[orders];
double *outputtemp,*inputtemp;
double error,expect,predict;
double a=0.00000001;
double temp;
outputtemp=new double [prestep];
inputtemp=new double [orders];
int i,j;
for(i=0;i<order;i++)
{
weight[i]= (double)2*i/(order*(order-1));
}
//初始化數據
// output_AR(1:order+fbdelay,1) = C2I_values(1:order+fbdelay,1);
// for i = order + fbdelay+1: order+2*fbdelay+1
// input = C2I_values(i-order-fbdelay+1:i-fbdelay);
// output(1,1) = weight*input;
// output_AR(i) = output(1,1);
for(i=0;i<order+predictstep;i++) //i表示時刻,也表示為預測數組的下標值
{
predictfading[i]=*(input+i);
}
for(i = order + predictstep;i<order+2*predictstep+1;i++)
{
for(j=0;j<order;j++)
inputtemp[j] = *(input + i - order - predictstep + 1 + j);
temp = 0;
for( j = 0;j<order;j++)
temp += inputtemp[j]*weight[j];
predictfading[i] = temp;
}
// for i = order+2*fbdelay+2:num
// input_old = C2I_values(i-2*fbdelay-order+1:i-2*fbdelay);
// expect = C2I_values(i-fbdelay);
// predict = output_AR(i-fbdelay,1);
// error = expect - predict;
// weight = weight + stepsize/(a + input_old'*input_old)*input_old'*error;
//
// input = C2I_values(i-order-fbdelay+1:i-fbdelay);
// output(1,1) = weight*input;
// output_AR(i ) = output(1,1);
for(i= order + 2*predictstep+1;i<inputlength;i++)
{
//指定輸入和預測量
for(j=0;j<order;j++)
inputtemp[j] = *(input + i -2*predictstep -order+ 1 +j);
expect = *(input + i - predictstep );
predict = predictfading[i-predictstep];
error = expect - predict;
//更新權重向量
temp = 0;
for(j=0;j<order;j++)
temp += inputtemp[j]*inputtemp[j];
for(j=0;j<order;j++)
{
weight[j] += updatestep/(a + temp)*inputtemp[j]*error;
}
//估計當前時刻的衰落值
for(j= 0; j<order; j++)
inputtemp[j] = *(input + i - order -predictstep +1 + j);
temp = 0;
for(j=0;j<order;j++)
temp += inputtemp[j]*weight[j];
predictfading[i] = temp;
}
delete [] outputtemp;
delete [] inputtemp;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -