?? cmobile.cpp
字號:
//////////////////////////////////////////////////////////////////////////
// for Evaluation Project //
// Mobile User Team //
// BUPT Radio Research Center //
//////////////////////////////////////////////////////////////////////////
// //
// CMobile.CPP //
// //
//////////////////////////////////////////////////////////////////////////
// //
// 移動臺基類CMobile的成員函數的聲明 //
// //
// //
// Ref. documents: //
// "1xEV-DV仿真程序類的初步定義" //
// //
// Written by: CAI Qi-ming, ZHANG Ding-ye, //
// DOU Zhong-zhao, ZHANG Xin //
// Rev. date: 20010320 (yyyymmdd) //
// //
// What's NEW: //
// 20010319, include文件"header1.h"變為"systemsim.h",因為文件名 //
// 的可讀性原因. by ZhangXin. //
// 20020409
// 1 MobileInitialization()增加一個入口參數,放在參數列表 //
// 最后一位,代表信道類型。
// 2 MobileInitialization()中每個扇區放入規定數量的話音移
// 動臺和數據移動臺
//////////////////////////////////////////////////////////////////////////
#include "CMobile.h"
#include "iostream.h"
#include "Newran.h"
#include "sys_random.h"
#include "CMsManager.h"
//#include "fstream.h"
//#include "iomanip.h"
//////////////////////////////////////////////////////////////////////////
// 初始化函數 //
// 參數有:ID,MsManager和ServiceArea的指針,運動速度,信道類型。 //
// 同時,調用其它函數,完成其它變量的初始化。 //
//////////////////////////////////////////////////////////////////////////
void CMobile::MobileInitialization(
int i_inputMsID,
CMsManager* p_inputCMsManager,
CServiceArea* p_inputCServiceArea,
float f_inputMsVelocity,
int i_inputChannelType,
float f_inputStdSlowFading,
int i_inputTrafficType)
{
bool bFlag=false; //越界標記
m_iMsID=i_inputMsID; //對MS的ID進行初始化
m_pMsManager=p_inputCMsManager; //MsManager指針初始化
m_pServiceArea=p_inputCServiceArea; //ServiceArea指針初始化
//...... modified by cqm, Apr.9 ......//
m_iSlotCount=1; //Slot記數器,設為1是因為VoiceProcess()從slot 1開始運行的
//....................................//
m_fStdSlowFading=f_inputStdSlowFading;//慢衰標準差
m_nChannelType=i_inputChannelType;
m_fMsVelocity=f_inputMsVelocity;
while (!bFlag)
{
LocationGenerator(); //對MS的位置坐標進行初始化
LocationSector(); //對MS的歸屬扇區標號進行初始化
if ((m_stLocationSector.stCellID.m==3)&&
(m_stLocationSector.stCellID.n==3))
{
//......modified by cqm, Apr.9 .......//
switch(i_inputTrafficType)
{
//如果在(3,3)小區
case Voice : switch(m_stLocationSector.s)//產生話音用戶
{
case 1: //m_pMsManager->m_iVoiceNumGenerated[0]++;//記錄生成的話音用戶數
if(m_pMsManager->m_iVoiceNumGenerated[0]<m_pMsManager->m_iVoiceNumPerSector)//如果話音用戶數目沒有超標
{
m_pMsManager->m_iVoiceNumGenerated[0]++;//記錄生成的話音用戶數
bFlag=true; //該用戶有效,標志位置為真
(m_pServiceArea->GetSector(m_stLocationSector)->m_iNumOfSector)++;//該扇區總用戶數加一
}
break;//中斷循環
case 2: //m_pMsManager->m_iVoiceNumGenerated[1]++;//記錄生成的話音用戶數
if(m_pMsManager->m_iVoiceNumGenerated[1]<m_pMsManager->m_iVoiceNumPerSector)//如果話音用戶數目沒有超標
{
m_pMsManager->m_iVoiceNumGenerated[1]++;//記錄生成的話音用戶數
bFlag=true; //該用戶有效,標志位置為真
(m_pServiceArea->GetSector(m_stLocationSector)->m_iNumOfSector)++;//該扇區總用戶數加一
}
break;//中斷循環
case 3: //m_pMsManager->m_iVoiceNumGenerated[2]++;//記錄生成的話音用戶數
if(m_pMsManager->m_iVoiceNumGenerated[2]<m_pMsManager->m_iVoiceNumPerSector)//如果話音用戶數目沒有超標
{
m_pMsManager->m_iVoiceNumGenerated[2]++;//記錄生成的話音用戶數
bFlag=true; //該用戶有效,標志位置為真
(m_pServiceArea->GetSector(m_stLocationSector)->m_iNumOfSector)++;//該扇區總用戶數加一
}
break;//中斷循環
default:
break;
}
break;
case Data : switch(m_stLocationSector.s)//產生數據用戶
{
case 1: m_pMsManager->m_iDataNumGenerated[0]++;//記錄生成的數據用戶數
if(m_pMsManager->m_iDataNumGenerated[0]<=m_pMsManager->m_iDataNumPerSector)//如果數據用戶數目沒有超標
{
bFlag=true; //該用戶有效,標志位置為真
(m_pServiceArea->GetSector(m_stLocationSector)->m_iNumOfSector)++;//該扇區總用戶數加一
}
break;//中斷循環
case 2: m_pMsManager->m_iDataNumGenerated[1]++;//記錄生成的數據用戶數
if(m_pMsManager->m_iDataNumGenerated[1]<=m_pMsManager->m_iDataNumPerSector)//如果數據用戶數目沒有超標
{
bFlag=true; //該用戶有效,標志位置為真
(m_pServiceArea->GetSector(m_stLocationSector)->m_iNumOfSector)++;//該扇區總用戶數加一
}
break;//中斷循環
case 3: m_pMsManager->m_iDataNumGenerated[2]++;//記錄生成的數據用戶數
if(m_pMsManager->m_iDataNumGenerated[2]<=m_pMsManager->m_iDataNumPerSector)//如果數據用戶數目沒有超標
{
bFlag=true; //該用戶有效,標志位置為真
(m_pServiceArea->GetSector(m_stLocationSector)->m_iNumOfSector)++;//該扇區總用戶數加一
}
break;//中斷循環
default:
break;
}
break;
}
}
}
InitChannelModel(f_inputStdSlowFading,i_inputChannelType); //對MS的信道模型數據進行初始化
InitNeighborSet(); //根據MS的歸屬扇區對相鄰扇區數組成員數據進行初始化
InitCadidateSet(); //根據MS的歸屬扇區以及相鄰扇區數據對候選扇區數組進行初始化
}
//end of MobileInitialization()
//////////////////////////////////////////////////////////////////////////
// 坐標生成函數 //
// 隨機產生移動臺的坐標 //
//////////////////////////////////////////////////////////////////////////
void CMobile::LocationGenerator()
{
#ifdef UNIFORMITY
m_stMsLocation.x
=xUniform((float)sqrt(3)*m_pServiceArea->GetSiteDistance(),(float)(5*m_pServiceArea->GetSiteDistance()
/sqrt(3))); //產生的移動臺的坐標服從均勻分布(只針對(3.3)的小區)
m_stMsLocation.y
=xUniform((float)2*m_pServiceArea->GetSiteDistance(),(float)(3*m_pServiceArea->GetSiteDistance()));
#endif
//..............................Modified By hj, July,11,2003 ...............................//
//移動臺撒在以BS為中心的圓上(只針對(3.3)的小區)
#ifdef R1
float m_stMsRadius=(float)0.9*m_pServiceArea->GetSiteDistance()/2; //半徑R定義為小區間距的一半,移動臺分布半徑分別為0.9R,0.5R,0.1R移動臺分布半徑
float m_stMsCentreAngle=xUniform((float)0.0,(float)2*PI); //隨機生成移動臺圓心角,圓心角在0到2PI之間均勻分布
m_stMsLocation.x=(float)(4*m_pServiceArea->GetSiteDistance()/sqrt(3)+m_stMsRadius*cos(m_stMsCentreAngle));
m_stMsLocation.y=(float)(2.5*m_pServiceArea->GetSiteDistance()+m_stMsRadius*sin(m_stMsCentreAngle));
#endif
#ifdef R2
float m_stMsRadius=(float)0.5*m_pServiceArea->GetSiteDistance()/2; //半徑R定義為小區間距的一半,移動臺分布半徑分別為0.9R,0.5R,0.1R移動臺分布半徑
float m_stMsCentreAngle=xUniform((float)0.0,(float)2*PI); //隨機生成移動臺圓心角,圓心角在0到2PI之間均勻分布
m_stMsLocation.x=(float)(4*m_pServiceArea->GetSiteDistance()/sqrt(3)+m_stMsRadius*cos(m_stMsCentreAngle));
m_stMsLocation.y=(float)(2.5*m_pServiceArea->GetSiteDistance()+m_stMsRadius*sin(m_stMsCentreAngle));
#endif
#ifdef R3
float m_stMsRadius=(float)0.1*m_pServiceArea->GetSiteDistance()/2; //半徑R定義為小區間距的一半,移動臺分布半徑分別為0.9R,0.5R,0.1R移動臺分布半徑
float m_stMsCentreAngle=xUniform((float)0.0,(float)2*PI); //隨機生成移動臺圓心角,圓心角在0到2PI之間均勻分布
m_stMsLocation.x=(float)(4*m_pServiceArea->GetSiteDistance()/sqrt(3)+m_stMsRadius*cos(m_stMsCentreAngle));
m_stMsLocation.y=(float)(2.5*m_pServiceArea->GetSiteDistance()+m_stMsRadius*sin(m_stMsCentreAngle));
#endif
//.............................................................................................//
}
//end of LocationGenerator()
//////////////////////////////////////////////////////////////////////////
// 歸屬扇區確定函數 //
// 通過調用ServiceArea中的函數獲得 //
//////////////////////////////////////////////////////////////////////////
void CMobile::LocationSector()
{
m_stLocationSector=m_pServiceArea->GetUserCell(m_stMsLocation); //調用ServiceArea的函數GetUserCell()完成歸屬扇區的初始化
}
//end of LocationSector()
//////////////////////////////////////////////////////////////////////////
// 信道模型初始化函數 //
// 調用CchannelModel的初始化函數,完成信道模型的初始化 //
//////////////////////////////////////////////////////////////////////////
void CMobile::InitChannelModel(float f_inputStdSlowFading,
int i_inputChannelType)
{ //定義必要的變量
int i,j; //循環變量
for(i=0;i<19;i++)
for(j=0;j<SectorNumber;j++)
{
m_aNeighborSector[i*SectorNumber+j].stSectorID.stCellID
=m_pServiceArea->GetCell(m_stLocationSector.stCellID)
->m_aNeighborCell[i]->m_stCellID;
//相鄰扇區集的小區標號初始化
m_aNeighborSector[i*SectorNumber+j].stSectorID.s=j+1;
//相鄰扇區集的扇區標號初始化,扇區的標號是從1到3
}
m_ChannelModel.Initialization(f_inputStdSlowFading,
i_inputChannelType,m_aNeighborSector); //信道模型初始化
}
//end of InitChannelModel()
//////////////////////////////////////////////////////////////////////////
// 相鄰扇區信息初始化函數 //
// 從歸屬小區中讀出相鄰扇區的標號,計算路徑損耗和天線增益, //
// 并通過CchannelModel獲得快衰和慢衰的初始值,計算出總路徑損耗, //
// 獲得扇區到達移動臺的干擾值。 //
//////////////////////////////////////////////////////////////////////////
void CMobile::InitNeighborSet()
{ //定義必要的變量
int i,j,k;
float fMsBsDistance; //基站和MS的距離,單位是米
float fTempPathLoss; //路徑損耗
float fMsxAngel; //MS與x軸的夾角,范圍0到2*PI
float fSectorMsAngel; //MS與扇區的夾角,范圍-PI到PI
float fTempAngel;
float fTempAntennaGain; //天線增益
CCell* pCell=NULL; //指向相鄰集中一個小區的指針
LOCATION_TYPE stNeighborCellCor; //鄰小區基站坐標
m_pFadingValuePointer=m_ChannelModel.GetFadingValues(m_iSlotCount); //獲得衰落數組(初始值)的首地址
pCell=m_pServiceArea->GetCell(m_stLocationSector.stCellID);
//獲得MS所在小區的指針
for(i=0;i<19;i++) //循環19次(相鄰a集小區的個數)
{
stNeighborCellCor=pCell->m_aNeighborCellLocation[i]; //第i個鄰小區的坐標(實際上是BS的坐標)
fMsBsDistance=(float)(sqrt(pow((m_stMsLocation.x
-stNeighborCellCor.x),2)+pow((m_stMsLocation.y
-stNeighborCellCor.y),2))); //計算BS和MS的直線距離
fTempPathLoss=-(float)(28.6+35*log10(1000*fMsBsDistance));
//計算路徑損耗,單位是dB(參考C50-20000918-011,
//"Evaluation Methods for High Speed Forward Link Packet Access,"
//September 20, 2000.)
if(fTempPathLoss>-82.6) //最小路徑損耗是-82.6dB
fTempPathLoss=(float)-82.6;
fTempPathLoss=(float)pow(10,(fTempPathLoss/10));
//轉換為倍數
fMsxAngel=(float)(atan2((m_stMsLocation.y-stNeighborCellCor.y),
(m_stMsLocation.x-stNeighborCellCor.x)));
//MS與x軸的夾角,范圍-PI到PI
if(fMsxAngel<0)
//將角度的范圍轉化到0到2*PI
fMsxAngel=(float)(fMsxAngel+2*PI);
for(j=0;j<SectorNumber;j++)
{
m_aNeighborSector[i*SectorNumber+j].fPathLoss=fTempPathLoss; //小區的路徑損耗值初始化
fTempAngel
=(float)(fMsxAngel-pCell->m_aSectorInCell[j].
GetSectorOrientation()*2*PI/360); //轉化為弧度來算
if(fTempAngel>=PI) //若差值大于等于PI,則換算
fSectorMsAngel=(float)(fTempAngel-2*PI);
else
if(fTempAngel<-PI) //若差值小于-PI,也換算
fSectorMsAngel=(float)(fTempAngel+2*PI);
else
fSectorMsAngel=fTempAngel;
//否則就取差值作為扇區朝向與MS的夾角
fTempAntennaGain=AntennaGain-20; //天線增益,單位dB
if(12*pow((fSectorMsAngel/(70*2*PI/360)),2)<20)
//公式參考《關于服務區環境模型的一些初步設想》
fTempAntennaGain=(float)(AntennaGain
-12*pow((fSectorMsAngel/(70*2*PI/360)),2));
fTempAntennaGain=(float)pow(10,(fTempAntennaGain/10));
//轉換為倍數
m_aNeighborSector[i*SectorNumber+j].fAntennaGain
=fTempAntennaGain; //天線增益初始化
m_aNeighborSector[i*SectorNumber+j].fSlowFading
=m_pFadingValuePointer[i].fSlowFading; //慢衰值初始化
for(k=0;k<SubslotNumber;k++)
m_aNeighborSector[i*SectorNumber+j].fFastFading[k]
=m_pFadingValuePointer[i].fFastFadingSet[j][k];
m_aNeighborSector[i*SectorNumber+j].fPropagationLoss
=m_aNeighborSector[i*SectorNumber+j].fPathLoss
*m_aNeighborSector[i*SectorNumber+j].fAntennaGain
*m_aNeighborSector[i*SectorNumber+j].fSlowFading
*(float)pow(10,(MsAntennaGain-OtherLosses)/10);
//總的損耗值
m_aNeighborSector[i*SectorNumber+j].fPowerFromTheSector
=m_pServiceArea
->GetSector(m_aNeighborSector[i*SectorNumber+j].stSectorID)
->GetTxPower()
*m_aNeighborSector[i*SectorNumber+j].fPropagationLoss
*(m_aNeighborSector[i*SectorNumber+j].fFastFading[0]
+m_aNeighborSector[i*SectorNumber+j].fFastFading[1]
+m_aNeighborSector[i*SectorNumber+j].fFastFading[2]
+m_aNeighborSector[i*SectorNumber+j].fFastFading[3])/(float)4;
//扇區到達移動臺的總功率為=發射功率*總的損耗
}
}
}
//end of InitNeighborSet()
//////////////////////////////////////////////////////////////////////////
// 候選扇區信息初始化函數 //
// 從歸屬小區讀出候選扇區的標號,確定自己的相鄰扇區在 //
// 相鄰扇區信息數組中的相對位置(數組下標),完成干擾、 //
// 功率、信噪比的初始計算,復位定時器。 //
//////////////////////////////////////////////////////////////////////////
void CMobile::InitCadidateSet()
{ //定義必要的變量
int i,j,k,m; //循環變量
float fOtherChannelPower; //其他信道的干擾值,單位:mw
float fOrthogonalFactor; //正交因子
float fFastFading; //快衰(四個子時隙的算術平均)
CCell* pMsCell=NULL; //移動臺所在小區指針
CELLID_TYPE stTempCell; //臨時小區結構體
for(i=0;i<6+SectorNumber;i++) //第i個候選扇區
{
k=0;
m_aCandidateSector[i].fInterferenceFromOtherSector=0;
//初始化從其他扇區來的干擾值
pMsCell=m_pServiceArea->GetCell(m_stLocationSector.stCellID);
//得到MS所在的小區
m_aCandidateSector[i].stSectorID.stCellID
=pMsCell->m_aCandidateSector[i]->GetParentCellID();
//將屬性中的候選扇區的標號初始化
m_aCandidateSector[i].stSectorID.s
=pMsCell->m_aCandidateSector[i]->GetSectorIndex();
for(j=0;j<19*SectorNumber;j++)
{
if((m_aCandidateSector[i].stSectorID.stCellID.m
==m_aNeighborSector[j].stSectorID.stCellID.m)
&&(m_aCandidateSector[i].stSectorID.stCellID.n
==m_aNeighborSector[j].stSectorID.stCellID.n)
&&(m_aCandidateSector[i].stSectorID.s
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -