📄 cchannelmodel.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 + -