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

📄 cnetworkdrive.cpp

📁 此程序为wcdma系统当中ftp/video业务模型的c++程序仿真 通过此程序 能得到此两种业务在多种条件下的吞吐量和无码率的性能
💻 CPP
📖 第 1 页 / 共 4 页
字号:
	#ifdef _DEBUG
		afxDump<<"Unable to open file"<<"\n";	//异常处理
	#endif
	}

	for (ii=0;ii<SubslotNumber*FastFadingValueLength;ii++)
	{
		f1.ReadString(buf,100);
		fFastFadingValue_4[ii]=(float)strtod(buf,&q);
	}

	f1.Close();

	/* 打开数据文件准备读*/
	if(!f1.Open("wchannelmodel-resultE.txt",CFile::modeRead))
	{
	#ifdef _DEBUG
		afxDump<<"Unable to open file"<<"\n";	//异常处理
	#endif
	}

	for (ii=0;ii<SubslotNumber*FastFadingValueLength;ii++)
	{
		f1.ReadString(buf,100);
		fFastFadingValue_5[ii]=(float)strtod(buf,&q);
	}

	f1.Close();


}

//zl 20060329
void CNetworkDrive::ReadData_VideoPacketValue()
{
	CStdioFile f1;		//定义一个I/O文件对象
	char buf[100];
	int ii;
	char* q;
	/* 打开数据文件准备读*/
	if(!f1.Open("MPEG4_trace.txt",CFile::modeRead))
	{
	#ifdef _DEBUG
		afxDump<<"Unable to open file"<<"\n";	//异常处理
	#endif
	}

	for (ii=0;ii<36000;ii++)
	{
		f1.ReadString(buf,100);
		iVideoPacketSize[ii]=(float)strtod(buf,&q);
	}

	f1.Close();
}

//////////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////////
void CNetworkDrive::CheckTheInputs()
{
	ASSERT(m_iDropNum>0);
	ASSERT(m_iSlotNum>0);
	ASSERT(m_ServiceArea.GetSiteDistance()>0);
	ASSERT((m_ServiceArea.GetOrthogonalFactor()>0)&&
			(m_ServiceArea.GetOrthogonalFactor()<=1));
	ASSERT(m_MsManager.GetVoiceNumPerSector()>=0);
	//ASSERT(m_MsManager.GetDataNumPerSector()>=0);
	//ASSERT((m_MsManager.GetFractionHttp()>=0)&&
	//		(m_MsManager.GetFractionHttp()<=1));
	//ASSERT((m_MsManager.GetFractionFtp()>=0)&&
	//		(m_MsManager.GetFractionFtp()<=1));
//	ASSERT(m_MsManager.GetFractionFtp()+m_MsManager.GetFractionHttp()<=1.0000000001);
//slj	ASSERT(m_MsManager.m_iActiveSetMaxSize>0);
	ASSERT(m_MsManager.m_fPowerControlStep>0);
	ASSERT(m_MsManager.m_iSoftHandoffDelay>-1);
	ASSERT(m_MsManager.m_fC2IThreshold>-100);
//  ASSERT(m_MsManager.m_fC2ITarget>-100);
	ASSERT((m_MsManager.m_fMaxFractionOfTrafficPower>0)&&
			(m_MsManager.m_fMaxFractionOfTrafficPower<1));
	ASSERT(m_MsManager.m_fDynamicRangeOfTrafficPower>0);
	ASSERT((m_MsManager.m_fBEROfPC>=0)&&(m_MsManager.m_fBEROfPC<=1));
	//ASSERT(m_MsManager.m_iMaxTransmissionNum>0);
	//ASSERT(m_MsManager.m_iCellSwitchDelay>0);
	//ASSERT((m_MsManager.m_fErrorRateOfFeedBack>=0)&&
	//	(m_MsManager.m_fErrorRateOfFeedBack<=1));
	//ASSERT(m_MsManager.m_fAlpha>0);
	//ASSERT(m_MsManager.m_fK>0);
	//ASSERT(m_MsManager.m_iMaxDataBitsNum>0);
	//ASSERT(m_MsManager.m_fMeanIntervalOfPacketCall);
	
}

//////////////////////////////////////////////////////////////////////////
//
//	TITLE:	Drop初始化函数
//
//	PURPOSE:完成一个drop内的基站和移动台的初始化。
//
//	SAMPLE CALL:
//			CNetworkDrive mysystem;
//			mysystem.SystemInitialization();
//			...
//			<in a function of the class CNetworkDrive>
//			for (m_iDropCurrentNum=0;m_iDropCurrentNum<6;
//				m_iDropCurrentNum++)
//				DropInitialization();
//
//	AUTHOR:	Ouyang Hui
//
//	DATE:	01/04/04
//
//	CALLED BY FUNCTIONS:
//			CNetworkDrive::SimulationRun()
//
//	CALLING FUNCTIONS:
//			CMsManager::MsInitialization()
//
//	MODIFICATION SINCE 01/04/04:
//
///////////////////////////////////////////////////////////////////////////

void CNetworkDrive::DropInitialization()
{

	cout<<"Drop "<<m_iDropCurrentNum<<" initialization..."<<endl;

	m_ServiceArea.Initialization(m_iSlotNum,m_fTimePerDrop);
	m_MsManager.MsInitialization(&m_ServiceArea);

	cout<<"Initialization:\n";
	m_ServiceArea.OutputSectorPower();
}

//////////////////////////////////////////////////////////////////////////
//
//	TITLE:		仿真流程主函数
//
//	PURPOSE:	调用系统初始花函数,开始drop循环,调用drop初始化函数,
//				开始时间循环,调用时隙仿真函数,调用数据统计函数,等。
//
//	SAMPLE CALL:
//				CNetworkDrive mysystem;
//				mysystem.Simulation;
//
//	NOTE:		This is the main function in the whole program
//
//	CALLING FUNCTIONS:
//				CNetworkDrive::SystemInitialization()
//				CNetworkDrive::DropInitialization()
//				CNetworkDrive::SlotRun()
//				CServiceArea::PortionOfBsOutrage()
//				CNetworkDrive::DataStatics()
//
//	AUTHOR:		Ouyang Hui
//
//	DATE:		01/04/04
//
//	MODIFICATION SINCE 01/04/04:
//
//////////////////////////////////////////////////////////////////////////

void CNetworkDrive::SimulationRun()
{
	cout<<"The function CNetworkDrive::SystemInitialization() is being called!\n";

	//设置仿真参数,初始化驱动与网络功能模块的必要参数
	SystemInitialization();
	
	//开始snap-shot循环
	for ( m_iDropCurrentNum=1;m_iDropCurrentNum<=m_iDropNum; 
			m_iDropCurrentNum++)
	{

		//创建移动台队列
		m_MsManager.AddUser();

		//移动台管理与数据统计模块控制创建一定数量的移动台模块,
		//完成移动台初始化过程,插入对应的移动台模块队列。
		DropInitialization();


		//开始时间驱动仿真循环
		for (m_iSlotCurrentNum=1;m_iSlotCurrentNum<=m_iSlotNum;
				m_iSlotCurrentNum++)
				SlotRun();


		//m_ServiceArea.PortionOfBsOutrage(m_iDropCurrentNum);
		//累计数据移动台统计信息
		m_MsManager.DataBitAndPacketCumulate();

		//累计服务区环境中各个扇区的统计量
		m_ServiceArea.SectorStatics();

		//计算统计量并将数据输出统计
		DataStaticsAndOutput();

		//输出扇区平均发射功率
        m_ServiceArea.AvePowerOutput();

		//清除移动台队列
		m_MsManager.Clean();

		//清除相关统计量
		m_MsManager.StatisticsReset();
	}
}



//////////////////////////////////////////////////////////////////////////
//
//	TITLE:	时隙仿真函数
//
//	PURPOSE:调用CmsManager中的函数完成话音用户的循环,调用CserviceArea
//			中的函数完成分组信道功率的计算,调用CmsManager中的函数完成数据用
//			户的处理,调用CserviceArea和CmsManager中的函数完成数据传输和服务
//			质量评估。
//
//	SAMPLE CALL:
//			CNetworkDrive mysystem;
//			...
//			<in a function of the class CNetworkDrive>
//			for (m_iDropCurrentNum=0;m_iDropCurrentNum<6;
//				m_iDropCurrentNum++)
//				for (m_iSlotCurrentNum=0;m_iSlotCurrentNum<6;
//					m_iSlotCurrentNum++)
//					mysystem.SlotRun();
//
//	CALLED BY FUNCTIONS:
//			CNetworkDrive::SimulationRun()
//
//	CALLING FUNCTIONS:
//			CServiceArea::SystemReset()
//			CMsManager::VoiceProcess()
//			CServiceArea::PacketChannelPower()
//			CMsManager::DataProcess()
//			CServiceArea::DataTransmission()
//			CMsManager::MsThroughputStatistics() (Removed)
//			CMsManager::MsC2IStatistics()
//
//	AUTHOR:	Ouyang Hui
//
//	DATE:	01/04/04
//
//	MODIFICATIONS SINCE 01/04/04
//
////////////////////////////////////////////////////////////////////////////

void CNetworkDrive::SlotRun()
{
	m_ServiceArea.TTINumAddOne();//wlm


	//测试用程序段,表明程序进程
	if(m_iSlotCurrentNum%100==0)
	cout<<"Now is in drop "<<m_iDropCurrentNum
		<<" of "<<m_iDropNum
		<<" and slot "<<m_iSlotCurrentNum
		<<" of "<<m_iSlotNum<<endl;

	m_MsManager.m_iSlotCurrentNum=m_iSlotCurrentNum;
	m_MsManager.m_iDropCurrentNum=m_iDropCurrentNum;
	

/*
	if(m_iSlotCurrentNum==700)
	{
		cout<<"stop"<<endl;
	}
*/





	//循环处理话音业务移动台,计算服务质量,更新衰落值和切换状态,进行功率控制
	//m_MsManager.VoiceProcess();

	////计算服务区环境中各个扇区DCH信道数据用户可用功率
	m_ServiceArea.DCHAvailablePowerCalculate();
	
	////对DCH数据移动台队列进行处理
	m_MsManager.DCHDataMsListProcess();

	////完成接纳控制成功的DCH信道数据移动台的软切换、功率控制和数据传输
	m_MsManager.DCHMsListProcess();

	////计算服务区环境中各个扇区HSDSCH信道数据用户的可用功率
	//by zl
	m_ServiceArea.HSDSCHAvailablePowerCalculate(); //20050428

	if(m_iSlotCurrentNum%3==1)
	{
	   if(DelayedSlot>0 && IsPredict==true)
	       m_MsManager.UpdatePredictionQueue();
	}
	////对HSDSCH数据移动台队列进行处理,调度
	if (m_ServiceArea.GetTTINum() %3 == 1)//wlm 060223 第一子时隙时,或调度成功时
	{
		m_MsManager.HSDSCHDataListProcess();
	}
	else
	{
		m_MsManager.FillQueue();      //zl 20060404
	}
	//20051223
	if(m_iSlotCurrentNum%3!=1)
	  m_MsManager.UserC2ICalculate();

	if(m_iSlotCurrentNum%3==0)
	{
		m_MsManager.UserMeanC2ICalculate();
		if(DelayedSlot>0 && IsPredict==false)
		   m_MsManager.UpdateDelayedQueue();
	}
	
	////完成各个扇区HSDSCH信道用户队列中用户的子信道分配、数据传输、统计
	//by zl
if(m_ServiceArea.GetTTINum()%3 == 1)//wlm 060223 第一子时隙时,或调度成功时
{
	m_ServiceArea.HSDSCHProcess();
/*

	//20051228
	if(m_iSlotCurrentNum%3==0)
	{
		if(DelayedSlot>0 && IsPredict==false)
		   m_MsManager.UpdateDelayedQueue();
	}*/


	////基站处理反馈信息
	//by zl
	m_MsManager.FeedbackProcess();

	//by zl 20050511
//	m_MsManager.MeanIor2Ioc();


	////更新扇区总的发射功率
	m_ServiceArea.TxPower();

// 	m_MsManager.OutPutThreshold();


	if(m_iSlotCurrentNum%100==0)
	{	
		m_ServiceArea.OutputSectorPower();
		m_ServiceArea.CalculateAveragePower();
	}

	if(m_iSlotCurrentNum%750==0)
	{
        m_MsManager.Coverage();
	}

	//m_ServiceArea.SectorPowerToFile(m_iSlotCurrentNum);
	////更新各个移动台监测集信息
	m_MsManager.UpdateSetPower();		//更新各移动台监测集功率
	//////////////////////////////////////////////////////////////////
	
	if (m_iSlotCurrentNum>INITIALSLOT)
		m_MsManager.SectorStaticsCumulate();
}
    //zl 20060302
    if(m_iSlotCurrentNum%3==0)
	{
        m_MsManager.DropVideoPacket();
		m_MsManager.DelaytoDrop();
	}

	
/*
	if(m_iSlotCurrentNum>INITIALSLOT&&m_iSlotCurrentNum%3==0)
	{
		m_MsManager.UpdateWFactor();
	}*/



    
}

//////////////////////////////////////////////////////////////////////////
//
//	TITLE:	数据统计函数
//
//	PURPOSE:完成所有的数据统计,包括调用CMsManager中的函数统计与移动台有关的
//			数据,调用CServiceArea中的函数
//
//	SAMPLE CALL:
//			CNetworkDrive mysystem;
//			...
//			mysystem.DataProcess();
//
//	CALLED BY FUNCITONS:
//			CNetworkDrive::SimulationRun()
//
//	CALLING FUNCTIONS:
//			CMsManager::MsThroughputStatistics()
//			CMsManager::VoiceStatistics()
//			CMsManager::MeanThroughputStatistics()
//			CMsManager::MeanPERStatistics()
//
//	AUTHOR:	Ouyang Hui
//
//	DATE:	01/04/04
//
//	MODIFICATIONS SINCE 01/04/04:
//
///////////////////////////////////////////////////////////////////////////

void CNetworkDrive::DataStaticsAndOutput()
{
	//for compile 目前只考察数据移动台
	m_MsManager.VoiceStatistics();
	m_MsManager.DataMsStatisticsCalculate();
	m_MsManager.MeanThroughputStatistics();	
	m_MsManager.MsThroughputStatistics();
 	m_MsManager.MsFairnessStatistics();     //20051205
// 	m_MsManager.MaxRatioThrStatistics();    //20051205
	m_MsManager.VideoDropRatioStatistics(); //zl 20060302 
	m_MsManager.VideoPacketDropRatioStatistics(); //zl 20060328
//	m_MsManager.MsASTStatistics();
//	m_MsManager.MsDelayStatistics();
//	m_MsManager.DCHMsDropRatio();
}

////////////////////////////////////////////////////////
//各类接口函数

int		CNetworkDrive::GetDropCurrentNum()		//获取当前drop序号
{
	return m_iDropCurrentNum;
}

void	CNetworkDrive::SetDropCurrentNum(int ip)			//设置当前drop序号
{
	m_iDropCurrentNum=ip;
}

int		CNetworkDrive::GetSlotCurrentNum()			//获取当前时隙序号
{
	return m_iSlotCurrentNum;
}

void	CNetworkDrive::SetSlotCurrentNum(int ip)		//设置当前时隙序号
{
	m_iSlotCurrentNum=ip;
}

int		CNetworkDrive::GetDataStaticsDropNum()		//获取数据采集的drop号
{
	return m_iDataStaticsDropNum;
}

int		CNetworkDrive::GetDataStaticsSlotNum()		//获取数据采集的时隙号
{
	return m_iDataStaticsSlotNum;
}

int		CNetworkDrive::GetStaticsFileNum()			
		//获取数据统计用文件个数
{
	return m_iStaticsFileNum;
}

void	CNetworkDrive::SetDataStaticsDropNum(int ip)	
	//设置数据采集的drop号
{
	m_iDataStaticsDropNum=ip;
}

void	CNetworkDrive::SetDataStaticsSlotNum(int ip)	
	//设置数据采集的时隙号
{
	m_iDataStaticsSlotNum=ip;
}

void	CNetworkDrive::SetStaticsFileNum(int ip)		
	//设置数据统计用文件个数
{
	m_iStaticsFileNum=ip;
}

⌨️ 快捷键说明

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