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

📄 cmobile.cpp

📁 此程序为wcdma系统当中ftp/video业务模型的c++程序仿真 通过此程序 能得到此两种业务在多种条件下的吞吐量和无码率的性能
💻 CPP
📖 第 1 页 / 共 5 页
字号:
//            初始化激活集时,移动台与最佳扇区进行接纳控制,或者软切换时的接纳控制,
//            如果接纳成功,基站就会给移动台分配功率。这时就要将分配的功率累加到
//            扇区的话音功率或是DCH功率中去。这是由于优先权顺序是:话音用户>DCH
//            用户>DSCH用户。所以实现时就要首先考虑话音用户,并累加话音用户的功率,
//            将剩余的功率分给分组用户;再考虑DCH用户,并累加DCH用户的功率,再将
//            剩下的功率分给DSCH用户;最后基站根据可以使用的DSCH功率(即上面使用
//            剩下的功率),进行调度。需要注意的是:
//
//            对于InitActiveSet(),ObtainC2I()这两个函数,DSCH状态的移动台都不需要调用。
//            所以在DataInitialization()中,应该先判断用户类型,若是DSCH用户,就不执行
//            这两个函数。
//				
//////////////////////////////////////////////////////////////////////////
void   CMobile::InitActiveSet()
{                                   
	
	CSector* pSector=NULL;          //指向Sector对象的指针
	bool  admitted;                 //是否接纳的标志
	float fOrthogonalFactor;        //正交因子
	float fFastFading;              //快衰值
	float fOtherChannelPower;       //本扇区其他信道的干扰,单位:mw
	float fOtherSectorInterference; //从别的扇区来的干扰
	float fTempTrafficPower;        //移动台要求基站的发射功率
	float fMaxTrafficPower;         //最大业务信道功率,单位:mw
	float fMinTrafficPower;         //业务信道功率动态范围(最小值)
	float fC2ITarget;               //目标C/I
	ACTIVESECTOR_TYPE* pTempActiveSector=NULL;//临时激活扇区指针
	
	m_iActiveSetSize=0;             //激活集链表初始大小置零

	if(m_fBestPilotSNR<PILOTSNRTHRESHOLD)
	{
		m_bIsAdmitted=false;
	}

	else
	{
	    fC2ITarget=m_fC2ITarget;
	    fC2ITarget=(float)(pow(10,(fC2ITarget/10)));
			  //转化为倍数
	
	    fOrthogonalFactor=m_pServiceArea->GetOrthogonalFactor();
        fFastFading=(m_aMonitorSector[m_iBestSectorIndex].fFastFading[0]
                +m_aMonitorSector[m_iBestSectorIndex].fFastFading[1]
	            +m_aMonitorSector[m_iBestSectorIndex].fFastFading[2]
		        +m_aMonitorSector[m_iBestSectorIndex].fFastFading[3])/(float)4;
	    fOtherChannelPower=m_pServiceArea->GetSector(m_stBestSector)->
				   GetTxPower()*m_aMonitorSector[m_iBestSectorIndex].fPropagationLoss*fFastFading;
	    fOtherSectorInterference=m_aMonitorSector[m_iBestSectorIndex].fInterferenceFromOtherSector;

	    fTempTrafficPower=(float)(fC2ITarget*
			  (fOtherSectorInterference
			  +fOtherChannelPower*fOrthogonalFactor+NoisePower)
			  /(m_aMonitorSector[m_iBestSectorIndex].fPropagationLoss*fFastFading));
					//业务信道功率赋初值
//	if(m_eUsertype==voice)
//	{
	        fMaxTrafficPower=m_pMsManager->m_fMaxFractionOfTrafficPower
				         *m_pServiceArea->GetSector(m_stBestSector)->
				         GetMaxPower(); 
					//计算业务信道最大功率(为最大发射功率乘以最大业务信道所占的最大比例)
			fMinTrafficPower=(float)(fMaxTrafficPower
					 /pow(10,(m_pMsManager->m_fDynamicRangeOfTrafficPower/10)));
//	}
//	else
//	{
//			fMaxTrafficPower = m_pServiceArea->GetSector(m_stBestSector)->GetMaxPacketPower();
//		    fMinTrafficPower=(float)(fMaxTrafficPower
//					 /pow(10,(m_pMsManager->m_fDynamicRangeOfPacketPower/10)));
//	}								
							
	    if(fTempTrafficPower>fMaxTrafficPower)  //如果算出来的功率大于功率最大值
		        fTempTrafficPower=fMaxTrafficPower;//则将业务信道功率赋最大值
	    if(fTempTrafficPower<fMinTrafficPower)  //如果业务信道功率小于动态范围
			fTempTrafficPower=fMinTrafficPower;//就将业务信道功率置为最小值(动态范围)
							
	    pSector=m_pServiceArea->GetSector(m_stBestSector);
	    //得到最佳扇区的指针
	    admitted=pSector->AdmissionControl(m_pMsManager->m_iSlotCurrentNum,fTempTrafficPower);
	    //移动台与最佳扇区进行接纳尝试
        if(admitted)           
		{
			m_bIsAdmitted=true;
			//是否接纳成功的标识置为true
			
			pTempActiveSector=new ACTIVESECTOR_TYPE;
				  //开始将最佳扇区放入移动台的激活集
			pTempActiveSector->fTrafficPower=fTempTrafficPower;  
				  //激活扇区业务信道功率赋初值
		    
			//add the new allocated transmitted power to the best sector
			if(m_eUsertype==voice)
	        {
		            pSector->
					        VoicePowerCumulate(pTempActiveSector->fTrafficPower);
						         //将功率累加到话音功率中去
			}
			else
			{
			        pSector->
					        DCHPowerCumulate(pTempActiveSector->fTrafficPower);
						         //将功率累加到DCH功率中去
			}
			//update the total power of the best sector
			pSector->TxPowerUpdate();
           
			pTempActiveSector->fTrafficC2I=(float)(10*log10(fC2ITarget));
				  //激活扇区业务信道C/I先置为目标值,等执行UpdateActiveSet时再计算C/I
			pTempActiveSector->iIndexInMonitor=m_iBestSectorIndex;
				  //激活扇区在监测集数组中的下标赋初值
			pTempActiveSector->stSectorID=m_stBestSector;   
				  //激活扇区的扇区标号赋初值
			m_ActiveSetList.AddTail(pTempActiveSector);           
			      //将生成的激活扇区加入激活集
			m_aMonitorSector[m_iBestSectorIndex].bIsInActive=true;          
				  //该监测扇区是在激活集中
			m_iActiveSetSize++;                               
				  //更新激活集链表长度

		}   
        else
            m_bIsAdmitted=false;
                  //是否接纳成功的标识置为false
	}
	
}



//////////////////////////////////////////////////////////////////////////
//TITLE:      UpdateMonitorSet(监测集信息更新函数)							
//
//PARAMETERS:NULL
//
//PURPOSE AND ALGORITHMS:
//	          更新监测集数组中各项的慢衰、总损耗和接收功率值。
//            完成各项的干扰、功率与信噪比值的更新。
//            与初始化监测集时相类似,更新监测集时整个函数也主要是两次多重循环:
//            第一次循环,更新每一个监测扇区到移动台的fPowerFromTheSector值,
//            并更新m_fInterferenceFromOtherSector值
//            第二次循环,更新各监测扇区的fPilotSNR,并更新其他一些参数
//
//AUTHOR:     Li Jing
//
//CALLING FUNCTIONS:
//            CChannelModel::GetFadingValues()
//            CServiceArea::GetCell()
//            CSector::GetSectorOrientation()
//            CServiceArea::GetSector()
//            CSector::GetTxPower()
//            CSector::GetPilotPower()
//            CServiceArea::GetOrthogonalFactor()
//            CMobile::ObtainBestSector() 
//
//NOTES:      原先是在更新监测集后就更新最佳扇区,现在将更新最佳扇区改为
//            话音用户与数据用户分开处理。      
//		
//////////////////////////////////////////////////////////////////////////
void CMobile::UpdateMonitorSet()
{
/*	CStdioFile f;
	char buf[50];
	char FileName[40];
    CString sp;
	sp="266.txt";
	strcpy(FileName,sp);*/
	
	int   i,j,k;
	float fOtherChannelPower;
	float fOrthogonalFactor;
	
    float fFastFading;                          //新增内部参数,快衰值,为四个子时隙的平均
//	SECTORID_TYPE sectorid;                     //新增内部参数,为移动台所在扇区的标号(根据移动台的归属坐标确定)       
	m_iSlotCount++;
	
	float fPowerSummation;
    fPowerSummation=0.0;
	m_pFadingValuePointer=m_ChannelModel.GetFadingValues(m_iSlotCount);
		//根据当前时隙数,更新衰落数组(后续值)的首地址。
/*    if(m_iMsID==266)
	{
	    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("\nvalues of this mobile of this slot:\n");
	}*/

	for(i=0;i<19;i++)                  //第一次循环,更新每一个监测扇区到移动台的fPowerFromTheSector值
	{       
		for(j=0;j<SectorNumber;j++)                   
		{
			m_aMonitorSector[i*SectorNumber+j].fSlowFading
				=m_pFadingValuePointer[i].fSlowFading;
				//将属性中慢衰值更新。实际上是每半秒钟才将慢衰更新一次,其间都是维持
				//一个相同的慢衰值不变
					
			m_aMonitorSector[i*SectorNumber+j].fPropagationLoss
				=m_aMonitorSector[i*SectorNumber+j].fPathLoss
				*m_aMonitorSector[i*SectorNumber+j].fAntennaGain
				*m_aMonitorSector[i*SectorNumber+j].fSlowFading
				*(float)pow(10,(MsAntennaGain-OtherLosses)/10);
			        //总的损耗值更新(实际上总的损耗值中只有慢衰值需要每半秒更新一次)

			for(k=0;k<SubslotNumber;k++)
					m_aMonitorSector[i*SectorNumber+j].fFastFading[k]
						=m_pFadingValuePointer[i].fFastFadingSet[j][k];
			fFastFading=(m_aMonitorSector[i*SectorNumber+j].fFastFading[0]
				    +m_aMonitorSector[i*SectorNumber+j].fFastFading[1]
				    +m_aMonitorSector[i*SectorNumber+j].fFastFading[2]
				    +m_aMonitorSector[i*SectorNumber+j].fFastFading[3])/(float)4;
				    //取四个子时隙的快衰值,并求平均

			m_aMonitorSector[i*SectorNumber+j].fPowerFromTheSector
				=m_pServiceArea
				->GetSector(m_aMonitorSector[i*SectorNumber+j].stSectorID)
				->GetTxPower()
				*m_aMonitorSector[i*SectorNumber+j].fPropagationLoss
				*fFastFading;
			        //更新扇区到达移动台的总功率(干扰)
			
/*	if(m_iMsID==1)
	{
        fPower=fFastFading;
		_gcvt(fPower,8,buf);
	    f.WriteString(buf);
	    f.WriteString(" ");
	}*/		
			fPowerSummation+=m_aMonitorSector[i*SectorNumber+j].fPowerFromTheSector;
		}
	}
	
	/*	    if(m_iMsID==1)
        {
		    f.WriteString("\nInterferenceFromOtherSector:");
		    _gcvt(m_fInterferenceFromOtherSector,8,buf);
	        f.WriteString(buf);                         
	        f.WriteString("\n");
			f.Close();
        }*/

    for(i=0;i<19;i++)         //第二次循环,更新各监测扇区的fPilotSNR,并更新其他一些参数
                for(j=0;j<SectorNumber;j++)
                {
					   //上面算出的fPowerSummation值是移动台全部21个监测扇区fPowerFromTheSector
                       //值的累加,而实际上应该去掉本监测扇区的fPowerFromTheSector值。这样得到的
                       //才是更新后的移动台所在监测扇区受到的来自其它扇区的干扰
					   m_aMonitorSector[i*SectorNumber+j].fInterferenceFromOtherSector
						   =fPowerSummation-m_aMonitorSector[i*SectorNumber+j].fPowerFromTheSector;
					
					   fFastFading=(m_aMonitorSector[i*SectorNumber+j].fFastFading[0]
				                   +m_aMonitorSector[i*SectorNumber+j].fFastFading[1]
				                   +m_aMonitorSector[i*SectorNumber+j].fFastFading[2]
				                   +m_aMonitorSector[i*SectorNumber+j].fFastFading[3])/(float)4;
                       m_aMonitorSector[i*SectorNumber+j].fPilotPower
					         =m_pServiceArea
					         ->GetSector(m_aMonitorSector[i*SectorNumber+j].stSectorID)
					         ->GetPilotPower()
					         *m_aMonitorSector[i*SectorNumber+j].fPropagationLoss
					         *fFastFading;   
					         //监测扇区到达移动台的导频功率
		               fOtherChannelPower=m_pServiceArea
					         ->GetSector(m_aMonitorSector[i*SectorNumber+j].stSectorID)
					         ->GetTxPower()*
					         m_aMonitorSector[i*SectorNumber+j].fPropagationLoss
					         *fFastFading
					         -m_aMonitorSector[i*SectorNumber+j].fPilotPower;      
					         //本监测扇区其他信道到达移动台的功率
                       fOrthogonalFactor=m_pServiceArea->GetOrthogonalFactor();     
			
		               m_aMonitorSector[i*SectorNumber+j].fPilotSNR
			                 =(float)(m_aMonitorSector[i*SectorNumber+j].fPilotPower
			                 /(fOtherChannelPower/**fOrthogonalFactor*/
			                 +m_aMonitorSector[i*SectorNumber+j].fInterferenceFromOtherSector
			                 +NoisePower));  //本监测扇区到达移动台的SNR

/*                       if(m_iMsID==266)
					   {
					       f.WriteString("fOtherChannelPower:");
		                   _gcvt(fOtherChannelPower,8,buf);
	                       f.WriteString(buf);                         
	                       f.WriteString("\n");

                           f.WriteString("sectortxpower:");
		                   _gcvt(m_pServiceArea
					         ->GetSector(m_aMonitorSector[i*SectorNumber+j].stSectorID)
					         ->GetTxPower()*m_aMonitorSector[i*SectorNumber+j].fPropagationLoss
					         *fFastFading,8,buf);
	                       f.WriteString(buf);                         
	                       f.WriteString("\n");

						   f.WriteString("pilotPower:");
		                   _gcvt(m_aMonitorSector[i*SectorNumber+j].fPilotPower,8,buf);
	                       f.WriteString(buf);                         
	                       f.WriteString("\n\n");
					   }*/

		               m_aMonitorSector[i*SectorNumber+j].fPilotSNR
			                 =(float)(10*log10(m_aMonitorSector[i*SectorNumber+j].fPilotSNR));
					         //转化为dB值
                       
                       m_aMonitorSector[i*SectorNumber+j].bIsBestSector=false;             
			                 //更新是否是最佳基站
                }

⌨️ 快捷键说明

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