?? cvoicems.cpp
字號:
//////////////////////////////////////////////////////////////////////////
// for Evaluation Project //
// Mobile User Team //
// BUPT Radio Research Center //
//////////////////////////////////////////////////////////////////////////
// //
// CVoiceMs.CPP //
// //
//////////////////////////////////////////////////////////////////////////
// //
// 話音移動臺類CVoiceMs的成員函數(shù)的聲明 //
// //
// //
// Ref. documents: //
// "1xEV-DV仿真程序類的初步定義" //
// //
// Written by: CAI Qi-ming //
// //
// Rev. date: 20010320 (yyyymmdd) //
// //
// What's NEW: //
// //
//////////////////////////////////////////////////////////////////////////
#include "CVoiceMs.h"
#include "systemsim.h"
#include "iostream.h"
#include "sys_random.h"
#include "CMsManager.h"
//////////////////////////////////////////////////////////////////////////
// 構(gòu)造函數(shù), //
// 將各屬性賦予初始值 //
//////////////////////////////////////////////////////////////////////////
CVoiceMs::CVoiceMs()
{
}
//end of CVoiceMs()
//////////////////////////////////////////////////////////////////////////
// 析構(gòu)函數(shù) //
// 釋放內(nèi)存空間 //
//////////////////////////////////////////////////////////////////////////
CVoiceMs::~CVoiceMs()
{
Clean();
}
//end of ~CVoiceMs()
//////////////////////////////////////////////////////////////////////////
// 話音MS初始化函數(shù) //
// 初始化m_iServiceLength、m_bIsServiceActive //
// 并調(diào)用最佳扇區(qū)選擇函數(shù),計(jì)算出最佳扇區(qū), //
// 調(diào)用激活集初始化函數(shù),設(shè)定激活集 //
// 隨機(jī)初始化激活集的業(yè)務(wù)信道功率 //
//////////////////////////////////////////////////////////////////////////
void CVoiceMs::VoiceInitialization()
{
Random R;
float fRand;
fRand=R.Next();
m_fVoiceActiveFactor=m_pMsManager->m_fVoiceActiveFactor;
//話音激活因子初始化
m_iSHOMsgNum=0; //當(dāng)前軟切換消息隊(duì)列長度初始化
m_iDropTimer=0; //掉話計(jì)時(shí)器賦初值
m_iUnsatisfiedTimer=0; //不滿意計(jì)時(shí)器賦初值
// m_bIsServiceActive=true; //設(shè)置話音激活標(biāo)志為true
m_iServiceTime=(int)(xExponent(MeanCallLength)*1000/(1.25*16));
//服務(wù)時(shí)長一直不變(以幀為單位)
m_iServiceLength=480000+INITIALSLOT;//m_iServiceTime*16;
//參數(shù)為平均呼叫時(shí)長120s(用slot數(shù)表示)
m_fMeanC2I=0;
// m_iFwdFrameRate=FULL_RATE; //前向信道幀速率初始化為全速率
m_cFwdMarkovState.initRan(m_iMsID); //Markov狀態(tài)初始化(入口參數(shù)為移動臺標(biāo)號)
// m_fFwdCurrentActiveFactor=1.0; //本slot話音激活因子為1
// m_fFwdLastActiveFactor=1.0; //上一slot話音激活因子為1
if(fRand<0.2921)
{
m_fFwdCurrentActiveFactor=1.0; //本slot話音激活因子為1
m_fFwdLastActiveFactor=1.0; //上一slot話音激活因子為1
m_iFwdFrameRate=FULL_RATE;
}
else if((0.2921<=fRand)&&(fRand<0.3303))
{
m_fFwdCurrentActiveFactor=0.5; //本slot話音激活因子為0.5
m_fFwdLastActiveFactor=0.5; //上一slot話音激活因子為0.5
m_iFwdFrameRate=HALF_RATE;
}
else if((0.3303<=fRand)&&(fRand<0.4029))
{
m_fFwdCurrentActiveFactor=0.25; //本slot話音激活因子為0.25
m_fFwdLastActiveFactor=0.25; //上一slot話音激活因子為0.25
m_iFwdFrameRate=QUARTER_RATE;
}
else
{
m_fFwdCurrentActiveFactor=0.125; //本slot話音激活因子為0.125
m_fFwdLastActiveFactor=0.125; //上一slot話音激活因子為0.125
m_iFwdFrameRate=EIGHTH_RATE;
}
m_bIsSHOOut=false;
//...... added by cqm, Apr.9 .......//
m_fMeanC2IofLastFrame=0;
m_iBadFrameCounter=0;
m_bIsFrameCorrect=true;
bsFrameErrorFlagSet.set(); //初始化為幀全部正確
m_iFERIndicator=0;
m_pfC2IIndex=&(m_pMsManager->m_fC2IIndex[0]); //前向鏈路C/I指針
switch(int(m_fMsVelocity+1e-6)) //確定功控的目標(biāo)
{
case 0 :
m_fC2ITarget=-(float)17.4;
m_pfFER=&(m_pMsManager->m_fFER_0[0]); //前向鏈路FER指針
break;
case 3 :
m_fC2ITarget=-(float)16.45;
m_pfFER=&(m_pMsManager->m_fFER_3[0]);
break;
case 10 :
m_fC2ITarget=-(float)16.8;
m_pfFER=&(m_pMsManager->m_fFER_30[0]);
break;
case 30 :
m_fC2ITarget=-(float)16.8;
m_pfFER=&(m_pMsManager->m_fFER_30[0]);
break;
case 120 :
m_fC2ITarget=-(float)17.;
m_pfFER=&(m_pMsManager->m_fFER_100[0]);
break;
}
//..................................//
ObtainBestSector(); //找出最佳扇區(qū)
InitActiveSet(); //初始化激活集
ObtainC2I(); //獲得當(dāng)前時(shí)隙的C/I
}
//end of VoiceInitialization()
//////////////////////////////////////////////////////////////////////////
// 激活集初始化函數(shù) //
// 根據(jù)最佳基站的導(dǎo)頻信噪比,掃描候選集中其他扇區(qū)的導(dǎo)頻信噪比 //
// 確定激活集扇區(qū)、業(yè)務(wù)信道功率和信噪比 //
//////////////////////////////////////////////////////////////////////////
void CVoiceMs::InitActiveSet()
{ //定義必要的變量
int i,j; //循環(huán)所需變量
// int iVoiceNumInSys; //系統(tǒng)中的用戶數(shù),單位:個(gè)
int iBestSectorIndex; //激活集中最佳基站
float fOrthogonalFactor; //正交因子
float fFastFading;
// float fTempTxPower; //臨時(shí)發(fā)射功率,單位:mw
float fOtherChannelPower; //本扇區(qū)其他信道的干擾,單位:mw
float fMaxTrafficPower; //最大業(yè)務(wù)信道功率,單位:mw
float fMinTrafficPower; //業(yè)務(wù)信道功率動態(tài)范圍(最小值)
float fC2ITarget; //目標(biāo)C/I
//...... added by cqm, Apr.9 ......//
bool bFlag=false;
//.................................//
ACTIVESECTOR_TYPE* pTempActiveSector=NULL; //臨時(shí)激活扇區(qū)指針
m_iActiveSetSize=0; //激活集鏈表初值是零
//test by cqm
if(m_fBestPilotSNR<-16)
{
m_iServiceLength=16;//等效為服務(wù)到時(shí),重新初始化一個(gè)(即認(rèn)為軟切換出去了)
m_bIsSHOOut=true;
}
switch(m_iFwdFrameRate)
{
case FULL_RATE : fC2ITarget=/*m_pMsManager->*/m_fC2ITarget;
break;
case HALF_RATE : fC2ITarget=/*m_pMsManager->*/m_fC2ITarget-(float)3.0;
break;
case QUARTER_RATE : fC2ITarget=/*m_pMsManager->*/m_fC2ITarget-(float)6.0;
break;
case EIGHTH_RATE : fC2ITarget=/*m_pMsManager->*/m_fC2ITarget-(float)9.0;
break;
}
// if(m_iMsID==10)
// cout<<"wait"<<endl;
//...... added by cqm, May.22 ......//
for(i=0;i<6+SectorNumber;i++) //對候選扇區(qū)進(jìn)行循環(huán)(共九個(gè))
{
if(m_fBestPilotSNR-m_aCandidateSector[i].fPilotSNR==0)
//最佳扇區(qū)的導(dǎo)頻信噪比和當(dāng)前扇區(qū)的導(dǎo)頻信噪比之差小于門限3dB?
{
iBestSectorIndex=i;
if(m_iActiveSetSize<m_pMsManager->m_iActiveSetMaxSize)
//如果激活集未滿
{
pTempActiveSector=new ACTIVESECTOR_TYPE;
//產(chǎn)生一個(gè)新的激活集結(jié)構(gòu)體
pTempActiveSector->stSectorID=
m_aCandidateSector[i].stSectorID; //扇區(qū)標(biāo)號賦初值
pTempActiveSector->iIndexInCandidate=i;
//在候選集中的標(biāo)號賦初值
fMaxTrafficPower=
m_pMsManager->m_fMaxFractionOfTrafficPower
*m_pServiceArea->
GetSector(pTempActiveSector->stSectorID)->
GetMaxPower(); //業(yè)務(wù)信道最大發(fā)射功率
for(j=0;j<19*SectorNumber;j++)
if((m_aNeighborSector[j].stSectorID.stCellID.m
==m_aCandidateSector[i].stSectorID.stCellID.m)
&&(m_aNeighborSector[j].stSectorID.stCellID.n
==m_aCandidateSector[i].stSectorID.stCellID.n)
&&(m_aNeighborSector[j].stSectorID.s
==m_aCandidateSector[i].stSectorID.s))
//找到當(dāng)前候選扇區(qū)在相鄰集中的位置
{
fC2ITarget=
(float)pow(10,(/*m_pMsManager->*/fC2ITarget/10));
//轉(zhuǎn)化為倍數(shù)
fOrthogonalFactor=
m_pServiceArea->GetOrthogonalFactor();
fFastFading=(m_aNeighborSector[j].fFastFading[0]
+m_aNeighborSector[j].fFastFading[1]
+m_aNeighborSector[j].fFastFading[2]
+m_aNeighborSector[j].fFastFading[3])/(float)4;
fOtherChannelPower=
m_pServiceArea->
GetSector(pTempActiveSector->stSectorID)->
GetTxPower()
*m_aNeighborSector[j].fPropagationLoss*fFastFading;
pTempActiveSector->fTrafficPower=
(float)(fC2ITarget*
(m_aCandidateSector[i].fInterferenceFromOtherSector
+fOtherChannelPower*fOrthogonalFactor
+NoisePower)/(m_aNeighborSector[j].fPropagationLoss*fFastFading));
//業(yè)務(wù)信道發(fā)射功率賦初值,公式參考UpAndDown里的公式
if(pTempActiveSector->fTrafficPower>fMaxTrafficPower)
//如果算出來的功率大于功率最大值
pTempActiveSector->fTrafficPower=fMaxTrafficPower;
//則將業(yè)務(wù)信道功率賦最大值
fMinTrafficPower=
(float)(fMaxTrafficPower
/pow(10,(m_pMsManager->m_fDynamicRangeOfTrafficPower/10)));
//將dB轉(zhuǎn)化為mw
if(pTempActiveSector->fTrafficPower<fMinTrafficPower)
//如果業(yè)務(wù)信道功率小于最小值
pTempActiveSector->fTrafficPower=fMinTrafficPower;
//就將業(yè)務(wù)信道功率置為最小值
m_pServiceArea->
GetSector(m_aCandidateSector[i].stSectorID)->
VoicePowerCumulate(pTempActiveSector->fTrafficPower);
//將功率累加進(jìn)去
break; //計(jì)算完后跳出循環(huán)
}
pTempActiveSector->fTrafficC2I=/*m_pMsManager->*/10*log10(fC2ITarget);///////////
//下行業(yè)務(wù)信道C/I賦初值,單位:dB
//(等執(zhí)行UpdateActiveSet時(shí)再計(jì)算C/I)
m_ActiveSetList.AddTail(pTempActiveSector);
//將該扇區(qū)加入激活集鏈表
m_aCandidateSector[i].bIsInActive=true;
//該候選扇區(qū)是在激活集中
m_iActiveSetSize++;
//更新激活集鏈表長度
if((pTempActiveSector->stSectorID.stCellID.m!=3)||(pTempActiveSector->stSectorID.stCellID.n!=3))
bFlag=true;
}
else //如果激活集已滿
break; //結(jié)束循環(huán)
}
}
//................................//
for(i=0;i<6+SectorNumber;i++) //對候選扇區(qū)進(jìn)行循環(huán)(共九個(gè))
{
if((m_fBestPilotSNR-m_aCandidateSector[i].fPilotSNR<6)&&(iBestSectorIndex!=i)&&(m_aCandidateSector[i].fPilotSNR>-16))
//最佳扇區(qū)的導(dǎo)頻信噪比和當(dāng)前扇區(qū)的導(dǎo)頻信噪比之差小于門限3dB?
{
if(m_iActiveSetSize<m_pMsManager->m_iActiveSetMaxSize)
//如果激活集未滿
{
pTempActiveSector=new ACTIVESECTOR_TYPE;
//產(chǎn)生一個(gè)新的激活集結(jié)構(gòu)體
pTempActiveSector->stSectorID=
m_aCandidateSector[i].stSectorID; //扇區(qū)標(biāo)號賦初值
pTempActiveSector->iIndexInCandidate=i;
//在候選集中的標(biāo)號賦初值
fMaxTrafficPower=
m_pMsManager->m_fMaxFractionOfTrafficPower
*m_pServiceArea->
GetSector(pTempActiveSector->stSectorID)->
GetMaxPower(); //業(yè)務(wù)信道最大發(fā)射功率
for(j=0;j<19*SectorNumber;j++)
if((m_aNeighborSector[j].stSectorID.stCellID.m
==m_aCandidateSector[i].stSectorID.stCellID.m)
&&(m_aNeighborSector[j].stSectorID.stCellID.n
==m_aCandidateSector[i].stSectorID.stCellID.n)
&&(m_aNeighborSector[j].stSectorID.s
==m_aCandidateSector[i].stSectorID.s))
//找到當(dāng)前候選扇區(qū)在相鄰集中的位置
{
// fC2ITarget=
// (float)pow(10,(/*m_pMsManager->*/m_fC2ITarget/10));
//轉(zhuǎn)化為倍數(shù)
fOrthogonalFactor=
m_pServiceArea->GetOrthogonalFactor();
fFastFading=(m_aNeighborSector[j].fFastFading[0]
+m_aNeighborSector[j].fFastFading[1]
+m_aNeighborSector[j].fFastFading[2]
+m_aNeighborSector[j].fFastFading[3])/(float)4;
fOtherChannelPower=
m_pServiceArea->
GetSector(pTempActiveSector->stSectorID)->
GetTxPower()
*m_aNeighborSector[j].fPropagationLoss*fFastFading;
pTempActiveSector->fTrafficPower=
(float)(fC2ITarget*
(m_aCandidateSector[i].fInterferenceFromOtherSector
+fOtherChannelPower*fOrthogonalFactor
+NoisePower)/(m_aNeighborSector[j].fPropagationLoss*fFastFading));
//業(yè)務(wù)信道發(fā)射功率賦初值,公式參考UpAndDown里的公式
if(pTempActiveSector->fTrafficPower>fMaxTrafficPower)
//如果算出來的功率大于功率最大值
pTempActiveSector->fTrafficPower=fMaxTrafficPower;
//則將業(yè)務(wù)信道功率賦最大值
fMinTrafficPower=
(float)(fMaxTrafficPower
/pow(10,(m_pMsManager->m_fDynamicRangeOfTrafficPower/10)));
//將dB轉(zhuǎn)化為mw
if(pTempActiveSector->fTrafficPower<fMinTrafficPower)
//如果業(yè)務(wù)信道功率小于最小值
pTempActiveSector->fTrafficPower=fMinTrafficPower;
//就將業(yè)務(wù)信道功率置為最小值
m_pServiceArea->
GetSector(m_aCandidateSector[i].stSectorID)->
VoicePowerCumulate(pTempActiveSector->fTrafficPower);
//將功率累加進(jìn)去
break; //計(jì)算完后跳出循環(huán)
}
pTempActiveSector->fTrafficC2I=/*m_pMsManager->*/10*log10(fC2ITarget);/////////////
//下行業(yè)務(wù)信道C/I賦初值,單位:dB
//(等執(zhí)行UpdateActiveSet時(shí)再計(jì)算C/I)
m_ActiveSetList.AddTail(pTempActiveSector);
//將該扇區(qū)加入激活集鏈表
m_aCandidateSector[i].bIsInActive=true;
//該候選扇區(qū)是在激活集中
m_iActiveSetSize++;
//更新激活集鏈表長度
//...... added by cqm, Apr.9 ......//
if((pTempActiveSector->stSectorID.stCellID.m!=3)||(pTempActiveSector->stSectorID.stCellID.n!=3))
bFlag=true;
//.................................//
}
else //如果激活集已滿
break; //結(jié)束循環(huán)
}
}
//...... added by cqm, Apr.9 ......//
if((bFlag==true)&&(m_iActiveSetSize==1))//如果激活集里面只有一個(gè)扇區(qū)而且不是(3,3)扇區(qū)
{
m_iServiceLength=16;//等效為服務(wù)到時(shí),重新初始化一個(gè)(即認(rèn)為軟切換出去了)
m_bIsSHOOut=true;
}
//.................................//
// UpdateActiveSet(); //更新激活集(計(jì)算C/I)
//由于函數(shù)UpdateActiveSet()考慮了話音激活的影響,
//在這里調(diào)用會引起程序的錯(cuò)誤,而程序現(xiàn)在也引入了初始化的一段時(shí)間
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -