📄 cdatams.cpp
字号:
//按照消息中的目标扇区参数更新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 + -