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

📄 cchannelmodel.cpp

📁 此程序为wcdma系统当中ftp/video业务模型的c++程序仿真 通过此程序 能得到此两种业务在多种条件下的吞吐量和无码率的性能
💻 CPP
字号:
///////////////////////////////////////////////////////////////////
//                             WCDMA TEAM                        //
//                      BUPT Radio Research Center               //
///////////////////////////////////////////////////////////////////
//
//                        CChannelModel.cpp
//
//////////////////////////////////////////////////////////////////////
//                                                                  //
//            信道模型类CChannelModel的成员函数的声明               //
//                                                                  //
// Written by:     李晶                                             //
// Date:      200404                                                //
//                                                                  //
//////////////////////////////////////////////////////////////////////
#include "iostream.h"
#include <math.h>
#include "Newran.h"
#include "systemsim.h"
#include "CChannelModel.h"
#include "sys_random.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];
//////////////////////////////////////////////////////////////////////////
//		              构造函数                                          //
//////////////////////////////////////////////////////////////////////////
CChannelModel::CChannelModel()
{
}


//////////////////////////////////////////////////////////////////////////
//		              析构函数					                        //
//////////////////////////////////////////////////////////////////////////
CChannelModel::~CChannelModel()
{
}


/////////////////////////////////////////////////////////////////////////
//TITLE:      Next_Shadow_Fading(计算下一时刻衰落值(远场or近场)
//
//PARAMETERS:上一时刻衰落值(远场or近场)
/////////////////////////////////////////////////////////////////////////
float CChannelModel::Next_Shadow_Fading(float fLastShadowFading)
{
  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.0,fy/10.0*m_fStdOfSlowFading);
  return fFading;
}


/////////////////////////////////////////////////////////////////////////
//TITLE:      InitialValues(计算衰落初始值(远场or近场))
//
//PARAMETERS:NULL
/////////////////////////////////////////////////////////////////////////
float CChannelModel::InitialValues()
{
  Normal y;
  float fFading;
  fFading=(float)y.Next();
  fFading=(float)pow(10.0,fFading/10.0*m_fStdOfSlowFading);
  return fFading;
}



/////////////////////////////////////////////////////////////////////////
//TITLE:      CorrelationOfSlowFading(计算慢衰两点间的相关系数)
//
//PARAMETERS:NULL
/////////////////////////////////////////////////////////////////////////
void CChannelModel::CorrelationOfSlowFading()
{
	const double ddcorr=100;//不相关距离取为100米
	m_dCorrelationOfSlowFading=exp((-m_dMsSpeed)*0.5/ddcorr);//计算慢衰时间相关系数
	                                                         //0.5秒为慢衰更新的时间间隔
}



/////////////////////////////////////////////////////////////////////////
//TITLE:      Next_Slow_fading(计算下一时刻慢衰值)
//
//PARAMETERS:此时刻的慢衰远场值
/////////////////////////////////////////////////////////////////////////
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;
}



/////////////////////////////////////////////////////////////////////////
//TITLE:      Initialization(信道模型初始化函数)
//
//PARAMETERS:慢衰标准差、信道类型、监测集扇区数组首指针
/////////////////////////////////////////////////////////////////////////
void CChannelModel::Initialization(float fStdOfSlowFading,int iChannelType,MONITORSECTOR_TYPE *pstMONITORSECTOR_TYPE)
{
	float fFarFading;
	
	m_fStdOfSlowFading=fStdOfSlowFading;//慢衰标准差
	m_iChannelType=iChannelType;//信道类型

	for(int i=0;i<19;i++)      //写入邻小区ID号
	{
	    m_astFadingValues[i].stCellID.m=pstMONITORSECTOR_TYPE[3*i].stSectorID.stCellID.m;
        m_astFadingValues[i].stCellID.n=pstMONITORSECTOR_TYPE[3*i].stSectorID.stCellID.n;
	}
	
	//write the speed of the mobile(the unit is m/s)
	switch(m_iChannelType)
	{
	    case 1:    m_dMsSpeed=5.0/6.0;
			       break;
		case 2:    m_dMsSpeed=25.0/9.0;
			       break;
		case 3:    m_dMsSpeed=25.0/3.0;
			       break;
		case 4:    m_dMsSpeed=100.0/3.0;
			       break;
		default:   m_dMsSpeed=0;
			       break;
	
	}
	
	CorrelationOfSlowFading();
	//计算慢衰时间相关系数
    m_fNearFieldOfSlowFading=InitialValues();
    //近场初始化

	for (i=0;i<19;i++)
	{
	    //慢衰初始化
		fFarFading=InitialValues();//远场初始化
        m_astFadingValues[i].fSlowFarFading=fFarFading;
        m_astFadingValues[i].fSlowFading=Next_Slow_fading(fFarFading);

//modified by Li Jing,20040818
		while(m_astFadingValues[i].fSlowFading<1||m_astFadingValues[i].fSlowFading>25)
		{
			fFarFading=InitialValues();   //重新进行远场初始化
            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++)
			{
                switch(m_iChannelType)
				{
	                case 1:    m_astFadingValues[i].fFastFadingSet[j][k]=fFastFadingValue_1[(k+m_iaStartime[i][j])];
			                   break;
		            case 2:    m_astFadingValues[i].fFastFadingSet[j][k]=fFastFadingValue_2[(k+m_iaStartime[i][j])];
			                   break;
		            case 3:    m_astFadingValues[i].fFastFadingSet[j][k]=fFastFadingValue_3[(k+m_iaStartime[i][j])];
			                   break;
		            case 4:    m_astFadingValues[i].fFastFadingSet[j][k]=fFastFadingValue_4[(k+m_iaStartime[i][j])];
			                   break;
		            default:   m_astFadingValues[i].fFastFadingSet[j][k]=fFastFadingValue_5[(k+m_iaStartime[i][j])];
			                   break;
				
				}
			}
			m_iaStartime[i][j] +=4;
		}
	}
}



/////////////////////////////////////////////////////////////////////////
//TITLE:      GetFadingValues(获得衰落值指针)
//
//PARAMETERS:时隙数
/////////////////////////////////////////////////////////////////////////
FADINGVALUE_TYPE *CChannelModel::GetFadingValues(int iSlotCounter)
{
   //int iSlotNumber;
   //iSlotNumber=iSlotCounter%90000;//如果iSlotCounter>=90000,则表已到尾,要回到表头
  
   if(iSlotCounter==1)//初始化
   {
      return m_astFadingValues;
   }
   else if(iSlotCounter!=1&&iSlotCounter%750==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);
		   //计算、写入下一时刻慢衰值

//modified by Li Jing,20040818
		   while(m_astFadingValues[i].fSlowFading<1||m_astFadingValues[i].fSlowFading>25)
		   {
			   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((k+m_iaStartime[i][j])==359999)//slj 20050421
                       
					   m_iaStartime[i][j] = 0; 
				   
				   switch(m_iChannelType)
				   {
	                   case 1:    m_astFadingValues[i].fFastFadingSet[j][k]=
                                      fFastFadingValue_1[(k+m_iaStartime[i][j])];
			                      break;
		               case 2:    m_astFadingValues[i].fFastFadingSet[j][k]=
	                                  fFastFadingValue_2[(k+m_iaStartime[i][j])];
			                      break;
		               case 3:    m_astFadingValues[i].fFastFadingSet[j][k]=
	                                  fFastFadingValue_3[(k+m_iaStartime[i][j])];
			                      break;
		               case 4:    m_astFadingValues[i].fFastFadingSet[j][k]=
	                                  fFastFadingValue_4[(k+m_iaStartime[i][j])];
			                      break;
		               default:   m_astFadingValues[i].fFastFadingSet[j][k]=
	                                  fFastFadingValue_5[(k+m_iaStartime[i][j])];
			                      break;
				   } 
				   
			   }
			   m_iaStartime[i][j] +=4;
		   }
	   }
	   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((k+m_iaStartime[i][j])==359999)  //slj 20050421
					  m_iaStartime[i][j] = 0; 
				   
				   switch(m_iChannelType)
				   {
	                   case 1:    m_astFadingValues[i].fFastFadingSet[j][k]=
                                      fFastFadingValue_1[(k+m_iaStartime[i][j])];
			                      break;
		               case 2:    m_astFadingValues[i].fFastFadingSet[j][k]=
	                                  fFastFadingValue_2[(k+m_iaStartime[i][j])];
			                      break;
		               case 3:    m_astFadingValues[i].fFastFadingSet[j][k]=
	                                  fFastFadingValue_3[(k+m_iaStartime[i][j])];
			                      break;
		               case 4:    m_astFadingValues[i].fFastFadingSet[j][k]=
	                                  fFastFadingValue_4[(k+m_iaStartime[i][j])];
			                      break;
		               default:   m_astFadingValues[i].fFastFadingSet[j][k]=
	                                  fFastFadingValue_5[(k+m_iaStartime[i][j])];
			                      break;
	
				   }
				   
			   }
			   m_iaStartime[i][j]+=4;
		   }
	   }
	   return m_astFadingValues;
   }
}
//end of the file CChannelModel.CPP

⌨️ 快捷键说明

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