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

📄 cmsmanager.cpp

📁 此程序为wcdma系统当中ftp/video业务模型的c++程序仿真 通过此程序 能得到此两种业务在多种条件下的吞吐量和无码率的性能
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	{
		m_fSpendingOfSHO += ( k+1 )*m_fScaleOfActiveSetSize[k];           
	}
	
	--m_fSpendingOfSHO;    //统计软切换开销

	//软切换率的统计 add by slj 20041020
	m_lTotalSlotOfSHO = m_lTotalSlotOfActiveSetSize - m_lSlotOfActiveSetSize[0];
	m_fScaleOfSHO = float( m_lTotalSlotOfSHO )/float( m_lTotalSlotOfActiveSetSize );

	//软切换下误块率等相关统计
	m_fBLERInSHO = float( m_lTotalFailedBLNumInSHO )/float( m_lTotalBLNumInSHO );
	m_fMeanPowerInSHO = (float)( m_fTotalMsPowerInSHO /double( m_lTotalMsSlotInSHO));

    //open the file to write the statistics
    if(!f.Open(m_sVoiceFile,CFile::modeCreate|CFile::modeNoTruncate|CFile::modeWrite))
	{
	        #ifdef _DEBUG
	    	        afxDump<<"Unable to open file"<<"\n";	//exception handling
	        #endif
	}
    	f.SeekToEnd();                             
	//使文件指针指向文件尾部,输出数据可以在文件尾部接着写

	_gcvt(m_iVoiceNumPerSector,8,buf);
	f.WriteString(buf);                         
	f.WriteString(" users:\n");

	f.WriteString("此Drop总的话音用户数:");
    _gcvt(m_iVoiceUserOfCurrentDrop,8,buf);
	f.WriteString(buf);                         
	f.WriteString("\n");
		
	f.WriteString("话音用户阻塞率:");
    _gcvt(m_fBlockRatioOfVoice,8,buf);
	f.WriteString(buf);                         
	f.WriteString("\n");
		
	f.WriteString("话音用户中断率:");
	_gcvt(m_fOutageRatioOfVoice,8,buf);
	f.WriteString(buf);
	f.WriteString("\n");
	
	f.WriteString("话音用户掉话率:");
	_gcvt(m_fDropRatioOfVoice,8,buf);
	f.WriteString(buf);
	f.WriteString("\n");

    f.WriteString("话音用户满意率:");
	_gcvt(m_fSatisfiedRadioOfVoice,8,buf);
	f.WriteString(buf);
	f.WriteString("\n");

	f.WriteString("话音用户软切换开销:");
	_gcvt(m_fSpendingOfSHO,8,buf);
	f.WriteString(buf);
	f.WriteString("\n");

	f.WriteString("话音用户软切换率:");
	_gcvt(m_fScaleOfSHO,8,buf);
	f.WriteString(buf);
	f.WriteString("\n");

	f.WriteString("话音用户总的误块率:");
	_gcvt(m_fMeanVoiceBLER,8,buf);
	f.WriteString(buf);
	f.WriteString("\n");

	f.WriteString("话音用户软切换下误块率:");
	_gcvt(m_fBLERInSHO,8,buf);
	f.WriteString(buf);
	f.WriteString("\n");

	f.WriteString("话音用户软切换下平均功率:");
	_gcvt(m_fMeanPowerInSHO,8,buf);
	f.WriteString(buf);
	f.WriteString("\n");

	f.WriteString("\n话音用户软切换下总传输块数:");
	_gcvt(m_lTotalBLNumInSHO,8,buf);
	f.WriteString(buf);
	f.WriteString("\n");


	f.WriteString("话音用户软切换下传错的块数:");
	_gcvt(m_lTotalFailedBLNumInSHO,8,buf);
	f.WriteString(buf);
	f.WriteString("\n");

	f.WriteString("话音用户软切换下总时隙:");
	_gcvt(m_lTotalMsSlotInSHO,8,buf);
	f.WriteString(buf);
	f.WriteString("\n");

	f.Close();
}



//////////////////////////////////////////////////////////////////////////
//TITLE:      UpdateSectorVoicePower(更新各扇区话音功率函数)				        
//
//PARAMETERS:NULL
//
//PURPOSE AND ALGORITHMS:
//            通过循环调用话音用户链表中移动台的更新激活集功率函数,最终将
//            更新所有扇区的话音功率
//                                               
//AUTHOR:     Li Jing
//
//CALLING FUNCTIONS:
//            CMobile::UpdateActiveSetPower()
//////////////////////////////////////////////////////////////////////////
void CMsManager::UpdateSectorVoicePower()
{
	POSITION pos;
	CSector* pSector=NULL;
	CVoiceMs* pVoiceMs=NULL;

	pos=m_VoiceList.GetHeadPosition();
	while(pos!=NULL)                           //循环话音链表中的每个话音用户
	{
		pVoiceMs=m_VoiceList.GetNext(pos);
		pVoiceMs->UpdateActiveSetPower();  
		//将每一个话音用户激活集中各扇区的发射功率累加到相应扇区中
	}
}



//////////////////////////////////////////////////////////////////////////
//TITLE:      UpdateSetPower(更新移动台的监测集函数)				        
//
//PARAMETERS:NULL
//
//PURPOSE AND ALGORITHMS:
//            每个窗口结束时,计算这个窗口时间内的误块率,若是高于15%,则
//            为outage,若是高于50%,则为drop,并进行重撒。
//                                               
//AUTHOR:     Li Jing
//
//CALLING FUNCTIONS:
//            CMobile::UpdateMonitorSet()
//////////////////////////////////////////////////////////////////////////	
void CMsManager::UpdateSetPower()
{
	POSITION pos;


	//updata the voice users' monitorset
	CVoiceMs* pVoiceMs=NULL;
	pos=m_VoiceList.GetHeadPosition();
	while(pos!=NULL)
	{
		pVoiceMs=m_VoiceList.GetNext(pos);
		pVoiceMs->UpdateMonitorSet();
	}



    //updata the http users' monitorset
	CHttpDataMs* pHttpDataMs=NULL;
	pos=m_HttpDataList.GetHeadPosition();
	while(pos!=NULL)
	{
		pHttpDataMs=m_HttpDataList.GetNext(pos);
		pHttpDataMs->UpdateMonitorSet();
	}



	//updata the ftp users' monitorset
	CFtpDataMs* pFtpDataMs=NULL;
	pos=m_FtpDataList.GetHeadPosition();
	while(pos!=NULL)
	{
		pFtpDataMs=m_FtpDataList.GetNext(pos);
		pFtpDataMs->UpdateMonitorSet();
	}

	//updata the Video users' monitorset
	CVideoDataMs* pVideoDataMs=NULL;
	pos=m_VideoDataList.GetHeadPosition();
	while(pos!=NULL)
	{
		pVideoDataMs=m_VideoDataList.GetNext(pos);
		pVideoDataMs->UpdateMonitorSet();
	}

} 



//////////////////////////////////////////////////////////////////////////
//TITLE:      Coverage(覆盖性能评估函数)				        
//
//PARAMETERS:NULL         
//
//PURPOSE AND ALGORITHMS:
//            输出中间三个扇区的覆盖情况 
//                                                           
//AUTHOR:     Li Jing(20040820)
//
//CALLING FUNCTIONS:
//            
//
//CALLED FUNCTIONS:
//            CNetworkDrive::SlotRun()
//            
//////////////////////////////////////////////////////////////////////////
void CMsManager::Coverage()
{
	CStdioFile f;
	char FileName[40];
	char buf[50];
    CString sp;
	sp="Coverage.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();
	//使文件指针指向文件尾部,输出数据可以在文件尾部接着写
	
	f.WriteString("\nThe coverage performance of slot ");
	_itoa(m_iSlotCurrentNum,buf,10);
	f.WriteString(buf);
	f.WriteString("\n移动台ID	距最佳扇区距离(Km)	最佳扇区导频SNR(dB)   Ior/Ioc(dB)	\n");

	int   iMsID;
	float fDistance;
	float fBestPilotSNR;
	float fIor2IocindB;
	SECTORID_TYPE stBestSector;
	CELLID_TYPE stCell;
	POSITION pos;
	pos=m_VoiceList.GetHeadPosition();
	CVoiceMs* pVoiceMs=NULL;

	while(pos!=NULL)
	{
		pVoiceMs=m_VoiceList.GetNext(pos);
        stBestSector=pVoiceMs->GetBestSector();
		stCell=stBestSector.stCellID;
		if(stCell.m==3&&stCell.n==3)
		{
			iMsID=pVoiceMs->GetMsID();
			fDistance=pVoiceMs->GetMsBsDistance();
			fBestPilotSNR=pVoiceMs->GetBestPilotSNR();
			fIor2IocindB=pVoiceMs->GetIor2Ioc();
			fIor2IocindB=(float)(10*log10(fIor2IocindB));

			_gcvt(iMsID,8,buf);
		    f.WriteString(buf);
		    f.WriteString("\t");
		    _gcvt(fDistance,8,buf);
		    f.WriteString(buf);
		    f.WriteString("\t");
			_gcvt(fBestPilotSNR,8,buf);
		    f.WriteString(buf);
		    f.WriteString("\t");
			_gcvt(fIor2IocindB,8,buf);
		    f.WriteString(buf);
		    f.WriteString("\n");
		}
	}

}



////数据用户输出统计部分 by陈美娅
//////////////////////////////////////////////////////////////////////////
//
//	TITLE:	数据移动台统计量计算函数
//
//	PURPOSE:		循环处理数据移动台得到计算相应统计量
//
//	SAMPLE CALL:	pMsManager->DataMsStaticsCumulate()
//			
//	CALLED BY FUNCTIONS:CNetWorkDrive::SimulationRun()
//			
//	CALLING FUNCTIONS:
//				
//	
//	AUTHOR:	Chen Meiya 
//
//	DATE:	04/04(MM/YY)
//
////////////////////////////////////////////////////////////////////////////
void CMsManager::DataMsStatisticsCalculate()
{
	POSITION pos;
	CDataMs *pDataMs;

	pos = m_HttpDataList.GetHeadPosition();
	while(	pos != NULL	)
	{
		pDataMs = m_HttpDataList.GetNext(pos);

		//计算距离
		pDataMs->ClosestSectorDistance();
		//计算业务相关统计量
		pDataMs->SerivceStatisticsCalculate();
	}

	pos = m_FtpDataList.GetHeadPosition();
	while(	pos != NULL	)
	{
		pDataMs = m_FtpDataList.GetNext(pos);

		//计算距离
		pDataMs->ClosestSectorDistance();
		//计算业务相关统计量
		pDataMs->SerivceStatisticsCalculate();
	}

	//20060116
	pos = m_VideoDataList.GetHeadPosition();
	while(	pos != NULL	)
	{
		pDataMs = m_VideoDataList.GetNext(pos);

		//计算距离
		pDataMs->ClosestSectorDistance();
		//计算业务相关统计量
		pDataMs->SerivceStatisticsCalculate();
	}
}

//////////////////////////////////////////////////////////////////////////
//
//	TITLE:	扇区统计变量累加函数
//
//	PURPOSE:		累加移动台每个TTI的统计量到对应服务扇区中
//
//	SAMPLE CALL:	pMsManager->SectorStaticsCumulate()
//			
//	CALLED BY FUNCTIONS:CNetWorkDrive::SimulationRun()
//			
//	CALLING FUNCTIONS:
//				
//	
//	AUTHOR:	Chen Meiya 
//
//	DATE:	04/04(MM/YY)
//
////////////////////////////////////////////////////////////////////////////
void CMsManager::SectorStaticsCumulate()
{
	POSITION pos;
	CDataMs *pDataMs;
	pos = m_HttpDataList.GetHeadPosition();

	while(	pos != NULL	)
	{
		pDataMs = m_HttpDataList.GetNext(pos);
		if( pDataMs->GetUserType() == DCHData )
		{
			if(	pDataMs->IsAdmitted() == true && pDataMs->IsTTIEnd() == true	)
			pDataMs->SectorStatistics();
		}
		
		
	}

	pos = m_FtpDataList.GetHeadPosition();
	
	while(	pos !=	NULL )
	{
		pDataMs = m_FtpDataList.GetNext(pos);
		if( pDataMs->GetUserType() == DCHData )
        {
			if(	pDataMs->IsAdmitted() == true && pDataMs->IsTTIEnd() == true )
			pDataMs->SectorStatistics();
        }
//		else if( pDataMs->GetUserType() == HSDSCHData )
//		{
			
			//if()  //只对调度上的用户处理
//			pDataMs->SectorStatistics();
//		}
		
	}
}

//////////////////////////////////////////////////////////////////////////
//
//	TITLE:	比特数和分组数累加函数函数
//
//	PURPOSE:		累加所有移动台成功传输的比特数和分组数
//
//	SAMPLE CALL:	pMsManager->DataBitAndPacketCumulate()
//			
//	CALLED BY FUNCTIONS:CNetWorkDrive::SimulationRun()
//			
//	CALLING FUNCTIONS:
//				
//	
//	AUTHOR:	Chen Meiya 
//
//	DATE:	04/04(MM/YY)
//
////////////////////////////////////////////////////////////////////////////	

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -