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

📄 cchannelmodel.cpp

📁 这是cdma2000的一个分组调度算法实例
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include "iostream.h"
#include <math.h>
#include "Newran.h"
#include "systemsim.h"
#include "CChannelModel.h"
#include "sys_random.h"

//#define FastFadingValueLength 50000
/////////for test only//
//#include "fstream.h"
//#include "iomanip.h"
//////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////查表法所用到的快衰数组////////////////////////////////////
extern float fFastFadingValue_1[SubslotNumber*FastFadingValueLength];
extern float fFastFadingValue_2[SubslotNumber*FastFadingValueLength];
extern float fFastFadingValue_3[SubslotNumber*FastFadingValueLength];
extern float fFastFadingValue_4[SubslotNumber*FastFadingValueLength];
extern float fFastFadingValue_5[SubslotNumber*FastFadingValueLength];
////////////////////////////////慢衰相关系数//////////////////////////////////////////////
void CChannelModel::CorrelationOfSlowFading()
{
	const double ddcorr=100;//不相关距离
	m_dCorrelationOfSlowFading=exp((-m_dMsSpeed)*0.5/ddcorr);//计算慢衰相关系数
	                                                         //0.5秒为两次慢衰之间的时间间隔
}

/////////////////////////衰落初始值计算(近场和远场)////////////////////////////////////
float CChannelModel::InitialValues()
{
  Normal y;
  float fFading;
  fFading=(float)pow(10.,y.Next()/10.0*m_fStdOfSlowFading);
  return fFading; 
}
/////////////////////////下一时刻衰落值(远场or近场)///////////////////////////////////
float CChannelModel::Next_Shadow_Fading(float fLastShadowFading)
{//sf为上一时刻的远场or近场的衰落值
  Normal yy;
  float fa=(float)yy.Next();//取一个与慢衰同分布的随机变量
  float fy,fFading;
  fy=(float)(log10(fLastShadowFading)*m_dCorrelationOfSlowFading*10.0/m_fStdOfSlowFading
	  +fa*sqrt(1-m_dCorrelationOfSlowFading*m_dCorrelationOfSlowFading));
  fFading=(float)pow(10.,fy/10.0*m_fStdOfSlowFading);
  return fFading;
}
//////////////下一时刻慢衰值计算(根据下一时刻的远场与近场值得到)//////////////////////
float CChannelModel::Next_Slow_fading(float fFarFading)//下一时刻慢衰值计算
{
	float fNextSlowFading_DB=(float)(log10(m_fNearFieldOfSlowFading)*10.0
		/(m_fStdOfSlowFading*sqrt(2.0))+log10(fFarFading)*10.0/(m_fStdOfSlowFading*sqrt(2.0)));
	float fNextSlowFading=(float)pow(10.,fNextSlowFading_DB/10.0*m_fStdOfSlowFading);
	return fNextSlowFading;
}


////////////////////////////////////初始化函数////////////////////////////////////////////////
void CChannelModel::Initialization(float fStdOfSlowFading,int iChannelType,NEIGHBORSECTOR_TYPE *pstNEIGHBORSECTOR_TYPE)
{   //pNT为NEIGHBORSECTOR_TYPE型数组头指针
	m_fStdOfSlowFading=fStdOfSlowFading;//慢衰标准差
	m_iChannelType=iChannelType;//信道类型
	m_dW=0.;	
	for(int i=0;i<19;i++)      //写入邻小区ID号
	{
	   m_astFadingValues[i].stCellID.m=pstNEIGHBORSECTOR_TYPE[3*i].stSectorID.stCellID.m;
       m_astFadingValues[i].stCellID.n=pstNEIGHBORSECTOR_TYPE[3*i].stSectorID.stCellID.n;
	}
	if(m_iChannelType==1) m_dMsSpeed=5.0/6.0;        //写入车速
	else if(m_iChannelType==2) m_dMsSpeed=25.0/9.0;
	else if(m_iChannelType==3) m_dMsSpeed=25.0/3.0;
	else if(m_iChannelType==4) m_dMsSpeed=100.0/3.0;
	else m_dMsSpeed=0;
	CorrelationOfSlowFading();//计算慢衰相关系数
    m_fNearFieldOfSlowFading=InitialValues();//近场初始化
	for (i=0;i<19;i++)
	{
	    float fFarFading=InitialValues();//远场初始化(设一个变量FarFading便于计算慢衰)
        m_astFadingValues[i].fSlowFarFading=fFarFading;//远场初始化
        m_astFadingValues[i].fSlowFading=Next_Slow_fading(fFarFading);//慢衰初始化
	    for(int j=0;j<3;j++)//快衰初始化
		{   
           m_iaStartime[i][j]=(int)((i+j*19)*2500+1000*xUniform());//起始时间初始化
		   for (int k=0;k<4;k++)
		   {
               if (m_iChannelType==1) m_astFadingValues[i].fFastFadingSet[j][k]=fFastFadingValue_1[(k+m_iaStartime[i][j])];        
	           else if(m_iChannelType==2) m_astFadingValues[i].fFastFadingSet[j][k]=fFastFadingValue_2[(k+m_iaStartime[i][j])];
	           else if(m_iChannelType==3) m_astFadingValues[i].fFastFadingSet[j][k]=fFastFadingValue_3[(k+m_iaStartime[i][j])];
	           else if(m_iChannelType==4) m_astFadingValues[i].fFastFadingSet[j][k]=fFastFadingValue_4[(k+m_iaStartime[i][j])];
	           else    m_astFadingValues[i].fFastFadingSet[j][k]=fFastFadingValue_5[(k+m_iaStartime[i][j])];
		   }
		}
	}
}


/////////////////////////////////获得衰落值的函数/////////////////////////////////////////		   
FADINGVALUE_TYPE *CChannelModel::GetFadingValues(int iSlotCounter)
{
   int iSlotNumber=iSlotCounter%50000;//如果iSlotCounter>=50000,则表已到尾,要回到表头
   if(iSlotCounter==1)//初始化
   {
      return m_astFadingValues;
   }
   else if(iSlotCounter!=1&&iSlotCounter%400==0)//计算下一时刻的衰落值(慢衰更新)
   {
	   float fFarFading_exchange=0.0;
	   float fNearFading_exchange=0.0;
	   fNearFading_exchange=m_fNearFieldOfSlowFading;//导出上一时刻近场值
       m_fNearFieldOfSlowFading=Next_Shadow_Fading(fNearFading_exchange);//计算、写入下一时刻近场值
	   for(int i=0;i<19;i++)
	   {
		   fFarFading_exchange=m_astFadingValues[i].fSlowFarFading;//导出上一时刻远场值
		   m_astFadingValues[i].fSlowFarFading=Next_Shadow_Fading(fFarFading_exchange);
		   //计算、写入下一时刻远场值
           m_astFadingValues[i].fSlowFading=Next_Slow_fading(m_astFadingValues[i].fSlowFarFading);
		   //计算、写入下一时刻慢衰值
		   for (int j=0;j<3;j++)//快衰初始化
		   {   
		       for (int k=0;k<4;k++)
			   {
				   if((4*iSlotNumber+k+m_iaStartime[i][j])==199999)
                      m_iaStartime[i][j]=0;
                   if (m_iChannelType==1) m_astFadingValues[i].fFastFadingSet[j][k]=fFastFadingValue_1[(4*iSlotNumber+k+m_iaStartime[i][j])];        
	               else if(m_iChannelType==2) m_astFadingValues[i].fFastFadingSet[j][k]=fFastFadingValue_2[(4*iSlotNumber+k+m_iaStartime[i][j])];
	               else if(m_iChannelType==3) m_astFadingValues[i].fFastFadingSet[j][k]=fFastFadingValue_3[(4*iSlotNumber+k+m_iaStartime[i][j])];
	               else if(m_iChannelType==4) m_astFadingValues[i].fFastFadingSet[j][k]=fFastFadingValue_4[(4*iSlotNumber+k+m_iaStartime[i][j])];
	               else    m_astFadingValues[i].fFastFadingSet[j][k]=fFastFadingValue_5[(4*iSlotNumber+k+m_iaStartime[i][j])];
			   }
		   }
	   }
	   return m_astFadingValues;
   }
   else//计算下一时刻的衰落值(慢衰保持)
   {
       for(int i=0;i<19;i++)
	   { 
		   for (int j=0;j<3;j++)//快衰初始化
		   {   
		       for (int k=0;k<4;k++)
			   {
				   if((4*iSlotNumber+k+m_iaStartime[i][j])==199999)
                      m_iaStartime[i][j]=0;
                   if (m_iChannelType==1) m_astFadingValues[i].fFastFadingSet[j][k]=fFastFadingValue_1[(4*iSlotNumber+k+m_iaStartime[i][j])];        
	               else if(m_iChannelType==2) m_astFadingValues[i].fFastFadingSet[j][k]=fFastFadingValue_2[(4*iSlotNumber+k+m_iaStartime[i][j])];
	               else if(m_iChannelType==3) m_astFadingValues[i].fFastFadingSet[j][k]=fFastFadingValue_3[(4*iSlotNumber+k+m_iaStartime[i][j])];
	               else if(m_iChannelType==4) m_astFadingValues[i].fFastFadingSet[j][k]=fFastFadingValue_4[(4*iSlotNumber+k+m_iaStartime[i][j])];
	               else    m_astFadingValues[i].fFastFadingSet[j][k]=fFastFadingValue_5[(4*iSlotNumber+k+m_iaStartime[i][j])];
			   }
		   }
	   }
	   return m_astFadingValues;
   }
}

/*///////////////////////////////获得快衰值函数//////////////////////////////////////////////
float (*(CChannelModel::GetFastFadingValPtr(int iSlotCounter)))[SubslotNumber]
{   
	if(m_iChannelType==1)
	{
       if(iSlotCounter==0)//iSlotCounter==0即快衰初始并写入数组
	   {
		 for(int i=0;i<21;i++)
		 {
			m_iaStartime[i]=rand();
			for(int t0=0;t0<4;t0++)
			{
			//	m_faFastFadingValues[i][t0]=FastFading((t0+m_iaStartime[i])/(double)3200);
                m_faFastFadingValues[i][t0]=fFastFadingValue_1[(t0+m_iaStartime[i])];
			}
		 }
	   }
	   else//非初始的快衰计算并写入数组
	   {
		 int t0=iSlotCounter;
		 for(int i=0;i<21;i++)
		 {
			for(t0=iSlotCounter;t0<4+iSlotCounter;t0++)
			{
			//	m_faFastFadingValues[i][(t0-iSlotCounter)]=FastFading((t0+m_iaStartime[i])/(double)3200);
				if ((t0+m_iaStartime[i])<99999)
                m_faFastFadingValues[i][(t0-iSlotCounter)]=fFastFadingValue_1[(t0+m_iaStartime[i])];
			}
		 }
	   }
	}
	else if(m_iChannelType==2)
	{
       if(iSlotCounter==0)//iSlotCounter==0即快衰初始并写入数组
	   {
		 for(int i=0;i<21;i++)
		 {
			m_iaStartime[i]=rand();
			for(int t0=0;t0<4;t0++)
			{
			//	m_faFastFadingValues[i][t0]=FastFading((t0+m_iaStartime[i])/(double)3200);
                m_faFastFadingValues[i][t0]=fFastFadingValue_2[(t0+m_iaStartime[i])];
			}
		 }
	   }
	   else//非初始的快衰计算并写入数组
	   {
		 int t0=iSlotCounter;
		 for(int i=0;i<21;i++)
		 {
			for(t0=iSlotCounter;t0<4+iSlotCounter;t0++)
			{
			//	m_faFastFadingValues[i][(t0-iSlotCounter)]=FastFading((t0+m_iaStartime[i])/(double)3200);
				if ((t0+m_iaStartime[i])<99999)
                m_faFastFadingValues[i][(t0-iSlotCounter)]=fFastFadingValue_2[(t0+m_iaStartime[i])];
			}
		 }
	   }
	}
	else if(m_iChannelType==3)
	{
       if(iSlotCounter==0)//iSlotCounter==0即快衰初始并写入数组
	   {
		 for(int i=0;i<21;i++)
		 {
			m_iaStartime[i]=rand();
			for(int t0=0;t0<4;t0++)
			{
			//	m_faFastFadingValues[i][t0]=FastFading((t0+m_iaStartime[i])/(double)3200);
                m_faFastFadingValues[i][t0]=fFastFadingValue_3[(t0+m_iaStartime[i])];
			}
		 }
	   }
	   else//非初始的快衰计算并写入数组
	   {
		 int t0=iSlotCounter;
		 for(int i=0;i<21;i++)
		 {
			for(t0=iSlotCounter;t0<4+iSlotCounter;t0++)
			{
			//	m_faFastFadingValues[i][(t0-iSlotCounter)]=FastFading((t0+m_iaStartime[i])/(double)3200);
				if ((t0+m_iaStartime[i])<99999)
                m_faFastFadingValues[i][(t0-iSlotCounter)]=fFastFadingValue_3[(t0+m_iaStartime[i])];
			}
		 }
	   }
	}
	else if(m_iChannelType==4)
	{
       if(iSlotCounter==0)//iSlotCounter==0即快衰初始并写入数组
	   {
		 for(int i=0;i<21;i++)
		 {
			m_iaStartime[i]=rand();
			for(int t0=0;t0<4;t0++)
			{
			//	m_faFastFadingValues[i][t0]=FastFading((t0+m_iaStartime[i])/(double)3200);
                m_faFastFadingValues[i][t0]=fFastFadingValue_4[(t0+m_iaStartime[i])];
			}
		 }
	   }
	   else//非初始的快衰计算并写入数组
	   {
		 int t0=iSlotCounter;
		 for(int i=0;i<21;i++)
		 {
			for(t0=iSlotCounter;t0<4+iSlotCounter;t0++)
			{
			//	m_faFastFadingValues[i][(t0-iSlotCounter)]=FastFading((t0+m_iaStartime[i])/(double)3200);
				if ((t0+m_iaStartime[i])<99999)
                m_faFastFadingValues[i][(t0-iSlotCounter)]=fFastFadingValue_4[(t0+m_iaStartime[i])];
			}
		 }
	   }
	}
	else
	{
       if(iSlotCounter==0)//iSlotCounter==0即快衰初始并写入数组
	   {
		 for(int i=0;i<21;i++)
		 {
			m_iaStartime[i]=rand();
			for(int t0=0;t0<4;t0++)
			{
			//	m_faFastFadingValues[i][t0]=FastFading((t0+m_iaStartime[i])/(double)3200);
                m_faFastFadingValues[i][t0]=fFastFadingValue_5[(t0+m_iaStartime[i])];
			}
		 }
	   }
	   else//非初始的快衰计算并写入数组
	   {
		 int t0=iSlotCounter;
		 for(int i=0;i<21;i++)
		 {
			for(t0=iSlotCounter;t0<4+iSlotCounter;t0++)
			{
			//	m_faFastFadingValues[i][(t0-iSlotCounter)]=FastFading((t0+m_iaStartime[i])/(double)3200);
				if ((t0+m_iaStartime[i])<99999)
                m_faFastFadingValues[i][(t0-iSlotCounter)]=fFastFadingValue_5[(t0+m_iaStartime[i])];
			}
		 }
	   }
	}
	return m_faFastFadingValues;
}*/



///////////////////////////////快衰初始及计算函数////////////////////////////////
float CChannelModel::FastFading(double dt0)
{m_iChannelType=5;
////////////////定义4个随机数组,每1/4chip用一个随机数表示///////////////////////
	int j=0;
    static float A0[1536];//A0没有延时
	for(;j<1536;j++)
		A0[j]=rand1();
    static float A1[1536];//A1比A0延1/4个chip
    A1[0]=A0[1535];
	for(j=1;j<1536;j++)
	    A1[j]=A0[j-1];
	static float A2[1536];//A2比A0延1/2个chip
	A2[0]=A1[1535];
	for(j=1;j<1536;j++)
        A2[j]=A1[j-1];
	static float A4[1536];//A4比A0延1个chip  
	A4[0]=A2[1534];
	A4[1]=A2[1535];
    for(j=2;j<1536;j++)
		A4[j]=A2[j-2];
/////////////////////////////////////////////////////////////////////////////////////
	double arfa1=0;
	double arfa2=2*PI*(2-1)/N2;   //第2径相位
	double arfa3=2*PI*(3-1)/N2;     //第3径相位
	int n;
	float C1n=0; //同相分量权值
	float C1m=0; //正交分量权值
	double Wn=0;  //同相分量频率
	double Wm=0;  //正交分量频率
	float S=0;   //1/4chip内的功率
	float S1=0;  //1/4个slot内总功率
//	float s=0;   //实际功率
	float Sc=0;  //同相分量(功率)
	float Ss=0;  //正交分量(功率)
	float Sc1=0; //幅度同相分量(信道2,3,4。用方法2)  or  同相自功率(信道1,5。用方法1)
	float Ss1=0;   //幅度正交分量(信道2,3,4。用方法2)  or  正交自功率(信道1,5。用方法1)
    float Sc11=0;  //第1径同相分量(加信号,衰减)
	float Sc12=0;    //第2径同相分量(加信号,衰减)
	float Sc13=0;  //第3径同相分量(加信号,衰减)
	float Ss11=0;     //第1径正交分量(加信号,衰减)
	float Ss12=0;   //第2径正交分量(加信号,衰减)
	float Ss13=0;  //第3径正交分量(加信号,衰减)
	float q=0;
	float qn=0;
	float qm=0;
	float Qc1=0; //第1径同相分量
	float Qc2=0; //第2径同相分量
	float Qc3=0; //第3径同相分量
	float Qs1=0;  //第1径正交分量
	float Qs2=0;   //第2径正交分量
	float Qs3=0;   //第3径正交分量
	float V=0;   //速度km/h
    float y=0;    //归一化后的功率
	float S0=0;    //用来归一化
	int z=0;
/////////////////////////信道一////////////////////////////////////////////////////
    if(m_iChannelType==1)    //Pedestrian A(jakes,单径)
	{
		V=3;//km/h
        m_dW=2.0*PI*V*Frequency/LightSpeed;
        Sc1=jakec1(dt0);
	    Sc=Sc1;
	    Ss1=jakes1(dt0);
	    Ss=Ss1;
	    S=Sc+Ss;
	    S0=1.0;
	    y=S/S0;//归一化
	}
////////////////////////////信道二//////////////////////////////////////////////////
   else if(m_iChannelType==2)//Pedestrian B(jakes,三径)
   {
	   V=10;//km/h
       m_dW=2.0*PI*V*Frequency/LightSpeed;
	    for(z=0;z<1536;z++)
		{
			for(n=1;n<N2;n++)
			{ 
			  arfa1=PI*n/(N2+1);	
		      Wn=m_dW*cos((double)n*PI/(2*N2-1));
	          C1n=2*delta*(float)sin((double)n*PI/(N2-1))/(float)sqrt((double)N2-1/2);			 
			  qn=C1n*(float)cos(Wn*(dt0+z/(1.2288e6))+arfa1);			  
			  Qc1=Qc1+qn;
			  qn=0;
			  C1m=2*delta*(float)cos((double)n*PI/(N2-1))/(float)sqrt((double)N2-1/2);
			  qm=C1m*(float)cos(Wn*(dt0+z/(1.2288e6))+arfa1);
			  Qs1=Qs1+qm;
			  qm=0;
			}
		    if(n==N2)
			{   
				arfa1=PI*n/(N2+1);
				q=delta*(float)cos(m_dW*(dt0+z/(1.2288e6))+arfa1)/(float)sqrt((double)N2-1/2);
				Qc1=Qc1+q;				
                Sc11=A0[z]*Qc1;
				Qc1=0;
				Qs1=Qs1+q;
				Ss11=A0[z]*Qs1;
				Qs1=0;
			}//第1径
			for(n=1;n<N2;n++)
			{ 
			  arfa1=PI*n/(N2+1); 
		      Wn=m_dW*cos((double)n*PI/(2*N2-1));
	          C1n=2*delta*(float)sin((double)n*PI/(N2-1))/(float)sqrt((double)N2-1/2);
			  qn=C1n*(float)cos(Wn*(dt0+z/(1.2288e6))+arfa1+arfa2);
			  Qc2=Qc2+qn;

⌨️ 快捷键说明

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