📄 csector.cpp
字号:
///////////////////////////////////////////////////////////////////
// WCDMA TEAM //
// BUPT Radio Research Center //
///////////////////////////////////////////////////////////////////
//
// CSector.cpp
//
//////////////////////////////////////////////////////////////////////
// //
// 扇区类CSector的成员函数的声明 //
// //
// Written by: 李晶 //
// Date: 200404 //
// //
// //
//////////////////////////////////////////////////////////////////////
#include "CSector.h"
#include "systemsim.h"
#include "CDataMs.h"
//////////////////////////////////////////////////////////////////////////
//TITLE: Initialization(初始化函数)
//
//PARAMETERS:扇区标号,父小区标号和父小区指针,扇区朝向
//
//PURPOSE AND ALGORITHMS:
// 完成对扇区标号,父小区标号、指针,扇区发射功率,扇区朝向等参数
// 的初始化,并将一些统计量进行初始化
// 并对新增加的一些数据成员进行初始化
//
//AUTHOR: Li Jing
//
//CALLING FUNCTIONS:
// NULL
//
//CALLED FUNCTIONS:
// CCell::Initialization()
//
//NOTES: 扇区初始化时,与以前不同的是:现在将扇区的发射功率初始化为
// 导频功率与公共信道功率的和
//
//////////////////////////////////////////////////////////////////////////
void CSector::Initialization(int SectorIndex, CELLID_TYPE CellID,
CCell* pParentCell, int orient)
{
m_iSectorIndex=SectorIndex; //初始化扇区标号,为1,2,3
m_stParentCellID=CellID; //初始化父小区标号
m_pParentCell=pParentCell; //初始化父小区指针
m_iSectorOrientation=orient%360; //初始化扇区朝向,保证其值在0-359之间
//initial the sectors' power
m_fPilotPower=(float)FractionOfPilotChannel*m_fMaxPower; //导频功率=导频功率比例*实际发射功率
m_fCommonPower=(float)FractionOfCommonChannel*m_fMaxPower;//公共信道功率=其它公共信道功率比例*实际发射功率
// m_fTotalVoicePower=0.0; //总话音功率置零
m_fTotalDCHPower=0.0; //总DCH功率置零
m_fDCHAvailablePower = 0.0; //DCH信道可用功率置零
m_fHSDSCHPower=float(FractionOfHSDSCHChannel*m_fMaxPower); //预留的HSDSCH功率 by zl 20050422
m_fHSDSCHAvailablePower=float(FractionOfHSDSCHChannel*m_fMaxPower); //总的可用HSDSCH功率
//by zl20050428
m_fTotalVoicePower=float(m_fMaxPower*(1.0-FractionOfPilotChannel-FractionOfCommonChannel-FractionOfHSDSCHChannel));
//初始发射功率,所有的扇区都满功率发射 by zl
m_fTxPower=m_fMaxPower;
#ifdef DEBUG_FTP
cout<<"The CSector::Initialization() function is being called!\n";
cout<<"The cell is "<<"("<<m_stParentCellID.m<<","<<m_stParentCellID.n<<")"<<endl;
cout<<"The sector number is "<<m_iSectorIndex<<endl;
cout<<"m_fMaxPower = "<<m_fMaxPower<<endl;
cout<<"m_fPilotPower = "<<m_fPilotPower<<endl;
cout<<"m_fCommonPower = "<<m_fCommonPower<<endl;
cout<<"m_fTxPower = "<<m_fTxPower<<endl;
#endif
for(int i=0;i<SlotsNumPerFrame;i++) //将每个时隙扇区的实际发射功率数组初始化为0
m_fTxPow[i]=0.0;
m_iIndex=0; //将数组的下标清为0
m_fmeanTxPower=0.0; //将扇区的平均发射功率置为0
m_bIsTransmiting=false; //将正在传输标志置假
m_iPriorityFactor=-100000; //优先权指标初始化
m_pHighestPriorityDataMs = NULL;
m_iTotalDataMsNum=0; //本扇区总的分组用户数置零
//初始化扇区统计相关变量
m_lGoodBitNum = 0; //本扇区中到目前为止成功传输的bit数
m_fSectorDataThrput = 0.0; //扇区数据吞吐量
m_iSectorSucfulBLNum = 0; //扇区成功传输传输块数
m_iSectorFailedBLNum = 0; //扇区传输失败传输块数
m_iSectorPacketNum = 0; //扇区传输分组数
m_iSectorSucfulPacketNum = 0; //扇区传输成功分组数
m_iSectorFailedPacketNum = 0; //扇区传输失败分组数
m_iSectorPacketDelay = 0; //扇区传输分组时延总和
m_fSectorAveragePacketDelay = 0.0; //扇区平均分组时延
m_lSectorPacketCallBitNum = 0; //扇区分组呼叫成功传输比特数
m_fSectorPCThrput = 0.0; //扇区HTTP业务吞吐量
m_iSectorPCNum = 0; //扇区分组呼叫数目
m_iSectorPCDelay = 0; //扇区分组呼叫时延总和
m_fSectorAveragePCDelay = 0.0; //扇区平均分组呼叫时延
//by zl
m_iVoiceNum = 0; //扇区中的语音用户数
m_iDCHNum = 0; //扇区中的DCH数据用户
m_iHSDSCHNum = 0; //扇区中的HSDSCH数据用户
m_bIsExistHighestPriority = false; //扇区不存在最高优先级的用户
//zl20060308
m_iFtpNum=0;
m_iVideoNum=0;
//20051205
for(i=0;i<3;i++)
{
m_iSectorLocationNum[i]=0;
for(int j=0;j<4;j++)
{
m_bSectorClassIndex[i][j]=false;
}
}
m_iSectorGradeIndex=1;
}
//////////////////////////////////////////////////////////////////////////
//TITLE: ResetPower(功率复位函数)
//
//PARAMETERS:NULL
//
//PURPOSE AND ALGORITHMS:
// 将实际发射功率、话音业务总功率和DCH数据信道功率,DSCH数据信
// 道功率,可用的DSCH功率置零。
//
//AUTHOR: Li Jing
//
//CALLING FUNCTIONS:
// NULL
//
//////////////////////////////////////////////////////////////////////////
void CSector::ResetPower()
{
m_fTotalVoicePower=0.0; //实际的话音业务总功率置零
m_fTotalDCHPower=0.0; //实际的DCH数据信道功率置零
m_fDCHAvailablePower = 0.0; //DCH信道可用功率置零
m_fHSDSCHPower = 0.0;
m_fHSDSCHAvailablePower=0.0; //总的可用DSCH功率置零
//for compile
m_fTxPower=m_fTotalVoicePower+m_fTotalDCHPower+m_fCommonPower+m_fPilotPower+m_fHSDSCHPower;
//扇区总的发射功率复位
}
//////////////////////////////////////////////////////////////////////////
//TITLE: VoicePowerCumulate(话音功率的累加函数)
//
//PARAMETERS:单个话音用户的功率
//
//PURPOSE AND ALGORITHMS:
// 将话音用户的激活集中的扇区发射功率分别累加到对应的扇区中去
//
//AUTHOR: Li Jing
//
//CALLING FUNCTIONS:
// NULL
//
//CALLED FUNCTIONS:
// CMobile::InitActiveSet()
// CVoiceMs::UpdateActiveSetPower()
//
//////////////////////////////////////////////////////////////////////////
void CSector::VoicePowerCumulate(float SingleVoicePower)
{
m_fTotalVoicePower+=SingleVoicePower;
}
//////////////////////////////////////////////////////////////////////////
//TITLE: DCHPowerCumulate(DCH信道功率的累加函数)
//
//PARAMETERS:单个DCH用户的功率
//
//PURPOSE AND ALGORITHMS:
// 将DCH用户的激活集中的扇区发射功率分别累加到对应的扇区中去
//
//AUTHOR: Li Jing
//
//CALLING FUNCTIONS:
// NULL
//
//////////////////////////////////////////////////////////////////////////
void CSector::DCHPowerCumulate(float SingleDCHPower)
{
m_fTotalDCHPower+=SingleDCHPower;
}
//////////////////////////////////////////////////////////////////////////
//TITLE: DCHPowerCalculate(DCH数据信道可用的功率计算函数)
//
//PARAMETERS:NULL
//
//PURPOSE AND ALGORITHMS:
// DCH信道可使用的功率=BTS最大发射功率-导频信道发射功率-
// 公共信道发射功率-话音业务总功率
//
//AUTHOR: 陈美娅
//
//CALLING FUNCTIONS:
// NULL
//
//CALLED FUNCTIONS:
// CServiceArea::DCHAvailablePowerCalculate()
//
//////////////////////////////////////////////////////////////////////////
void CSector::DCHAvailablePowerCalculate()
{
m_fPacketPower=m_fMaxPower-m_fPilotPower-m_fCommonPower-m_fTotalVoicePower;
if (m_fPacketPower>m_fMaxPacketPower) //分组信道可使用的功率不能大于分组数据信道的最大功率
m_fPacketPower=m_fMaxPacketPower; //若大于,则可用功率即为最大功率
if (m_fPacketPower<0) //分组信道可使用的功率不能小于0
m_fPacketPower=0;
//notice 这里需要减去已经分配的DCH/HSDSCH信道功率
// m_fDCHAvailablePower = m_fMaxPower-m_fPilotPower-m_fCommonPower-m_fTotalVoicePower
// -m_fTotalDCHPower-m_fHSDSCHPower;
m_fDCHAvailablePower = float(m_fMaxPower-m_fPilotPower-m_fCommonPower-m_fTotalVoicePower
-m_fTotalDCHPower-m_fMaxPower*FractionOfHSDSCHChannel);
//限制数据DCH信道可用功率的范围
if(m_fDCHAvailablePower > m_fMaxPacketPower )
{
m_fDCHAvailablePower = m_fMaxPacketPower;
}
else if( m_fDCHAvailablePower < 0 )
{
m_fDCHAvailablePower = 0;
}
else
{
}
}
//////////////////////////////////////////////////////////////////////////
//TITLE: HSDSCHPowerCalculate(DSCH数据信道可用的功率计算函数)
//
//PARAMETERS:NULL
//
//PURPOSE AND ALGORITHMS:
// HSDSCH信道可使用的功率=BTS最大发射功率-导频信道发射功率-
// 公共信道发射功率-话音业务总功率-DCH总功率
//
//AUTHOR: Li Jing
//
//CALLING FUNCTIONS:
// NULL
//
//CALLED FUNCTIONS:
// CServiceArea::DSCHAvailablePowerCalculate()
//
//////////////////////////////////////////////////////////////////////////
void CSector::HSDSCHAvailablePowerCalculate()
{
//notice 这里需要减去已经分配的DCH信道功率
m_fHSDSCHAvailablePower=m_fPacketPower - m_fTotalDCHPower;
//HSDSCH信道可使用的功率=BTS最大发射功率-导频信道发射功率-
//公共信道发射功率-话音业务总功率-DCH总功率
if (m_fHSDSCHAvailablePower<0) //DSCH信道可使用的功率不能小于0
m_fHSDSCHAvailablePower=0;
m_fHSDSCHPower=m_fHSDSCHAvailablePower;
}
//////////////////////////////////////////////////////////////////////////
//TITLE: TxPowerUpdate(扇区实际发射功率更新函数)
//
//PARAMETERS:NULL
//
//PURPOSE AND ALGORITHMS:
// 更新的发射功率=当前总的话音功率+当前总的DCH分组功率+当前总
// 的DSCH功率+公共信道功率+导频功率
//
//AUTHOR: Li Jing
//
//CALLING FUNCTIONS:
// NULL
//
//NOTES: 在每一次移动台要求扇区的发射功率改变后,将改变后的发射功率累加
// 到相应的部分后,再调用本函数,从而达到随时更新扇区实际发射功率
// 的目的
//
//////////////////////////////////////////////////////////////////////////
void CSector::TxPowerUpdate()
{
m_fTxPower=m_fTotalVoicePower+m_fTotalDCHPower+m_fCommonPower+m_fPilotPower+m_fHSDSCHPower;
}
//////////////////////////////////////////////////////////////////////////
//TITLE: SlotTxPowerCalculate(每时隙末实际发射功率计算函数)
//
//PARAMETERS:NULL
//
//PURPOSE AND ALGORITHMS:
// 实际发射功率=总的话音功率+总的DCH分组功率+总的DSCH功率+公共
// 信道功率+导频功率。将计算的结果依次存入m_fTxPow[]数组,以便于
// 在接纳控制函数中平均发射功率m_fmeanTxPower的计算
//
//AUTHOR: Li Jing
//
//CALLING FUNCTIONS:
// NULL
//
//NOTES: 在每个时隙最后面调用本函数,得到此时隙最终的扇区发射功率。并
// 且为了计算扇区当前15个时隙的平均发射功率,引入了长度为15的数组
// m_fTxPow[],每次扇区发射功率更新后,都将数组下标m_iIndex向前
// 进一步。为了使数组进行循环记录,当数组下标到头后,再将下标调
// 到最前面,刷掉以前的记录
//
//////////////////////////////////////////////////////////////////////////
void CSector::SlotTxPowerCalculate()
{
m_fTxPower=m_fTotalVoicePower+m_fTotalDCHPower+m_fCommonPower+m_fPilotPower+m_fHSDSCHPower;
m_fTxPow[m_iIndex++]=m_fTxPower;
if(m_iIndex>=SlotsNumPerFrame)
m_iIndex-=SlotsNumPerFrame;
}
/////////////////////////////////////////////////////////////////////////
//
// TITLE: 扇区统计量计算函数
//
// PURPOSE: 计算扇区的数据吞吐量、平均分组时延、平均分组呼叫时延和分组呼叫吞吐量
//
// SAMPLE CALL: pSector->SectorStatistics();
//
// CALLED BY FUNCTIONS: CServiceArea::SectorStatic()
//
// CALLING FUNCTIONS:
//
// AUTHOR: Chen Meiya
//
// DATE: 04/04(MM/YY)
//
// MODIFICATIONS SINCE 04/04(MM/YY)
//
////////////////////////////////////////////////////////////////////////////
void CSector::SectorStatisticsCalculate(float fDroptime)
{
//for compile 这里需要对DROPTIME SLOTTIME进行重新定义
//计算扇区吞吐量、平均分组时延、平均分组呼叫时延和分组呼叫吞吐量
m_fSectorDataThrput =(float)( m_lGoodBitNum/(fDroptime - INITIALSLOT*SlotSize));
m_fSectorAveragePacketDelay = (float) (m_iSectorPacketDelay*SLOTTIME/m_iSectorPacketNum);
m_fSectorAveragePCDelay = (float)(m_iSectorPCDelay*SLOTTIME/m_iSectorPCNum);
m_fSectorPCThrput = m_lSectorPacketCallBitNum/m_fSectorAveragePCDelay;
}
/////////////////////////////////////////////////////////////////////////
//
// TITLE: 扇区总发射功率输出函数
//
// PURPOSE: 输出扇区总的发射功率
//
// SAMPLE CALL: pSector->OutputPower();
//
// CALLED BY FUNCTIONS: CServiceArea::OutputSectorPower()
//
// CALLING FUNCTIONS:
//
// AUTHOR: Chen Meiya
//
// DATE: 04/04(MM/YY)
//
// MODIFICATIONS SINCE 04/04(MM/YY)
//
////////////////////////////////////////////////////////////////////////////
void CSector::OutputPower()
{
CStdioFile f;
char buf[50];
char FileName[40];
CString sp;
sp="SectorPower.txt";
strcpy(FileName,sp);
if(!f.Open(FileName,CFile::modeCreate|CFile::modeNoTruncate|CFile::modeWrite))
{
#ifdef _DEBUG
afxDump<<"Unable to open file"<<"\n"; //exception handling
#endif
}
f.SeekToEnd();
//使文件指针指向文件尾部,输出数据可以在文件尾部接着写
_gcvt(m_fTxPower,8,buf);
f.WriteString(buf);
f.WriteString(" ");
f.Close();
}
//////////////////////////////////////////////////////////////////////////
//TITLE: AdmissionControl(接纳控制函数)
//
//PARAMETERS:当前时隙数,移动台向扇区要求的发射功率
//
//PURPOSE AND ALGORITHMS:
// 如果扇区的最大发射功率减去平均发射功率大于移动台向扇区要求的
// 发射功率,则接纳成功;否则接纳失败
//
//AUTHOR: Li Jing
//
//CALLING FUNCTIONS:
// NULL
//
//NOTES: 1.接纳控制时,由以前的基于扇区当前的发射功率改为现在的一方面要基
// 于扇区当前的发射功率,另外还要考虑扇区当前的15个时隙的平均发射功
// 率
//
// 2.如果当前时隙数已大于初始化要求的时隙数,则正常的用平均发射功率
// 进行接纳控制;如果当前时隙数还未达到初始化要求的时隙数,则就令平
// 均发射功率为0,从而一定接纳成功。这样做是因为在达到初始化要求的
// 时隙数前,并不进行相关统计,所以不影响仿真结果。
//
// 3.话音、DCH接纳控制时,要给DSCH预留一定的功率(10%)
//
////////////////////////////////////////////////////////////////////////////
//revised by zl 20050422
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -