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

📄 cdatams.cpp

📁 这是cdma2000的一个分组调度算法实例
💻 CPP
📖 第 1 页 / 共 3 页
字号:

//按照消息中的目标扇区参数更新DataMs中的关于当前传输扇区信息的属性
	if(m_iCurrentSectorIndex!=pCMS->iCandidateIndex)
	{
		m_iCurrentSectorIndex=pCMS->iCandidateIndex;
		m_stCurrentSector=pCMS->stTargetSector;
		m_aCandidateSector[m_iCurrentSectorIndex].iStatusTimer=0;	//将更新后的当前传输扇区对应的候选扇区数据的iStatusTimer清零
	}
	
//从消息队列中删除该CSMsg消息;更新队长属性m_iCSMsgNum
	POSITION posOfWillBeDelete;
	posOfWillBeDelete=m_CellSwitchMessageList.Find(pCMS);
	delete m_CellSwitchMessageList.GetAt(posOfWillBeDelete);
	m_CellSwitchMessageList.RemoveAt(posOfWillBeDelete);
	m_iCSMsgNum=m_CellSwitchMessageList.GetCount();
} */

void CDataMs::C2IFeedback()
//Simulate the CQICH and the IIR filter at the receiver
{
	char QuantizedSymbol[5],QuantizedChar[5];
	double fErrorRate,fFilterInputC2I;
	double fDelayedC2IdB=10*log10(m_fDelayedC2IValue);

	for(int i=0;i<15;i++)
	{
		if(fDelayedC2IdB<=QuantizerMapC2ILimit[i])
		{
			strcpy(QuantizedSymbol,QuantizerMapSymbol[i]);
			break;
		}
	}
	if(fDelayedC2IdB>QuantizerMapC2ILimit[14])
		strcpy(QuantizedSymbol,QuantizerMapSymbol[15]);

	for(int j=0;j<4;j++)
	{
		fErrorRate=xUniform();

		if(fErrorRate<=ERRORRATE)
		{
			QuantizedSymbol[j]-=48;
			itoa(1-QuantizedSymbol[j],QuantizedChar,10);
			QuantizedSymbol[j]=QuantizedChar[0];
		}
	}
	for(i=0;i<16;i++)
	{
		if(!strcmp(QuantizedSymbol,QuantizerMapSymbol[i]))		
		{
			fFilterInputC2I=QuantizerMapC2I[i];
			break;
		}
	}
	m_fFilterInputC2I=float(pow(10,fFilterInputC2I/10));
	if(m_nChannelType==3||m_nChannelType==4)
	{
		if(m_fLastSlotC2I==0.)
			m_fFilterOutputC2I=m_fFilterInputC2I;
		else
			m_fFilterOutputC2I=float((1-ALPHA)*m_fLastSlotC2I+ALPHA*m_fFilterInputC2I);
	}
	else
		m_fFilterOutputC2I=m_fFilterInputC2I;
	m_fLastSlotC2I=m_fFilterOutputC2I;
}


void CDataMs::SPDCCHTransmission()
{
	if(m_bIsSPDCCHOverEstimation)
	{
		m_bIsSPDCCHSuccess=false;
		m_bIsSPDCCHOverEstimation=false;
		m_iSlotCounter=0;
		return;
	}

	float fErrorRate=xUniform();
	if(fErrorRate<m_LinkPredictionPointer->m_fDeterminedErrorRate)
		m_bIsSPDCCHSuccess=false;
	else
		m_bIsSPDCCHSuccess=true;
	m_iSlotCounter=0;
}

void CDataMs::DiscardedProcess()
{
	if(m_iLabelOfDataTraffic==2||m_iLabelOfDataTraffic==0)
		m_lDataQueueSize-=(long)m_iCurrentPacketSize;	//从数据队列中减去EncoderPacket的长度
	else
		HandlePacket();									//处理packet
	m_iErrorEPNum++;						 	//记录EP分组差错数
	m_iCurrentPacketSize=0;							//当前EP大小清零
	delete [] m_pfSymbolEsNt;							//释放存放SymbolEsNt的数组空间
	m_pfSymbolEsNt=NULL;
  	m_bIsSGEsNtArrayfull=false;				//清除标志_用于指示SGEsNtArray是否已被有效数据填满
//复位相关变量
	m_iTransmissionNum=0;			//传输次数清零 
	m_bIsTransmitingNow=false;			//复位是否传输标志 
	m_bIsReTransmission=false;	    		//复位重传标志
	m_iSlotNumRemained=0;			//当前子包的剩余slot数清零 
//清空CodeRate链表
	   
	POSITION pos;
	pos=m_EffectiveCodeRateList.GetTailPosition();
	while (pos!=NULL)
	{
		m_EffectiveCodeRateList.RemoveTail();
		pos=m_EffectiveCodeRateList.GetTailPosition();
	}
}

	
void CDataMs::ThroughputCalculate()
//吞吐量计算函数  计算吞吐量数据:总的数据量/一个drop的时间,时间的单位改为秒
{
    m_fThroughputOfService=float(m_lTotalGoodBitsNum)/float(m_pMsManager->m_fDropTime);	
} 
		

void CDataMs::PCThroughputCalculate()
//用户的packet call吞吐量的计算
{
	float fPacketCallDelay=m_fPacketCallDelay*float(SlotSize*pow(double(10.0),double(-3.0)));		//单位转化为秒 s
	m_fPCThroughput=(float)m_lPacketCallDataBits/fPacketCallDelay;
}

void CDataMs::AveragedPacketDelayCalculate()
//平均分组时延的计算
{
	m_fAveragedPacketDelay=m_fPacketDelay/m_iSuccessfulPacketNum;	//此处的单位为时隙数
	m_fAveragedPacketDelay*=float(SlotSize*pow(double(10.0),double(-3.0)));		//单位转化为秒 s
}

void CDataMs::AveragedPCDelayCalculate()
//平均PacketCall时延的计算
{
	m_fAveragedPCDelay=m_fPacketCallDelay/m_iPacketCallNum;			//此处的单位为时隙数
	m_fAveragedPCDelay*=float(SlotSize*pow(double(10.0),double(-3.0)));		//单位转化为秒 s
}


	                                        
//----------------------------其他接口函数---------------------------------------------                                                                                                                    
long	CDataMs::GetDataQueueSize()
//返回数据量	                                                          
{
	return m_lDataQueueSize;
}

int	CDataMs::GetCurrentPacketSize()
//返回当前Encoder packet的大小,根据数据量确定
{
	return	m_iCurrentPacketSize;	
}                             

//int	CDataMs::GetCurrentSectorIndex()
//返回当前传输扇区在候选集数组中的下标	                                  
//{
//	return	m_iCurrentSectorIndex;	
//}

float	CDataMs::GetCurrentSlotC2I()
//返回当前分组数据信道的C/I,用于速率估计                                          
{
	return	m_fCurrentSlotC2I;	
}

int	CDataMs::GetTransmissionNum()
//返回当前Encoder packet的传输次数		                          
{	
	return	m_iTransmissionNum;	
}

                                                                                                                                  
SECTORID_TYPE	CDataMs::GetCurrentSector()
//返回当前传输数据分组的扇区(与最佳扇区可能不同)                                        
{
	return m_stCurrentSector;
	//To do...
}


RATE2CI_TYPE*	CDataMs::GetstRatePrediction()
//返回当前时隙速率估计的结果(通过LinkPrediction模块,获得当前C/I对应的传输信息的指针)   
{
	return m_pstRatePrediction;
}

bool	CDataMs::IsTransmitingNow()
//返回是否正在传输的标志	                                                  
{
	return m_bIsTransmitingNow;
}

bool	CDataMs::IsReTransmission()
//返回是否为重传的标志	                                                          
{
	return m_bIsReTransmission;
}

/*                                                                                                                                  
int	CDataMs::GetSquenceNumOfSlot()
//返回当前时隙的传输序号(表明当前时隙是整个Encoder packet的第几个时隙)  
{
	return	m_iSquenceNumOfSlot;		
}
*/

int	CDataMs::GetSlotNumRemained()
//返回当前sub-packet剩余的时隙数(还有几个时隙当前EP分组传输完毕)          
{
	return	m_iSlotNumRemained;		
}

                                                                                                                                  
float	CDataMs::GetMeanSNR()
//返回平均SNR,根据链表中的各个数据计算得到                                
{
	return	m_fMeanSNR;			
}

float	CDataMs::GetStdOfSNR()
//返回SNR标准差,根据链表中的各个数据计算得到                              
{
	return	m_fStdOfSNR;			
}

float	CDataMs::GetCurrentEffectiveCodeRate()
//返回当前等效编码速率,根据链表中的数据计算,计算方法根据"链路预测用数据结构的修改"一文。 
{
	return	m_fCurrentEffectiveCodeRate;	
}

float	CDataMs::GetEPErrorRate()
//返回EP分组差错概率,有LinkPrediction对象获得                                       
{
	return	m_fEPErrorRate;		
}

int	CDataMs::GetSuccessfulEPNum()
//返回成功传输的EP分组数		                                          
{
	return	m_iSuccessfulEPNum;		
}

int	CDataMs::GetErrorEPNum()
//返回出现差错的EP分组数		                                          
{
	return	m_iErrorEPNum;		
}

long	CDataMs::GetTotalGoodBitsNum()
//返回成功传输的数据量	                                                          
{
	return	m_lTotalGoodBitsNum;		
}

float	CDataMs::GetThroughputOfService()
//返回数据吞吐量	                                                          
{
	return	m_fThroughputOfService;		
}

                                                                                                                                  
CLinkPrediction*	CDataMs::GetLinkPredictionPointer()
//返回LinkPrediction对象的指针	                                  
{
	return m_LinkPredictionPointer;
}


//int	CDataMs::GetCSMsgNum()
//返回软切换消息队列长度	                                  
//{
//	return	m_iCSMsgNum;
//}

float CDataMs::GetPacketDelay()
//返回累加的分组时延
{
	return m_fPacketDelay;
}

int CDataMs::GetSuccessfulPacketNum()
//返回成功传输过的分组的数目
{
	return m_iSuccessfulPacketNum;
}

int CDataMs::GetErrorPacketNum()
//返回成功传输过的分组的数目
{
	return m_iErrorPacketNum;
}

float CDataMs::GetPacketCallDelay()
//返回累加的PC的时延
{
	return m_fPacketCallDelay;
}

int CDataMs::GetPacketCallNum()
//返回传输过的PC的数目
{
	return m_iPacketCallNum;
}

float CDataMs::GetPCThroughput()
//返回数据用户的packet call吞吐量
{
	return m_fPCThroughput;		
}

float CDataMs::GetAveragedPacketDelay()
//返回平均分组时延
{
	return m_fAveragedPacketDelay;	
}

float CDataMs::GetAveragedPCDelay()
//返回平均PacketCall时延
{
	return m_fAveragedPCDelay;		
}

float CDataMs::GetPacketErrorRate()
//返回分组的差错概率
{
	return m_fPacketErrorRate;
}

void CDataMs::SetIsCurrentPacketOver(bool bFlag)
//设置当前传输的packet是否传输完成
{
	m_bIsCurrentPacketOver=bFlag;
}

bool CDataMs::IsCurrentPacketOver()
//确定当前传输的packet是否传输完成
{
	return m_bIsCurrentPacketOver;
}

void CDataMs::SetCurrentPacketDelay(int iDelay)
//设置当前传输的packet的时延
{
	m_iCurrentPacketDelay=iDelay;
}

int CDataMs::GetCurrentPacketDelay()
//返回当前传输的packet的时延
{
	return m_iCurrentPacketDelay;
}

void CDataMs::SetCurrentPacketSize(int iEPSize)
//设置当前Encoder packet的大小,根据数据量确定
{
	m_iCurrentPacketSize=iEPSize;
}

void CDataMs::SetSlotNumRemained(int iSlotNumR)
//设置当前sub-packet剩余的时隙数
{
	m_iSlotNumRemained=iSlotNumR;
}

void CDataMs::SetIsTransmitingNow(bool btemp)
//设置是否正在传输的标志
{
	m_bIsTransmitingNow=btemp;
}

void CDataMs::SetDataQueueSize(long	lsize)
//设置数据队列的长度
{
	m_lDataQueueSize=lsize;
}

void CDataMs::SetEPErrorRate(float fPER)
//设置EP分组差错概率
{
	m_fEPErrorRate=fPER;
}

void CDataMs::SetTransmissionNum(int iTN)
//设置当前Encoder packet的传输次数		
{
	m_iTransmissionNum=iTN;
}
	
float CDataMs::GetFilterInputC2I()
{
	return m_fFilterInputC2I;
}

float CDataMs::GetFilterOutputC2I()
{
	return m_fFilterOutputC2I;
}

⌨️ 快捷键说明

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