📄 cdatams.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 + -