📄 cvoicems.h
字号:
/////////////////////////////////////////////////////////////////////////////////////////////
//CVoiceMs.h
//by Cai QiMing
/////////////////////////////////////////////////////////////////////////////////////////////
#if !defined(_CVOICEMS_H__INCLUDED_)
#define _CVOICEMS_H__INCLUDED_
#include "CMobile.h"
#include "Markov.h"
#include "stdlib.h"
#include "bitset"
//#include "Afxtempl.h"
class CVoiceMs:public CMobile
{
//----------属性-----------------------------------------------------------------------------
private:
int m_iActiveSetSize; //当前激活集大小
int m_iServiceLength; //话音业务时长,以时隙为单位
int m_iServiceTime; //话音服务时长
int m_iSHOMsgNum; //软切换消息队列长度
int m_iDropTimer; //掉话计时器
int m_iUnsatisfiedTimer; //不满意计时器
float m_fVoiceActiveFactor; //话音激活因子
float m_fC2I; //当前时隙的C/I
float m_fMeanC2I; //平均C/I(帧内累加,帧结束时才是平均值)
float m_fFwdCurrentActiveFactor; //当前slot前向话音激活因子
float m_fFwdLastActiveFactor; //上一slot的前向话音激活因子
// bool m_bIsServiceActive; //当前时隙的话音激活标志,TRUE激活
bool m_bIsC2IEnough; //C/I是否超过门限值
int m_iFwdFrameRate; //当前前向帧速率
//...... added by cqm, Apr.9 ......//
float* m_pfC2IIndex; //C/I索引
float* m_pfFER; //FER表指针
float m_fFER; //当前slot的FER
bool m_bIsFrameCorrect; //当前帧是否正确
int m_iFERIndicator; //坏帧指示器
int m_iBadFrameCounter;
float m_fC2ITarget;
float m_fMeanC2IofLastFrame;
std::bitset<WindowSize> bsFrameErrorFlagSet; //定义对象bsFrameErrorFlagSet,它的类型是bitset
size_t uiCountErrorFrame; //记录在前20帧(窗口)里错帧的个数
//.................................//
CMarkovVoice m_cFwdMarkovState; //前向话音激活Markov状态
CTypedPtrList<CPtrList, ACTIVESECTOR_TYPE*> m_ActiveSetList; //激活集信息链表
CTypedPtrList<CPtrList, SOFTHANDOFFMESSAGE_TYPE*> m_SoftHandoffMessageList; //软切换消息队列,模拟软切换事件的时延
//----------操作-----------------------------------------------------------------------------
public:
CVoiceMs();
~CVoiceMs();
bool m_bIsSHOOut;
void VoiceInitialization(); //初始化函数,初始化m_iServiceLength、m_bIsServiceActive,并调用最佳扇区选择函数,计算出最佳扇区,调用激活集初始化函数,设定激活集,随机初始化激活集的业务信道功率。
void InitActiveSet(); //激活集初始化函数,根据最佳基站的导频信噪比,扫描候选集中其他扇区的导频信噪比,确定激活集扇区、业务信道功率和信噪比。
void ObtainC2I(); //C/I计算函数,根据激活集情况,计算用户最终的C/I。
void SHOMsgGenerator(); //软切换消息生成函数,根据候选集更新情况,生成加入、去掉或替换消息(替换体现为去掉和加入各一个消息)
int SHOMsgProcess(); //消息队列处理函数,完成每个时隙内消息等待时间递减的功能,并返回到时消息的数量。
void ChangeActiveSet(); //激活集变更函数,根据消息处理函数的返回值,读出相应的软切换消息,根据该消息完成相应的操作,去掉:直接从链表中删除,加入:加入新的激活信息结构体,并初始化各个变量。
void UpdateActiveSet(); //激活集更新函数,根据候选集更新的情况,计算业务信道的信噪比。在每个时隙中均需调用,激活集初始化和变更之后也需调用。
void PowerControl(); //功率控制函数,根据计算得到的C/I与功率控制目标C/I的关系,调整激活集内各个扇区的发射功率。需要考虑功控误差。
void SetVoiceActivity(); //话音激活特性设置函数,根据话音激活因子,设置话音激活标志。
bool IsServiceOver(); //服务时长到时的判断函数,判断服务时长是否到时,到时返回TRUE。若到时则可以在程序流程中调用初始化函数,重新初始化。也可以在该函数中直接调用,重新初始化。
void UpdateActiveSetPower(); //得到激活集的总功率
void Clean(); //通话结束后清除链表
//...... added by cqm, Apr.9 ......//
void FERPrediction(); //FER预测函数,根据接收到的Eb/Nt值,查短期FER vs Eb/Nt表得到当前用户的FER
void FrameQualityDecision(); //帧质量判断函数,判断当前slot话音帧是否正确
void GOSDecision(); //服务质量判断函数,如果短期FER大于15%,m_iFERIndicator加一
int GetFERIndicator(); //得到服务质量指示器的值
void SetFERIndicator(int);
// void IsUserOutage(); //判断用户是否中断函数,在用户通话结束或drop结束时由CMsManager调用
//.................................//
int GetActiveSetSize(); //得到当前激活集的大小
void SetActiveSetSize(int); //设置当前激活集的大小
int GetServiceLength(); //得到话音业务时长,以时隙为单位
void SetServiceLength(int); //设置话音业务时长,以时隙为单位
int GetServiceTime(); //得到话音服务时长
void SetServiceTime(int); //设置话音服务时长
int GetSHOMsgNum(); //得到软切换消息队列长度
void SetSHOMsgNum(int); //设置软切换消息队列长度
int GetDropTimer(); //得到掉化计时器
void SetDropTimer(int); //设置掉化计时器
int GetUnsatisfiedTimer(); //得到不满意计时器
void SetUnsatisfiedTimer(int); //设置不满意计时器
float GetVoiceActiveFactor(); //得到话音激活因子
void SetVoiceActiveFactor(float); //设置话音激活因子
float GetC2I(); //得到当前时隙的C/I
void SetC2I(float); //设置当前时隙的C/I
// bool IsServiceActive(); //得到当前时隙的话音激活标志,TRUE激活
bool IsC2IEnough(); //当前C/I是否超过门限值,TRUE为超过
};
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -