?? 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 + -