?? cdatams.h
字號:
//////////////////////////////////////////////////////////////////////////////
//
// 數(shù)據(jù)移動臺類(CMobile的繼承類)
//
/////////////////////////////////////////////////////////////////////////////
//CDataMs.h
//the head file of Data Ms User
//Zhang Dingye
//Vision: SPDCCH(Secondary Packet Data Control Channel)(二次包數(shù)據(jù)控制信道)仿真版本
// EP生成根據(jù)信道條件由速率預測函數(shù)進行確定
//
#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 // 濾波器參數(shù),單位為s
typedef CPacketArrivalMessageList; //Packet到達消息隊列
class CDataMs:public CMobile
{
//-------------------attribute---------------------------------------------------------------
protected:
int m_iCurrentPacketSize; //當前Encoder packet的大小,根據(jù)數(shù)據(jù)量確定
// int m_iCurrentSectorIndex; //當前傳輸扇區(qū)在候選集數(shù)組中的下標,用于小區(qū)交換
float m_fCurrentSlotC2I; //當前分組數(shù)據(jù)信道的C/I(real value),用于速率估計
int m_iTransmissionNum; //當前Encoder packet的傳輸次數(shù)
float m_fC2I[SubslotNumber]; //子時隙的c/i,
SECTORID_TYPE m_stCurrentSector; //當前傳輸數(shù)據(jù)分組的扇區(qū),與最佳扇區(qū)可能不同。
RATE2CI_TYPE* m_pstRatePrediction; //當前時隙速率估計的結果,通過LinkPrediction模塊,獲得當前C/I對應的傳輸信息的指針。
bool m_bIsTransmitingNow; //是否正在傳輸?shù)臉酥?
bool m_bIsReTransmission; //是否為重傳的標志
int m_iSlotNumRemained; //當前sub-packet剩余的時隙數(shù),還有幾個時隙當前分組傳輸完畢
CList<float, float> m_EffectiveCodeRateList; //等效編碼速率鏈表,存儲從開始傳輸?shù)疆斍皊ub-packet的各個sub-packet的等效編碼速率。
float m_fMeanSNR; //平均SNR,根據(jù)鏈表中的各個數(shù)據(jù)計算得到
float m_fStdOfSNR; //SNR標準差,根據(jù)鏈表中的各個數(shù)據(jù)計算得到
float m_fCurrentEffectiveCodeRate; //當前等效編碼速率,根據(jù)鏈表中的數(shù)據(jù)計算,計算方法根據(jù)"鏈路預測用數(shù)據(jù)結構的修改"一文。
float m_fEPErrorRate; //EP分組差錯概率,由LinkPrediction對象獲得
int m_iSuccessfulEPNum; //成功傳輸?shù)腅P分組數(shù)
int m_iErrorEPNum; //出現(xiàn)差錯的EP分組數(shù)
float m_fThroughputOfService; //數(shù)據(jù)吞吐量
float m_fSaveOfC2IValue[MaxTransmissionNum]; //記錄重傳的幾次的c2i的值的數(shù)組
float m_fFudgetFactorOf8PSK; //高階調制的修正因子,8PSK ,對應值為-2.4dB
float m_fFudgetFactorOf16QAM; //高階調制的修正因子,16QAM ,對應值為-3.2dB
CLinkPrediction* m_LinkPredictionPointer; //LinkPrediction對象的指針
// CTypedPtrList<CPtrList, CELLSWITCHMESSAGE_TYPE*> m_CellSwitchMessageList; //小區(qū)交換消息隊列
// int m_iCSMsgNum; //軟切換消息隊列長度
//加入符號Es/Nt的記錄指針和相關數(shù)據(jù)
float* m_pfSymbolEsNt; //指向 Symbol_Es/Nt 的數(shù)組的指針
int m_iSgNumber; //記錄上面數(shù)組中有效值的長度
bool m_bIsSGEsNtArrayfull; //用于指示SGEsNtArray是否已被有效數(shù)據(jù)填滿
int m_iLengthOfArrayEsNt; //EsNt數(shù)組的長度
//關于數(shù)據(jù)業(yè)務新接口的屬性
int m_iSuccessfulPacketNum; //記錄成功傳輸過的分組的數(shù)目
int m_iErrorPacketNum; //記錄錯誤傳輸?shù)姆纸M數(shù)目
unsigned long m_lPacketCallDataBits; //記錄成功傳輸?shù)腜C的數(shù)據(jù)量
float m_fPCThroughput; //數(shù)據(jù)用戶的packet call吞吐量
float m_fAveragedPacketDelay; //平均分組時延
float m_fAveragedPCDelay; //平均PacketCall時延
float m_fPacketErrorRate; //分組的差錯概率
int m_iLabelOfDataTraffic; //表明數(shù)據(jù)業(yè)務的類別;0表示尚為確定業(yè)務類型,1表示為HTTP業(yè)務,2表示為FTP業(yè)務,在業(yè)務繼承類里進行初始化
int m_iSlotCounter; //用于記錄當前Subpacket傳輸所用的時隙數(shù)
public:
bool m_bIsEPGood; //當前的Ep是否傳輸正確的標志
long m_lDataQueueSize; //數(shù)據(jù)量
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值是否超出了當前數(shù)據(jù)用戶可用C2I的標志
float m_fPDCHPowerScale; //表示PDCH信道的功率占總功率的比例
int m_iErrorSPDCCH; //錯誤的SPDCCH個數(shù)
int m_iRealTotalSP; //總的發(fā)送的Subpacket的個數(shù)
int m_iRealErrorSP; //總的錯誤的Subpacket的個數(shù)
float m_fAverageRate; //平均傳輸速率,用于調度算法
long m_lTotalGoodBitsNum; //成功傳輸?shù)臄?shù)據(jù)量
bool m_bIsCurrentPacketOver; //標識目前傳輸?shù)膒acket是否結束,用于扇區(qū)的平均分組時延的計算
int m_iCurrentPacketDelay; //記錄目前傳輸?shù)膒acket的時延,用于扇區(qū)的平均分組時延的計算
float m_fPacketDelay; //用于記錄累加的分組時延
float m_fPacketCallDelay; //記錄累加的PC的時延
int m_iPacketCallNum; //記錄傳輸過的PC的數(shù)目
CTypedPtrList<CPtrList, PACKETARRIVALMESSAGE_TYPE*> m_PacketArrivalMessageList;
CTypedPtrList<CPtrList, PACKETCALLARRIVALMESSAGE_TYPE*> m_PacketCallArrivalMessageList;
CTypedPtrList<CPtrList, C2IFEEDBACKDELAY_TYPE*> m_C2IFeedbackDelayList;
int m_iDiscardedPacket; //這個變量是用來統(tǒng)計被丟棄的Packet的。
float m_fFilterInputC2I; //濾波器輸入的C2I值
float m_fFilterOutputC2I; //濾波器輸出的C2I值
//------------------------operation----------------------------------------------------------------
public:
CDataMs(){}
~CDataMs();
void DataMsInitialization(CLinkPrediction*); //初始化函數(shù): 初始化參數(shù),從參數(shù)文件的特定位置讀出參數(shù),如;最大重傳次數(shù)、ACK差錯概率、小區(qū)交換時延等。同時,初始化LinkPrediction。
void SPDCCHTransmission();
void C2ICalculate(); //當前時隙的C/I計算函數(shù): 計算當前傳輸扇區(qū)的C/I
void C2IFeedbackDelay(); //對C2I的值通過鏈表進行信道的時延模擬,對m_fDelayedC2IValue進行賦值
void C2IFeedback(); //Simulate the R-CQICH and the IIR filter at the receiver
void RatePrediction(); //速率預測函數(shù): 根據(jù)C/I數(shù)據(jù),從LinkPrediction中得到對應的RATE2CI_TYPE指針
void PacketTransmission(); //分組(EP)傳輸函數(shù): 功能為,設置數(shù)據(jù)傳輸標志,遞減當前sub-packet的時隙數(shù),調用函數(shù)完成C/I的計算,完成SNR的轉換并插入到SNR鏈表中。
bool IsSubPacketEnd(); //Sub-packet傳輸完畢的判斷函數(shù): 判斷當前sub-packet是否傳輸完畢,若完畢,把當前的編碼速率插入編碼速率鏈表。
bool IsPacketGood(); //EP分組質量判決: 根據(jù)PER判決當前分組是否正確接收,TRUE為正確。考慮ACK/NAK的差錯。
void DiscardedProcess(); //丟棄EP后所作的對相關變量的必要處理
//幾個分量較重的函數(shù)
void PERPrediction(); //質量估計函數(shù) 功能:根據(jù)SNR鏈表計算SNR的均值和標準差,以及平均編碼速率。調用LinkPrediction的差表函數(shù),得到當前的分組差錯概率。
void ReTransmissionControl(); //重傳控制函數(shù) 首先判斷重傳次數(shù)是否達到門限,若達到門限則從數(shù)據(jù)隊列中減去packet的長度,同時錯誤分組數(shù)加1。若未達到門限,設置重傳標志,重傳次數(shù)加1。
void NewPacketSetup(); //設置新的傳輸分組 分組成功傳輸后,從數(shù)據(jù)隊列中加區(qū)分組長度,成功分組數(shù)加1,清空SNR和編碼速率鏈表,調用Encoder Packet生成函數(shù),生成新的EP分組。同時,向傳輸扇區(qū)中加入傳輸數(shù)據(jù)量。
// void CSMsgGenerator(); //小區(qū)交換消息生成函數(shù) 候選集信息更新后,掃描候選集信息數(shù)組,若有扇區(qū)的導頻信噪比高于當前傳輸扇區(qū)一定門限且超過一定時間,則發(fā)出小區(qū)交換消息,加入消息鏈表。
// bool CSMsgProcess(); //小區(qū)交換消息處理函數(shù) 掃描消息隊列,完成等待時間的遞減,同時判斷是否有消息到時,到時返回TRUE。
// void CellSwitch(); //小區(qū)交換函數(shù) 更新當前傳輸小區(qū)。
void SGGenerator(); //根據(jù)Ep的大小生成Symbol Group的數(shù)組
void InsertEffectiveCodeRate(); //Sub-packet傳輸完畢,把當前的編碼速率插入編碼速率鏈表
void HandlePacket(); //處理Packet鏈表,完成Packet的傳輸,進行Packet和PC的時延和傳輸?shù)膫€數(shù)的統(tǒng)計
void PCThroughputCalculate(); //用戶的packet call吞吐量的計算
void AveragedPacketDelayCalculate(); //平均分組時延的計算
void AveragedPCDelayCalculate(); //平均PacketCall時延的計算
void ThroughputCalculate(); //吞吐量計算函數(shù) 計算吞吐量數(shù)據(jù):總的數(shù)據(jù)量/一個drop的時間
//其他接口函數(shù),完成私有函數(shù)的讀取
long GetDataQueueSize(); //返回數(shù)據(jù)量
int GetCurrentPacketSize(); //返回當前Encoder packet的大小,根據(jù)數(shù)據(jù)量確定
int GetCurrentSectorIndex(); //返回當前傳輸扇區(qū)在候選集數(shù)組中的下標
float GetCurrentSlotC2I(); //返回當前分組數(shù)據(jù)信道的C/I,用于速率估計
int GetTransmissionNum(); //返回當前Encoder packet的傳輸次數(shù)
float GetDelayedC2I();
SECTORID_TYPE GetCurrentSector(); //返回當前傳輸數(shù)據(jù)分組的扇區(qū)(與最佳扇區(qū)可能不同)
RATE2CI_TYPE* GetstRatePrediction(); //返回當前時隙速率估計的結果(通過LinkPrediction模塊,獲得當前C/I對應的傳輸信息的指針)
bool IsTransmitingNow(); //返回是否正在傳輸?shù)臉酥?
bool IsReTransmission(); //返回是否為重傳的標志
int GetSquenceNumOfSlot(); //返回當前時隙的傳輸序號(表明當前時隙是整個Encoder packet的第幾個時隙)
int GetSlotNumRemained(); //返回當前sub-packet剩余的時隙數(shù)(還有幾個時隙當前EP分組傳輸完畢)
float GetMeanSNR(); //返回平均SNR,根據(jù)鏈表中的各個數(shù)據(jù)計算得到
float GetStdOfSNR(); //返回SNR標準差,根據(jù)鏈表中的各個數(shù)據(jù)計算得到
float GetCurrentEffectiveCodeRate(); //返回當前等效編碼速率,根據(jù)鏈表中的數(shù)據(jù)計算,計算方法根據(jù)"鏈路預測用數(shù)據(jù)結構的修改"一文。
float GetEPErrorRate(); //返回EP分組差錯概率,有LinkPrediction對象獲得
int GetSuccessfulEPNum(); //返回成功傳輸?shù)腅P分組數(shù)
int GetErrorEPNum(); //返回出現(xiàn)差錯的EP分組數(shù)
long GetTotalGoodBitsNum(); //返回成功傳輸?shù)臄?shù)據(jù)量
float GetThroughputOfService(); //返回數(shù)據(jù)吞吐量
CLinkPrediction* GetLinkPredictionPointer(); //返回LinkPrediction對象的指針
// int GetCSMsgNum(); //返回軟切換消息隊列長度
///new added GET-Function about new interface
float GetPacketDelay(); //返回累加的分組時延****未被調用
int GetSuccessfulPacketNum(); //返回成功傳輸過的分組的數(shù)目
int GetErrorPacketNum(); //返回錯誤傳輸過的分組的數(shù)目
float GetPacketCallDelay(); //返回累加的PC的時延****未被調用
int GetPacketCallNum(); //返回傳輸過的PC的數(shù)目***httpdatams也有一個同名的成員函數(shù)****未被調用
float GetPCThroughput(); //返回數(shù)據(jù)用戶的packet call吞吐量
float GetAveragedPacketDelay(); //返回平均分組時延
float GetAveragedPCDelay(); //返回平均PacketCall時延
float GetPacketErrorRate(); //返回分組的差錯概率****未被調用
float GetFilterOutputC2I(); //返回經過濾波器輸出的C/I
float GetFilterInputC2I(); //返回輸入濾波器輸出的C/I
int GetCurrentPacketDelay(); //返回當前傳輸?shù)膒acket的時延
////幾個Set函數(shù)
void SetCurrentPacketSize(int); //設置當前Encoder packet的大小,根據(jù)數(shù)據(jù)量確定****未被調用
void SetSlotNumRemained(int); //設置當前sub-packet剩余的時隙數(shù)
void SetIsTransmitingNow(bool); //設置是否正在傳輸?shù)臉酥? void SetDataQueueSize(long); //設置數(shù)據(jù)隊列的長度****未被調用
void SetEPErrorRate(float); //設置EP分組差錯概率****未被調用
void SetTransmissionNum(int); //設置當前Encoder packet的傳輸次數(shù)****未被調用
void SetIsCurrentPacketOver(bool); //設置當前傳輸?shù)膒acket是否傳輸完成
bool IsCurrentPacketOver(); //確定當前傳輸?shù)膒acket是否傳輸完成
void SetCurrentPacketDelay(int); //設置當前傳輸?shù)膒acket的時延
};
#endif
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -