📄 cmobile.cpp
字号:
// 初始化激活集时,移动台与最佳扇区进行接纳控制,或者软切换时的接纳控制,
// 如果接纳成功,基站就会给移动台分配功率。这时就要将分配的功率累加到
// 扇区的话音功率或是DCH功率中去。这是由于优先权顺序是:话音用户>DCH
// 用户>DSCH用户。所以实现时就要首先考虑话音用户,并累加话音用户的功率,
// 将剩余的功率分给分组用户;再考虑DCH用户,并累加DCH用户的功率,再将
// 剩下的功率分给DSCH用户;最后基站根据可以使用的DSCH功率(即上面使用
// 剩下的功率),进行调度。需要注意的是:
//
// 对于InitActiveSet(),ObtainC2I()这两个函数,DSCH状态的移动台都不需要调用。
// 所以在DataInitialization()中,应该先判断用户类型,若是DSCH用户,就不执行
// 这两个函数。
//
//////////////////////////////////////////////////////////////////////////
void CMobile::InitActiveSet()
{
CSector* pSector=NULL; //指向Sector对象的指针
bool admitted; //是否接纳的标志
float fOrthogonalFactor; //正交因子
float fFastFading; //快衰值
float fOtherChannelPower; //本扇区其他信道的干扰,单位:mw
float fOtherSectorInterference; //从别的扇区来的干扰
float fTempTrafficPower; //移动台要求基站的发射功率
float fMaxTrafficPower; //最大业务信道功率,单位:mw
float fMinTrafficPower; //业务信道功率动态范围(最小值)
float fC2ITarget; //目标C/I
ACTIVESECTOR_TYPE* pTempActiveSector=NULL;//临时激活扇区指针
m_iActiveSetSize=0; //激活集链表初始大小置零
if(m_fBestPilotSNR<PILOTSNRTHRESHOLD)
{
m_bIsAdmitted=false;
}
else
{
fC2ITarget=m_fC2ITarget;
fC2ITarget=(float)(pow(10,(fC2ITarget/10)));
//转化为倍数
fOrthogonalFactor=m_pServiceArea->GetOrthogonalFactor();
fFastFading=(m_aMonitorSector[m_iBestSectorIndex].fFastFading[0]
+m_aMonitorSector[m_iBestSectorIndex].fFastFading[1]
+m_aMonitorSector[m_iBestSectorIndex].fFastFading[2]
+m_aMonitorSector[m_iBestSectorIndex].fFastFading[3])/(float)4;
fOtherChannelPower=m_pServiceArea->GetSector(m_stBestSector)->
GetTxPower()*m_aMonitorSector[m_iBestSectorIndex].fPropagationLoss*fFastFading;
fOtherSectorInterference=m_aMonitorSector[m_iBestSectorIndex].fInterferenceFromOtherSector;
fTempTrafficPower=(float)(fC2ITarget*
(fOtherSectorInterference
+fOtherChannelPower*fOrthogonalFactor+NoisePower)
/(m_aMonitorSector[m_iBestSectorIndex].fPropagationLoss*fFastFading));
//业务信道功率赋初值
// if(m_eUsertype==voice)
// {
fMaxTrafficPower=m_pMsManager->m_fMaxFractionOfTrafficPower
*m_pServiceArea->GetSector(m_stBestSector)->
GetMaxPower();
//计算业务信道最大功率(为最大发射功率乘以最大业务信道所占的最大比例)
fMinTrafficPower=(float)(fMaxTrafficPower
/pow(10,(m_pMsManager->m_fDynamicRangeOfTrafficPower/10)));
// }
// else
// {
// fMaxTrafficPower = m_pServiceArea->GetSector(m_stBestSector)->GetMaxPacketPower();
// fMinTrafficPower=(float)(fMaxTrafficPower
// /pow(10,(m_pMsManager->m_fDynamicRangeOfPacketPower/10)));
// }
if(fTempTrafficPower>fMaxTrafficPower) //如果算出来的功率大于功率最大值
fTempTrafficPower=fMaxTrafficPower;//则将业务信道功率赋最大值
if(fTempTrafficPower<fMinTrafficPower) //如果业务信道功率小于动态范围
fTempTrafficPower=fMinTrafficPower;//就将业务信道功率置为最小值(动态范围)
pSector=m_pServiceArea->GetSector(m_stBestSector);
//得到最佳扇区的指针
admitted=pSector->AdmissionControl(m_pMsManager->m_iSlotCurrentNum,fTempTrafficPower);
//移动台与最佳扇区进行接纳尝试
if(admitted)
{
m_bIsAdmitted=true;
//是否接纳成功的标识置为true
pTempActiveSector=new ACTIVESECTOR_TYPE;
//开始将最佳扇区放入移动台的激活集
pTempActiveSector->fTrafficPower=fTempTrafficPower;
//激活扇区业务信道功率赋初值
//add the new allocated transmitted power to the best sector
if(m_eUsertype==voice)
{
pSector->
VoicePowerCumulate(pTempActiveSector->fTrafficPower);
//将功率累加到话音功率中去
}
else
{
pSector->
DCHPowerCumulate(pTempActiveSector->fTrafficPower);
//将功率累加到DCH功率中去
}
//update the total power of the best sector
pSector->TxPowerUpdate();
pTempActiveSector->fTrafficC2I=(float)(10*log10(fC2ITarget));
//激活扇区业务信道C/I先置为目标值,等执行UpdateActiveSet时再计算C/I
pTempActiveSector->iIndexInMonitor=m_iBestSectorIndex;
//激活扇区在监测集数组中的下标赋初值
pTempActiveSector->stSectorID=m_stBestSector;
//激活扇区的扇区标号赋初值
m_ActiveSetList.AddTail(pTempActiveSector);
//将生成的激活扇区加入激活集
m_aMonitorSector[m_iBestSectorIndex].bIsInActive=true;
//该监测扇区是在激活集中
m_iActiveSetSize++;
//更新激活集链表长度
}
else
m_bIsAdmitted=false;
//是否接纳成功的标识置为false
}
}
//////////////////////////////////////////////////////////////////////////
//TITLE: UpdateMonitorSet(监测集信息更新函数)
//
//PARAMETERS:NULL
//
//PURPOSE AND ALGORITHMS:
// 更新监测集数组中各项的慢衰、总损耗和接收功率值。
// 完成各项的干扰、功率与信噪比值的更新。
// 与初始化监测集时相类似,更新监测集时整个函数也主要是两次多重循环:
// 第一次循环,更新每一个监测扇区到移动台的fPowerFromTheSector值,
// 并更新m_fInterferenceFromOtherSector值
// 第二次循环,更新各监测扇区的fPilotSNR,并更新其他一些参数
//
//AUTHOR: Li Jing
//
//CALLING FUNCTIONS:
// CChannelModel::GetFadingValues()
// CServiceArea::GetCell()
// CSector::GetSectorOrientation()
// CServiceArea::GetSector()
// CSector::GetTxPower()
// CSector::GetPilotPower()
// CServiceArea::GetOrthogonalFactor()
// CMobile::ObtainBestSector()
//
//NOTES: 原先是在更新监测集后就更新最佳扇区,现在将更新最佳扇区改为
// 话音用户与数据用户分开处理。
//
//////////////////////////////////////////////////////////////////////////
void CMobile::UpdateMonitorSet()
{
/* CStdioFile f;
char buf[50];
char FileName[40];
CString sp;
sp="266.txt";
strcpy(FileName,sp);*/
int i,j,k;
float fOtherChannelPower;
float fOrthogonalFactor;
float fFastFading; //新增内部参数,快衰值,为四个子时隙的平均
// SECTORID_TYPE sectorid; //新增内部参数,为移动台所在扇区的标号(根据移动台的归属坐标确定)
m_iSlotCount++;
float fPowerSummation;
fPowerSummation=0.0;
m_pFadingValuePointer=m_ChannelModel.GetFadingValues(m_iSlotCount);
//根据当前时隙数,更新衰落数组(后续值)的首地址。
/* if(m_iMsID==266)
{
if(!f.Open(FileName,CFile::modeCreate|CFile::modeNoTruncate|CFile::modeWrite))
{
#ifdef _DEBUG
afxDump<<"Unable to open file"<<"\n"; //exception handling
#endif
}
f.SeekToEnd();
//使文件指针指向文件尾部,输出数据可以在文件尾部接着写
f.WriteString("\nvalues of this mobile of this slot:\n");
}*/
for(i=0;i<19;i++) //第一次循环,更新每一个监测扇区到移动台的fPowerFromTheSector值
{
for(j=0;j<SectorNumber;j++)
{
m_aMonitorSector[i*SectorNumber+j].fSlowFading
=m_pFadingValuePointer[i].fSlowFading;
//将属性中慢衰值更新。实际上是每半秒钟才将慢衰更新一次,其间都是维持
//一个相同的慢衰值不变
m_aMonitorSector[i*SectorNumber+j].fPropagationLoss
=m_aMonitorSector[i*SectorNumber+j].fPathLoss
*m_aMonitorSector[i*SectorNumber+j].fAntennaGain
*m_aMonitorSector[i*SectorNumber+j].fSlowFading
*(float)pow(10,(MsAntennaGain-OtherLosses)/10);
//总的损耗值更新(实际上总的损耗值中只有慢衰值需要每半秒更新一次)
for(k=0;k<SubslotNumber;k++)
m_aMonitorSector[i*SectorNumber+j].fFastFading[k]
=m_pFadingValuePointer[i].fFastFadingSet[j][k];
fFastFading=(m_aMonitorSector[i*SectorNumber+j].fFastFading[0]
+m_aMonitorSector[i*SectorNumber+j].fFastFading[1]
+m_aMonitorSector[i*SectorNumber+j].fFastFading[2]
+m_aMonitorSector[i*SectorNumber+j].fFastFading[3])/(float)4;
//取四个子时隙的快衰值,并求平均
m_aMonitorSector[i*SectorNumber+j].fPowerFromTheSector
=m_pServiceArea
->GetSector(m_aMonitorSector[i*SectorNumber+j].stSectorID)
->GetTxPower()
*m_aMonitorSector[i*SectorNumber+j].fPropagationLoss
*fFastFading;
//更新扇区到达移动台的总功率(干扰)
/* if(m_iMsID==1)
{
fPower=fFastFading;
_gcvt(fPower,8,buf);
f.WriteString(buf);
f.WriteString(" ");
}*/
fPowerSummation+=m_aMonitorSector[i*SectorNumber+j].fPowerFromTheSector;
}
}
/* if(m_iMsID==1)
{
f.WriteString("\nInterferenceFromOtherSector:");
_gcvt(m_fInterferenceFromOtherSector,8,buf);
f.WriteString(buf);
f.WriteString("\n");
f.Close();
}*/
for(i=0;i<19;i++) //第二次循环,更新各监测扇区的fPilotSNR,并更新其他一些参数
for(j=0;j<SectorNumber;j++)
{
//上面算出的fPowerSummation值是移动台全部21个监测扇区fPowerFromTheSector
//值的累加,而实际上应该去掉本监测扇区的fPowerFromTheSector值。这样得到的
//才是更新后的移动台所在监测扇区受到的来自其它扇区的干扰
m_aMonitorSector[i*SectorNumber+j].fInterferenceFromOtherSector
=fPowerSummation-m_aMonitorSector[i*SectorNumber+j].fPowerFromTheSector;
fFastFading=(m_aMonitorSector[i*SectorNumber+j].fFastFading[0]
+m_aMonitorSector[i*SectorNumber+j].fFastFading[1]
+m_aMonitorSector[i*SectorNumber+j].fFastFading[2]
+m_aMonitorSector[i*SectorNumber+j].fFastFading[3])/(float)4;
m_aMonitorSector[i*SectorNumber+j].fPilotPower
=m_pServiceArea
->GetSector(m_aMonitorSector[i*SectorNumber+j].stSectorID)
->GetPilotPower()
*m_aMonitorSector[i*SectorNumber+j].fPropagationLoss
*fFastFading;
//监测扇区到达移动台的导频功率
fOtherChannelPower=m_pServiceArea
->GetSector(m_aMonitorSector[i*SectorNumber+j].stSectorID)
->GetTxPower()*
m_aMonitorSector[i*SectorNumber+j].fPropagationLoss
*fFastFading
-m_aMonitorSector[i*SectorNumber+j].fPilotPower;
//本监测扇区其他信道到达移动台的功率
fOrthogonalFactor=m_pServiceArea->GetOrthogonalFactor();
m_aMonitorSector[i*SectorNumber+j].fPilotSNR
=(float)(m_aMonitorSector[i*SectorNumber+j].fPilotPower
/(fOtherChannelPower/**fOrthogonalFactor*/
+m_aMonitorSector[i*SectorNumber+j].fInterferenceFromOtherSector
+NoisePower)); //本监测扇区到达移动台的SNR
/* if(m_iMsID==266)
{
f.WriteString("fOtherChannelPower:");
_gcvt(fOtherChannelPower,8,buf);
f.WriteString(buf);
f.WriteString("\n");
f.WriteString("sectortxpower:");
_gcvt(m_pServiceArea
->GetSector(m_aMonitorSector[i*SectorNumber+j].stSectorID)
->GetTxPower()*m_aMonitorSector[i*SectorNumber+j].fPropagationLoss
*fFastFading,8,buf);
f.WriteString(buf);
f.WriteString("\n");
f.WriteString("pilotPower:");
_gcvt(m_aMonitorSector[i*SectorNumber+j].fPilotPower,8,buf);
f.WriteString(buf);
f.WriteString("\n\n");
}*/
m_aMonitorSector[i*SectorNumber+j].fPilotSNR
=(float)(10*log10(m_aMonitorSector[i*SectorNumber+j].fPilotSNR));
//转化为dB值
m_aMonitorSector[i*SectorNumber+j].bIsBestSector=false;
//更新是否是最佳基站
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -