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

📄 3.cpp

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

//#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 + -