📄 cmsmanager.cpp
字号:
///////////////////////////////////////////////////////////////////
// WCDMA TEAM //
// BUPT Radio Research Center //
///////////////////////////////////////////////////////////////////
//
// CMsManager.cpp
//
//////////////////////////////////////////////////////////////////////
// //
// 移动台管理与数据统计类CMsManager的成员函数的声明 //
// //
// Written by: 陈美娅 李晶 //
// Date: 200404 //
// //
//////////////////////////////////////////////////////////////////////
#include "CMsManager.h"
#include "CVoiceMs.h"
#include "CHttpDataMs.h"
#include "CFtpDataMs.h"
#include "CVideoDataMs.h" //20060116
#include "sys_random.h"
#include "newran.h"
#include "CServiceArea.h"
#include "CLinkPrediction.h"
#include <stdio.h>
#include <string.h>
#define DEBUG_FTPDATAMS
//////////////////////////////////////////////////////////////////////////
// 构造函数 //
//////////////////////////////////////////////////////////////////////////
CMsManager::CMsManager()
{
}
//////////////////////////////////////////////////////////////////////////
// 析构函数 //
//////////////////////////////////////////////////////////////////////////
CMsManager::~CMsManager()
{
Clean(); //调用clean()函数清除各类用户链表
}
//////////////////////////////////////////////////////////////////////////
//TITLE: Initialization(初始化函数)
//
//PARAMETERS:时隙数,时隙时长,Drop时长,LinkPrediction对象指针
//
//PURPOSE AND ALGORITHMS:
// 完成类的初始化工作
//
//AUTHOR: Li Jing
//
//CALLING FUNCTIONS:
//
//////////////////////////////////////////////////////////////////////////
void CMsManager::Initialization(int iSlotNum,float fSlotTime,
float fDropTime,CLinkPrediction* pLink)
{
/*
m_iVoiceNumInSys=m_iVoiceNumPerSector*SectorNumber;
m_iDataNumInSys=m_iDataNumPerSector*SectorNumber;
//by zl 系统中的专用信道用户数和高速共享信道用户总数
m_iDCHDataNumInSys=m_iDCHDataNumPerSector*SectorNumber;
m_iHSDSCHDataNumInSys=m_iHSDSCHDataNumPerSector*SectorNumber;
*/
//由一个中心小区扩展至25个 by HuangFan 20060404
int iCellNum=MM*NN;
m_iVoiceNumInSys=m_iVoiceNumPerSector*SectorNumber*iCellNum;
m_iDataNumInSys=m_iDataNumPerSector*SectorNumber*iCellNum;
//by zl 系统中的专用信道用户数和高速共享信道用户总数
m_iDCHDataNumInSys=m_iDCHDataNumPerSector*SectorNumber*iCellNum;
m_iHSDSCHDataNumInSys=m_iHSDSCHDataNumPerSector*SectorNumber*iCellNum;
m_iHttpNum=int(m_iDataNumInSys*m_fFractionHttp);
m_iFtpNum=int(m_iDataNumInSys*m_fFractionFtp);
// m_iVideoNum=int(m_iDataNumInSys*m_fFractionVideo); //20060116
// m_iFtpNum=3;
m_iVideoNum=m_iDataNumInSys-m_iFtpNum; //20060302
//zl 20060308
m_iHttpNuminSector=int(m_iHSDSCHDataNumPerSector*m_fFractionHttp);
m_iFtpNuminSector=int(m_iHSDSCHDataNumPerSector*m_fFractionFtp);
// m_iFtpNuminSector=1;
m_iVideoNuminSector=m_iHSDSCHDataNumPerSector-m_iFtpNuminSector;
m_iSlotNum=iSlotNum;
m_fSlotTime=fSlotTime;
m_fDropTime=fDropTime;
m_pLinkPrediction=pLink;
m_iSlotCurrentNum = 0;
m_iSwitchCounter = 0;
//话音业务相关统计量的初始化
m_iVoiceUserOfCurrentDrop=0; //本Drop内所有的话音用户初始化为0
m_iBlockUserOfVoice=0; //初始化话音业务接入失败的用户数
m_fBlockRatioOfVoice=0; //初始化话音用户接入失败率
m_iOutageUserOfVoice=0; //初始化话音业务中断的用户数
m_fOutageRatioOfVoice=0; //初始化话音用户中断率
m_iDropUserOfVoice=0; //初始化话音业务掉话用户数
m_fDropRatioOfVoice=0; //初始化话音用户掉话率
m_iUnsatisfiedUserOfVoice=0; //初始化不满意话音用户数
m_fSatisfiedRadioOfVoice=0; //初始化话音用户满意率
m_lTotalVoiceFailedBLNum=0; //初始化话音用户总的传输错误传输块数
m_lTotalVoiceBLNum=0; //初始化话音用户总的传输块数
m_fMeanVoiceBLER=0.0; //初始化话音用户总的误块率
//软切换开销相关统计量初始化 add by slj
m_fSpendingOfSHO = 0.0;
m_lTotalSlotOfActiveSetSize = 0;
for ( int i = 0; i < ActiveSetMaxSize; i++)
{
m_lSlotOfActiveSetSize[i] = 0;
m_fScaleOfActiveSetSize[i] = 0.0;
}
//软切换下相关统计量初始化 add by slj 20041020
m_lTotalBLNumInSHO = 0; //初始化软切换下总的传输块数
m_lTotalFailedBLNumInSHO = 0; //初始化记录软切换下错误传输块数
m_lTotalSlotOfSHO = 0; //初始化处于软切换总时隙
m_fScaleOfSHO = 0.0; //初试化软切换比例
m_fBLERInSHO = 0.0; //初始化软切换下误块率
m_fTotalMsPowerInSHO = 0.0; //初始化总发射功率
m_lTotalMsSlotInSHO = 0; //初始化处于软切换所有移动台
m_fMeanPowerInSHO = 0.0; //初始化软切换下平均功率
//初始化数据用户相关统计属性
m_lTotalSucfulBitNum = 0; //成功传输比特的总量
m_lTotalFailedBLNum = 0; //记录数据移动台传输失败的传输块之和
m_lTotalSucfulBLNum = 0; //记录数据移动台成功传输的传输块之和
m_fMeanBLER = 0.0; //一个drop内的平均传输块错误率
m_fMeanDataThrput = 0.0; //一个drop内数据平均吞吐量
m_lTotalFailedPacketNum = 0; //记录数据移动台传输失败的分组之和
m_lTotalSucfulPacketNum = 0; //记录数据移动台传输成功的份组之和
m_lTotalSucfulPCBit = 0;
m_lTotalPacketDelay = 0; //记录数据移动台总的分组时延
m_lTotalPCDelay = 0; //记录数据移动台总的分组呼叫时延
m_fMeanPER = 0.0; //一个drop内的平均分组错误率
m_iBlockedDCHMs = 0; //记录一个drop内被block的DCH移动台数目
m_fBlockedDCHRatio = 0.0; //记录一个drop内被block的DCH移动台占数据移动台的比例
//for compile 设置数据队列为空时的TFI以及DSCH信道TFI
RATE2CI_TYPE *pRate = pLink->m_pstRateTable.GetHead();
m_pstDCHTFI = pRate->pTFI;
//初始化DCH用户掉线相关统计量 add by slj
m_iDCHUserOfCurrentDrop = 0;
m_iInitDroppedUser = 0;
m_iDropUserOfDCHMs = 0;
m_fDropRatioOfDCHMs = 0.0;
//暂时定义掉话是用户是否满意的唯一标准
m_iUnsatisfiedUserOfDCHMs = 0;
m_fSatisfiedRadioOfDCHMs = 0.0;
//for compile
m_iMsNumbelowWindow = 0;
m_iMsNumUnAdmitted = 0;
m_fDynamicRangeOfPacketPower =20;
//for compile
m_sIntermediateFileName = &"CSeviceAreaIntermediateFile.txt";
m_sHighestUserFileName = &"CHighestUserFile.txt";
//end of for compile
//对话音BLER vs C/I表进行赋值
int ii;
double fC2IIndex[26]=
{ -25.10, -24.85, -24.60, -24.35, -24.10, -23.85, -23.60, -23.35,
-23.10, -22.85, -22.60, -22.35, -22.10, -21.85, -21.60, -21.35,
-21.10, -20.85, -20.60, -20.35, -20.10, -19.85, -19.60, -19.35,
-19.10, -18.85
};
for (ii=0;ii<26;ii++)
m_fC2IIndex[ii]=(float)fC2IIndex[ii];
double fBLER_1[26]=
{ 1, 1, 1, 1, 1, 0.90, 0.80, 0.70,
0.60, 0.50, 0.45, 0.40, 0.35, 0.30, 0.20, 0.15,
0.09, 0.04, 0.015, 0.007, 0.004, 0.002, 0.001, 0.0005,
0.0003, 0.00015
};
for (ii=0;ii<26;ii++)
m_fBLER_1[ii]=(float)fBLER_1[ii];
double fBLER_2[26]=
{ 1, 1, 1, 1, 0.95, 0.85, 0.70, 0.60,
0.55, 0.45, 0.40, 0.30, 0.20, 0.15, 0.07, 0.04,
0.025, 0.012, 0.004, 0.003, 0.002, 0.001, 0.0005, 0.0003,
0.00015,0.00008
};
for (ii=0;ii<26;ii++)
m_fBLER_2[ii]=(float)fBLER_2[ii];
double fBLER_3[26]=
{ 1, 1, 1, 1, 0.95, 0.85, 0.70, 0.60,
0.55, 0.45, 0.40, 0.30, 0.20, 0.15, 0.07, 0.04,
0.025, 0.012, 0.004, 0.003, 0.002, 0.001, 0.0005, 0.0003,
0.00015,0.00008
};
for (ii=0;ii<26;ii++)
m_fBLER_3[ii]=(float)fBLER_3[ii];
double fBLER_4[26]=
{ 1, 1, 1, 0.90, 0.80, 0.75, 0.70, 0.55,
0.50, 0.40, 0.30, 0.20, 0.15, 0.10, 0.05, 0.02,
0.011, 0.008, 0.003, 0.002, 0.0015, 0.0008, 0.0004, 0.0002,
0.0001, 0.00005
};
for (ii=0;ii<26;ii++)
m_fBLER_4[ii]=(float)fBLER_4[ii];
double fBLER_5[26]=
{ 1, 1, 1, 0.80, 0.60, 0.55, 0.40, 0.35,
0.30, 0.25, 0.20, 0.10, 0.07, 0.04, 0.02, 0.008,
0.004, 0.001, 0.0005, 0.0002, 0.0001, 0.00005,0.00003,0.00002,
0.00001,0.000005
};
for (ii=0;ii<26;ii++)
m_fBLER_5[ii]=(float)fBLER_5[ii];
//Added by Li Jing,20040713
//对数据(64K)BLER vs C/I表进行赋值
double fC2IIndex64[4]=
{ -14.2, -12.2, -8.2, -6.2
};
for (ii=0;ii<4;ii++)
m_fC2IIndex64[ii]=(float)fC2IIndex64[ii];
double fBLER64_1[4]=
{ 0.15, 0.048, 0.0035, 0.001
};
for (ii=0;ii<4;ii++)
m_fBLER64_1[ii]=(float)fBLER64_1[ii];
double fBLER64_2[4]=
{ 0.3, 0.06, 0.004, 0.0007
};
for (ii=0;ii<4;ii++)
m_fBLER64_2[ii]=(float)fBLER64_2[ii];
double fBLER64_3[4]=
{ 0.0065, 1, 1, 0.90
};
for (ii=0;ii<4;ii++)
m_fBLER64_3[ii]=(float)fBLER64_3[ii];
double fBLER64_4[4]=
{ 1, 1, 1, 0.80
};
for (ii=0;ii<4;ii++)
m_fBLER64_4[ii]=(float)fBLER64_4[ii];
double fBLER64_5[4]=
{ 1, 1, 1, 0.80
};
for (ii=0;ii<4;ii++)
m_fBLER64_5[ii]=(float)fBLER64_5[ii];
//对数据(144K)BLER vs C/I表进行赋值
double fC2IIndex144[4]=
{ -26.10, -25.85, -25.60, -25.35
};
for (ii=0;ii<4;ii++)
m_fC2IIndex144[ii]=(float)fC2IIndex144[ii];
double fBLER144_1[4]=
{ 1, 1, 1, 1
};
for (ii=0;ii<4;ii++)
m_fBLER144_1[ii]=(float)fBLER144_1[ii];
double fBLER144_2[4]=
{ 1, 1, 1, 1
};
for (ii=0;ii<4;ii++)
m_fBLER144_2[ii]=(float)fBLER144_2[ii];
double fBLER144_3[4]=
{ 1, 1, 1, 0.90
};
for (ii=0;ii<4;ii++)
m_fBLER144_3[ii]=(float)fBLER144_3[ii];
double fBLER144_4[4]=
{ 1, 1, 1, 0.80
};
for (ii=0;ii<4;ii++)
m_fBLER144_4[ii]=(float)fBLER144_4[ii];
double fBLER144_5[4]=
{ 1, 1, 1, 0.80
};
for (ii=0;ii<4;ii++)
m_fBLER144_5[ii]=(float)fBLER144_5[ii];
//对数据(384K)BLER vs C/I表进行赋值
double fC2IIndex384[4]=
{ -26.10, -25.85, -25.60, -25.35
};
for (ii=0;ii<4;ii++)
m_fC2IIndex384[ii]=(float)fC2IIndex384[ii];
double fBLER384_1[4]=
{ 1, 1, 1, 1
};
for (ii=0;ii<4;ii++)
m_fBLER384_1[ii]=(float)fBLER384_1[ii];
double fBLER384_2[4]=
{ 1, 1, 1, 1
};
for (ii=0;ii<4;ii++)
m_fBLER384_2[ii]=(float)fBLER384_2[ii];
double fBLER384_3[4]=
{ 1, 1, 1, 0.90
};
for (ii=0;ii<4;ii++)
m_fBLER384_3[ii]=(float)fBLER384_3[ii];
double fBLER384_4[4]=
{ 1, 1, 1, 0.80
};
for (ii=0;ii<4;ii++)
m_fBLER384_4[ii]=(float)fBLER384_4[ii];
double fBLER384_5[4]=
{ 1, 1, 1, 0.80
};
for (ii=0;ii<4;ii++)
m_fBLER384_5[ii]=(float)fBLER384_5[ii];
}
//////////////////////////////////////////////////////////////////////////
//TITLE: MsInitialization(初始化函数)
//
//PARAMETERS:ServiceArea对象指针
//
//PURPOSE AND ALGORITHMS:
// 完成移动台对象的初始化工作
//
//AUTHOR: Li Jing
//
//CALLING FUNCTIONS:
//
//////////////////////////////////////////////////////////////////////////
void CMsManager::MsInitialization(CServiceArea* pService)
{
m_pServiceArea=pService;
int ID=0;
int nType=0;
float fVelocity;
float pp; //a random number produced between 0 and 1
POSITION pos;
TotalUserType tt;
float fV[10];
fV[0]=m_fFractionOfChannel[0];
for (int i=1;i<10;i++)
fV[i]=1.;
for (i=1;i<m_iChannelNumber;i++)
fV[i]=fV[i-1]+m_fFractionOfChannel[i];
//初始化话音用户链表
pos=m_VoiceList.GetHeadPosition();
CVoiceMs* pVoiceMs=NULL;
while (pos!=NULL)
{
tt=T_voice;
pVoiceMs=m_VoiceList.GetNext(pos);
ID++; //话音用户的ID
cout<<"Mobile #"<<ID<<" initialization... Voice"<<endl;
//确定该话音用户的信道类型及其速率
pp=xUniform(0.,1.); //produce a random between 0 and 1
if (pp<fV[0]) //if the random is between 0 and fV[0]
{fVelocity=3.;nType=1;} //then the channel type is 1
else if (pp<fV[1]) //if the random is between fV[0] and fV[1]
{fVelocity=10.;nType=2;}
else if (pp<fV[2]) //if the random is between fV[1] and fV[2]
{fVelocity=30.;nType=3;}
else if (pp<fV[3]) //if the random is between fV[2] and fV[3]
{fVelocity=120.;nType=4;}
else //the random is between fV[3] and fV[4]
{fVelocity=0.;nType=5;}
cout<<" Channel type: "<<nType<<endl;
//调用初始化函数
pVoiceMs->MobileInitialization(ID,this,pService,
fVelocity,nType,m_fStdSlowFading,tt);
pVoiceMs->VoiceInitialization(m_pLinkPrediction);
m_iVoiceUserOfCurrentDrop++;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -