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