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

📄 cdatams.h

📁 这是cdma2000的一个分组调度算法实例
💻 H
字号:
	//////////////////////////////////////////////////////////////////////////////
//
//                    数据移动台类(CMobile的继承类)
//
/////////////////////////////////////////////////////////////////////////////
//CDataMs.h
//the head file of Data Ms User
//Zhang Dingye
//Vision: SPDCCH(Secondary Packet Data Control Channel)(二次包数据控制信道)仿真版本
//         EP生成根据信道条件由速率预测函数进行确定
//  
#if !defined(SYSTEMSLEVEL_SIM_CDataMs_H__INCLUDED_)
#define SYSTEMSLEVEL_SIM_CDataMs_H__INCLUDED_

#include "afxtempl.h"
#include "systemsim.h"
#include "CMobile.h"

#define ERRORRATE 0.//0.01//0.05
#define ALPHA 0.0125   // 滤波器参数,单位为s

typedef 	CPacketArrivalMessageList;	//Packet到达消息队列

class CDataMs:public CMobile
{
//-------------------attribute--------------------------------------------------------------- 
protected:
	int	m_iCurrentPacketSize;				//当前Encoder packet的大小,根据数据量确定
//	int	m_iCurrentSectorIndex;				//当前传输扇区在候选集数组中的下标,用于小区交换	
	float	m_fCurrentSlotC2I;				//当前分组数据信道的C/I(real value),用于速率估计
	int	m_iTransmissionNum;					//当前Encoder packet的传输次数		
	float m_fC2I[SubslotNumber];			//子时隙的c/i,
	
	SECTORID_TYPE	m_stCurrentSector;		//当前传输数据分组的扇区,与最佳扇区可能不同。
	RATE2CI_TYPE*	m_pstRatePrediction;	//当前时隙速率估计的结果,通过LinkPrediction模块,获得当前C/I对应的传输信息的指针。
	bool	m_bIsTransmitingNow;			//是否正在传输的标志	
	bool	m_bIsReTransmission;			//是否为重传的标志	
	int	m_iSlotNumRemained;					//当前sub-packet剩余的时隙数,还有几个时隙当前分组传输完毕

	CList<float, float>	m_EffectiveCodeRateList;		//等效编码速率链表,存储从开始传输到当前sub-packet的各个sub-packet的等效编码速率。
    
	float	m_fMeanSNR;						//平均SNR,根据链表中的各个数据计算得到
	float	m_fStdOfSNR;					//SNR标准差,根据链表中的各个数据计算得到
	float	m_fCurrentEffectiveCodeRate;	//当前等效编码速率,根据链表中的数据计算,计算方法根据"链路预测用数据结构的修改"一文。
	float	m_fEPErrorRate;					//EP分组差错概率,由LinkPrediction对象获得
	int	m_iSuccessfulEPNum;					//成功传输的EP分组数		
	int	m_iErrorEPNum;						//出现差错的EP分组数		
	float	m_fThroughputOfService;			//数据吞吐量	
	float m_fSaveOfC2IValue[MaxTransmissionNum];		//记录重传的几次的c2i的值的数组
	float m_fFudgetFactorOf8PSK;			//高阶调制的修正因子,8PSK ,对应值为-2.4dB
	float m_fFudgetFactorOf16QAM;			//高阶调制的修正因子,16QAM ,对应值为-3.2dB
	
	CLinkPrediction*	m_LinkPredictionPointer;		//LinkPrediction对象的指针	
//	CTypedPtrList<CPtrList, CELLSWITCHMESSAGE_TYPE*>	m_CellSwitchMessageList;		//小区交换消息队列	
//	int	m_iCSMsgNum;						//软切换消息队列长度

	//加入符号Es/Nt的记录指针和相关数据
	float* m_pfSymbolEsNt;			//指向 Symbol_Es/Nt 的数组的指针
	int m_iSgNumber;					//记录上面数组中有效值的长度
	bool m_bIsSGEsNtArrayfull;			//用于指示SGEsNtArray是否已被有效数据填满
	int m_iLengthOfArrayEsNt;			//EsNt数组的长度

	//关于数据业务新接口的属性
	int m_iSuccessfulPacketNum;	//记录成功传输过的分组的数目
	int m_iErrorPacketNum;	    //记录错误传输的分组数目
	unsigned long m_lPacketCallDataBits;	//记录成功传输的PC的数据量
	float m_fPCThroughput;		//数据用户的packet call吞吐量
	float m_fAveragedPacketDelay;		//平均分组时延
	float m_fAveragedPCDelay;			//平均PacketCall时延
	float m_fPacketErrorRate;			//分组的差错概率

	int m_iLabelOfDataTraffic;			//表明数据业务的类别;0表示尚为确定业务类型,1表示为HTTP业务,2表示为FTP业务,在业务继承类里进行初始化
	int m_iSlotCounter;					//用于记录当前Subpacket传输所用的时隙数

public:

	bool m_bIsEPGood;					//当前的Ep是否传输正确的标志
	long m_lDataQueueSize;				//数据量	
	float m_fDelayedC2IValue;			//表示每个slot的C/I经过时延以后的值,为实际值
	float m_fLastSlotC2I;				//表示上一个slot滤波器输出的C/I值
	bool m_bIsSPDCCHSuccess;			//表示SPDCCH信道是否被正确接收
	float m_fSPDCCHC2I;					//记录SPDCCH所占用的C2I值
	bool m_bIsSPDCCHOverEstimation;		//指示SPDCCH所用C2I值是否超出了当前数据用户可用C2I的标志
	float m_fPDCHPowerScale;			//表示PDCH信道的功率占总功率的比例
	int m_iErrorSPDCCH;					//错误的SPDCCH个数
	int m_iRealTotalSP;					//总的发送的Subpacket的个数
	int m_iRealErrorSP;					//总的错误的Subpacket的个数
	float m_fAverageRate;					//平均传输速率,用于调度算法
	long	m_lTotalGoodBitsNum;			//成功传输的数据量	
	bool m_bIsCurrentPacketOver;	//标识目前传输的packet是否结束,用于扇区的平均分组时延的计算
	int m_iCurrentPacketDelay;		//记录目前传输的packet的时延,用于扇区的平均分组时延的计算
	float m_fPacketDelay;			//用于记录累加的分组时延
	float m_fPacketCallDelay;		//记录累加的PC的时延
	int m_iPacketCallNum;		//记录传输过的PC的数目
	CTypedPtrList<CPtrList, PACKETARRIVALMESSAGE_TYPE*> m_PacketArrivalMessageList;
	CTypedPtrList<CPtrList, PACKETCALLARRIVALMESSAGE_TYPE*> m_PacketCallArrivalMessageList;
	CTypedPtrList<CPtrList, C2IFEEDBACKDELAY_TYPE*> m_C2IFeedbackDelayList;

	int m_iDiscardedPacket;			//这个变量是用来统计被丢弃的Packet的。
	float m_fFilterInputC2I;		//滤波器输入的C2I值
	float m_fFilterOutputC2I;		//滤波器输出的C2I值	
	
//------------------------operation----------------------------------------------------------------
public:
	CDataMs(){}
	~CDataMs();

	void DataMsInitialization(CLinkPrediction*);			//初始化函数: 初始化参数,从参数文件的特定位置读出参数,如;最大重传次数、ACK差错概率、小区交换时延等。同时,初始化LinkPrediction。
	void SPDCCHTransmission();
	void C2ICalculate();					//当前时隙的C/I计算函数: 计算当前传输扇区的C/I
	void C2IFeedbackDelay();				//对C2I的值通过链表进行信道的时延模拟,对m_fDelayedC2IValue进行赋值
	void C2IFeedback();						//Simulate the R-CQICH and the IIR filter at the receiver
	void RatePrediction();					//速率预测函数: 根据C/I数据,从LinkPrediction中得到对应的RATE2CI_TYPE指针
	void PacketTransmission();				//分组(EP)传输函数: 功能为,设置数据传输标志,递减当前sub-packet的时隙数,调用函数完成C/I的计算,完成SNR的转换并插入到SNR链表中。
	bool IsSubPacketEnd();					//Sub-packet传输完毕的判断函数: 判断当前sub-packet是否传输完毕,若完毕,把当前的编码速率插入编码速率链表。
	bool IsPacketGood();					//EP分组质量判决:	根据PER判决当前分组是否正确接收,TRUE为正确。考虑ACK/NAK的差错。
	void DiscardedProcess();				//丢弃EP后所作的对相关变量的必要处理
	
	//几个分量较重的函数
	void PERPrediction();					//质量估计函数	功能:根据SNR链表计算SNR的均值和标准差,以及平均编码速率。调用LinkPrediction的差表函数,得到当前的分组差错概率。
	void ReTransmissionControl();			//重传控制函数	首先判断重传次数是否达到门限,若达到门限则从数据队列中减去packet的长度,同时错误分组数加1。若未达到门限,设置重传标志,重传次数加1。
	void NewPacketSetup();					//设置新的传输分组  分组成功传输后,从数据队列中加区分组长度,成功分组数加1,清空SNR和编码速率链表,调用Encoder Packet生成函数,生成新的EP分组。同时,向传输扇区中加入传输数据量。

//	void CSMsgGenerator();					//小区交换消息生成函数  候选集信息更新后,扫描候选集信息数组,若有扇区的导频信噪比高于当前传输扇区一定门限且超过一定时间,则发出小区交换消息,加入消息链表。
//	bool CSMsgProcess();					//小区交换消息处理函数	扫描消息队列,完成等待时间的递减,同时判断是否有消息到时,到时返回TRUE。
//	void CellSwitch();						//小区交换函数	更新当前传输小区。
	
	void SGGenerator();						//根据Ep的大小生成Symbol Group的数组
	void InsertEffectiveCodeRate();			//Sub-packet传输完毕,把当前的编码速率插入编码速率链表
	void HandlePacket();					//处理Packet链表,完成Packet的传输,进行Packet和PC的时延和传输的个数的统计

	void PCThroughputCalculate();			//用户的packet call吞吐量的计算
	void AveragedPacketDelayCalculate();	//平均分组时延的计算
	void AveragedPCDelayCalculate();	    //平均PacketCall时延的计算
	void ThroughputCalculate();				//吞吐量计算函数  计算吞吐量数据:总的数据量/一个drop的时间
	//其他接口函数,完成私有函数的读取
	long	GetDataQueueSize();				//返回数据量	
	int	GetCurrentPacketSize();				//返回当前Encoder packet的大小,根据数据量确定
	int	GetCurrentSectorIndex();			//返回当前传输扇区在候选集数组中的下标	
	float	GetCurrentSlotC2I();			//返回当前分组数据信道的C/I,用于速率估计
	int	GetTransmissionNum();				//返回当前Encoder packet的传输次数	
	float GetDelayedC2I();
	
	SECTORID_TYPE	GetCurrentSector();		//返回当前传输数据分组的扇区(与最佳扇区可能不同)
	RATE2CI_TYPE*	GetstRatePrediction();	//返回当前时隙速率估计的结果(通过LinkPrediction模块,获得当前C/I对应的传输信息的指针)
	bool	IsTransmitingNow();			//返回是否正在传输的标志	
	bool	IsReTransmission();			//返回是否为重传的标志	
    
	int	GetSquenceNumOfSlot();				//返回当前时隙的传输序号(表明当前时隙是整个Encoder packet的第几个时隙)
	int	GetSlotNumRemained();				//返回当前sub-packet剩余的时隙数(还有几个时隙当前EP分组传输完毕)
	
	float	GetMeanSNR();					//返回平均SNR,根据链表中的各个数据计算得到
	float	GetStdOfSNR();					//返回SNR标准差,根据链表中的各个数据计算得到
	float	GetCurrentEffectiveCodeRate();	//返回当前等效编码速率,根据链表中的数据计算,计算方法根据"链路预测用数据结构的修改"一文。
	float	GetEPErrorRate();			//返回EP分组差错概率,有LinkPrediction对象获得
	int	GetSuccessfulEPNum();			//返回成功传输的EP分组数		
	int	GetErrorEPNum();				//返回出现差错的EP分组数		
	long	GetTotalGoodBitsNum();			//返回成功传输的数据量	
	float	GetThroughputOfService();		//返回数据吞吐量	
	
	CLinkPrediction*	GetLinkPredictionPointer();		//返回LinkPrediction对象的指针	
//	int	GetCSMsgNum();						//返回软切换消息队列长度

///new added GET-Function about new interface
	float GetPacketDelay();			//返回累加的分组时延****未被调用
	int GetSuccessfulPacketNum();	//返回成功传输过的分组的数目
	int GetErrorPacketNum();		//返回错误传输过的分组的数目
	float GetPacketCallDelay();		//返回累加的PC的时延****未被调用
	int GetPacketCallNum();			//返回传输过的PC的数目***httpdatams也有一个同名的成员函数****未被调用

	float GetPCThroughput();		//返回数据用户的packet call吞吐量
	float GetAveragedPacketDelay();		//返回平均分组时延
	float GetAveragedPCDelay();			//返回平均PacketCall时延
	float GetPacketErrorRate();			//返回分组的差错概率****未被调用
	float GetFilterOutputC2I();         //返回经过滤波器输出的C/I
	float GetFilterInputC2I();          //返回输入滤波器输出的C/I
	int GetCurrentPacketDelay();			//返回当前传输的packet的时延

////几个Set函数
	void SetCurrentPacketSize(int);			//设置当前Encoder packet的大小,根据数据量确定****未被调用
	void SetSlotNumRemained(int);			//设置当前sub-packet剩余的时隙数
	void SetIsTransmitingNow(bool);			//设置是否正在传输的标志
	void SetDataQueueSize(long);			//设置数据队列的长度****未被调用
	void SetEPErrorRate(float);			//设置EP分组差错概率****未被调用
	void SetTransmissionNum(int);			//设置当前Encoder packet的传输次数****未被调用		

	void SetIsCurrentPacketOver(bool);		//设置当前传输的packet是否传输完成
	bool IsCurrentPacketOver();				//确定当前传输的packet是否传输完成
	void SetCurrentPacketDelay(int);		//设置当前传输的packet的时延

};

#endif

⌨️ 快捷键说明

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