⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cmsmanager.cpp

📁 此程序为wcdma系统当中ftp/video业务模型的c++程序仿真 通过此程序 能得到此两种业务在多种条件下的吞吐量和无码率的性能
💻 CPP
📖 第 1 页 / 共 5 页
字号:
///////////////////////////////////////////////////////////////////
//                             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 + -