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

📄 systemsim.h

📁 这是cdma2000的一个分组调度算法实例
💻 H
字号:
//////////////////////////////////////////////////////////////////////////////
//
//	TITLE:	The Definations of Fixed Parameters and Types of the Program
//
//	PURPOSE:Give the Definations of Fixed Parameters and Types of the 
//			Program that all the modules may use
//
//	COMMENTS:
//			The definations consist of these two parts:
//
//			1.公共数据结构, 可以分为4类:
//				● 与地理位置有关的公共数据。包括:坐标、小区标号、扇区标号。
//				● 与邻小区干扰和切换有关的公共数据。包括:周围扇区信息、候选
//				扇区信息、激活扇区信息,以及相关的数组、链表和函数。
//				● 与信道变化模型有关的公共数据。包括:信道数据、衰落数据。
//				其中,衰落数据结构体数组构成了信道模型类与移动台类的接口。
//				● 与链路性能预测有关的公共数据。包括:速率估计、BLER估计两个
//				数据表中用到的数据结构。数据业务移动台使用速率估计表,根据当前
//				的C/I确定适合的数据速率,作为系统调度算法的依据。在某个
//				sub-packet传输结束后,数据业务移动台根据encoder packet的大小、
//				数据速率、平均编码速率、C/I的均值和方差,判断当前分组的BLER,
//				然后根据BLER估计该分组是否正确。上述数据表作为链路性能预测类的
//				成员数据,链路性能预测类中需要定义与之配合的成员函数。
//
//			2.宏定义部分:
//				定义了系统中相对固定的参数,可以作为常量在整个系统程序中使用。
//
//			本文件可以作为定义系统公共头文件的依据,在变量与宏的说明过程中,
//			已经给出了大部分的英文说明或定义,可以以此为依据,并结合已有的代码
//			编写规范,定义变量和宏的名称。
//
//	AUTHOR:	Ouyang Hui
//
//	AUDITOR:Yang Guang
//
//	DATE:	01/04/05
//
//	MODIFICATIONS SINCE 01/04/05:
//  20020408:
//		1  增加了两个宏定义#define Voice 1   
//						   #define Data  2   表示业务类型
//////////////////////////////////////////////////////////////////////////////

#if !defined(SYSTEMSIM_H__INCLUDED_)
#define SYSTEMSIM_H__INCLUDED_

#include <math.h>
#include <afxtempl.h>
#include <iostream.h>

#include "sys_random.h"
#include "newran.h"

#define CarrierFrequency 2e9			//载波频率
#define MM 5							//服务区内横向小区数量
#define NN 5							//服务区内纵向小区数量
#define SectorNumber 3					//一个小区的扇区数
#define NearCoefficient 0.707			//慢衰近场系数
#define FarCoefficient 0.707			//慢衰远场系数
#define FractionOfPilotChannel 0.125	//导频功率比例
#define FractionOfCommonChannel 0.075	//其他公共信道功率比例
#define BandWidth 1.25e6				//系统带宽
#define ChipRate 1.2288e6				//码片速率

//...... modified by cqm, May.29 ......//
#define NoiseFigure 10				
	//移动台接收机噪声系数,叠加于NoiseDensity之上,单位:dB
//..................................//

#define NoiseDensity -174				//热噪声功率谱密度
#define NoisePower float((pow(10,(NoiseDensity+NoiseFigure)/double(10))*BandWidth))	
	//热噪声功率
	//噪声功率谱密度与带宽的乘积,计算C/I时用

//...... modified by cqm, May.29 ......//
#define AntennaGain 15					//天线增益&电缆损耗,单位:dB
	//与天线方向性(Antenna Orientation)叠加,
	//构成天线衰减值(Antenna Attenuation)
//..................................//

//...... added by cqm, May.29 .......//
#define OtherLosses 10       //其他损耗,单位:dB
#define MsAntennaGain -1     //移动台天线增益,单位:dB
//..................................//

#define MinPathLoss 70					//路径损耗最小值
#define SlotSize 1.25					//时隙长度
#define PI 3.14159265
#define MinimumValue pow(10,-30)		//无穷小
#define ParameterFile "parameter.txt"	//参数文件路径名

//Newly Added Macro
#define MeanCallLength 120	//平均呼叫时长 120 秒
#define SubslotNumber 4			//一个时隙中子时隙的数量
#define MaxTransmissionNum 4	//最大传输次数
#define INITIALSLOT 8000 	//表示程序初始化时长的宏定义,以时隙为单位

#define MAXTRANSRATE 1228.8
#define MINTRANSRATE 19.2

//...... added by cqm, Apr.8 .......//
//业务类型
#define Voice 1   
#define Data  2
#define WindowSize 20
//..................................//

//位置坐标结构体
typedef struct stLocation
{
	float x;	//横坐标
	float y;	//纵坐标
} LOCATION_TYPE;

//小区标号结构体
typedef struct stCellID
{
	int m;		//横坐标:小区在服务区内的横向位置
	int n;		//纵坐标:小区在服务区内的纵向位置
} CELLID_TYPE;

//扇区标号结构体
typedef struct stSectorID
{
	CELLID_TYPE stCellID;	//小区标号:小区在服务区内的位置
	int s;						//扇区序号:该扇区在小区内的序号
}SECTORID_TYPE;

//周围扇区信息结构体
typedef struct stNeighborSector
{
	SECTORID_TYPE stSectorID;	//扇区标号
	float fPathLoss;				//路径损耗
		//该扇区到达移动台的路径损耗
	float fAntennaGain;				//天线增益
		//该扇区到达移动台方向上的天线增益
	float fFastFading[SubslotNumber];//快衰落值
		//该扇区到达移动台的快衰落
	float fSlowFading;				//慢衰落值
		//该扇区到达移动台的慢衰落,根据近场值和远场值得到
	float fPropagationLoss;			//总的损耗值:上述三项之和(不包括快衰)
	float fPowerFromTheSector;		//扇区到达移动台的总功率
}NEIGHBORSECTOR_TYPE;

//候选扇区信息结构体
typedef struct stCandidateSector
{
	SECTORID_TYPE stSectorID;				//扇区标号
	int aiNeighborSet[7*SectorNumber-1];			//相邻扇区在周围扇区信息数组中的下标(相对位置)
	float fInterferenceFromOtherSector;			//相邻扇区总干扰
		//相邻扇区数组中各元素的“扇区到达移动台总功率”项的和
	float fPilotPower;							//本扇区导频接收功率
		//根据该扇区的导频功率和各类损耗与衰落计算
	float fPilotSNR;							//本扇区导频信噪比
		//导频接收功率/(本扇区其他信道接收功率*正交因子+
		//相邻扇区干扰功率总和+热噪声)
	bool bIsInActive;							//是否在激活集内
	int iStatusTimer;							//状态改变计时器
		//记录导频信噪比超过或低于门限的时间,若计时器达到设定值,
		//则改变上面布尔型变量的状态
	bool bIsBestSector;							//是否为最佳基站
		//标志候选集内导频信噪比最高的扇区
}CANDIDATESECTOR_TYPE;

//激活扇区结构体
typedef struct stActiveSector
{
	SECTORID_TYPE stSectorID;		//扇区标号
	int iIndexInCandidate;				//本扇区在候选集中的位置
		//即该扇区在候选集数组中的下标
	float fTrafficPower;				//前向业务信道发射功率
		//话音信道或分组数据信道发射功率
	float fTrafficC2I;					//前向业务信道信噪比
		//业务信道接收功率/(本扇区其他信道接收功率*正交因子+
		//相邻扇区干扰功率总和+热噪声)
}ACTIVESECTOR_TYPE;

//信道数据结构体
typedef struct stChannelModel
{
	int iID;				//ID
	float fMobileSpeed;		//移动台速度
	int iCoSlotNum;			//相关时隙长度
}CHANNELMODEL_TYPE;

//衰落数据结构体
typedef struct stFadingValue
{
	CELLID_TYPE stCellID;			//小区序号
	float fSlowFarFading;		//慢衰远场值
	float fSlowFading;			//慢衰值:在链路级模块中根据近场和
								//远场算出
	float fFastFadingSet[SectorNumber][SubslotNumber];	
	//快衰数组:对应一个小区中的三个扇区
}FADINGVALUE_TYPE;

/*速率估计数据表*/

//速率到C/I映射结构体
typedef struct stRate2CI
{
	float fTargetC2I;			//目标C/I(dB)
	float fDataRate;			//数据速率(kbps)
	int iModulationOrder;			//调制阶数
	float fEffectiveCodeRate;		//等效编码速率
	int iSlotNumPerSubPacket;		//sub-packet占用的时隙数
	int iSymbolNumber;				//一个sub-packet中符号数量
}RATE2CI_TYPE;

//ENCODER PACKET SIZE 到 C/I 的映射结构体
typedef struct stEPS2CI
{
	int iEncoderPacketSize;		//编码数据包长度
	RATE2CI_TYPE* pstAddrOfRate2CI;	//Rate2CI 结构体数组的首地址
	int iRATE2CILength;			//Rate2CI 结构体数组的长度
}EPS2CI_TYPE;

/* BLER 估计数据表(1)*/

//SNR的均值、方差到 BLER 的映射结构体
typedef struct stSNR2BLER1
{
	float fMeanSNR;		//平均SNR
	float fStdSNR;		//SNR的方差
	float fBLER;
}SNR2BLER1_TYPE;

//速率到 BLER 的映射结构体
typedef struct stRate2BLER1
{
	float fEffectiveCodeRate;				//等效编码速率
	SNR2BLER1_TYPE* pstAddrOfSNR2BLER;	//SNR2BLER 表的首地址
	int iSNR2BLER1Length;			//SNR2BLER 表的长度
}RATE2BLER1_TYPE;

//ENCODER PACKET SIZE 到 BLER 的映射结构体
typedef struct stEPS2BLER1
{
	int iEncoderPacketSize;						//编码数据包长度
	RATE2BLER1_TYPE* pstAddrOfRate2BLER;	//Rate2BLER 结构体数组的首地址
	int iRATE2BLER1Length;				//Rate2BLER 结构体数组的长度
}EPS2BLER1_TYPE;

/* BLER 估计数据表(2)*/

//SNR的均值到 BLER 的映射结构体
typedef struct stSNR2BLER2
{
	float fMeanSNR;		//平均SNR
	float fBLER;
}SNR2BLER2_TYPE;

//SNR的方差到 BLER 修正值的映射结构体
typedef struct stStd2BLER
{
	float fStdSNR;			//SNR的方差
	float fAdjustOfBLER;	//BLER 修正值
}STD2BLER_TYPE;

//速率到 BLER 的映射结构体
typedef struct stRate2BLER2
{
	float fEffectiveCodeRate;				//等效编码速率
	SNR2BLER2_TYPE* pstAddrOfSNR2BLER;		//SNR2BLER 表的首地址
	STD2BLER_TYPE* pstAddrOfStd2BLER;	//Std2BLER 表的首地址
}RATE2BLER2_TYPE;

//ENCODER PACKET SIZE 到 BLER 的映射结构体
typedef struct stEPS2BLER2
{
	int iEncoderPacketSize;			//编码数据包长度
	RATE2BLER2_TYPE* pstAddrOfRate2BLER;	//Rate2BLER 结构体数组的首地址
}EPS2BLER_TYPE;

//软切换消息结构体
typedef struct stSoftHandoffMessage
{
	int iCandidateIndex;			//目标扇区在候选集数组中的下标
	SECTORID_TYPE stTargetSector;		//目标扇区的扇区标号
	int iWaitTime;				//需要等待的时间长度,以时隙为单位
	bool bIsAdd;				//是否加入到激活集中,true: add,false: drop
}SOFTHANDOFFMESSAGE_TYPE;

//小区交换消息结构体
typedef struct stCellSwitchMessage
{
	int iCandidateIndex;			//目标扇区在候选集数组中的下标
	SECTORID_TYPE stTargetSector;		//目标扇区的扇区标号
	int iWaitTime;				//需要等待的时间长度,以时隙为单位
}CELLSWITCHMESSAGE_TYPE;

//Packet到达消息结构体
typedef struct stPacketArrivalMessage
{
	int iPacketSize;				//当前Packet的大小
	int iTimeOfGeneratePacket;		//此Packet生成的时候的时隙数
	int iPacketIndex;				//此Packet是其所属的PC的第几个Packet
	bool bIsPacketCallEnd;			//表示此Packet是否是其所属的Packet Call的最后一个Packet
}PACKETARRIVALMESSAGE_TYPE;

//PacketCall到达消息结构体
typedef struct stPacketCallArrivalMessage
{
	int iTimeOfPCArrival;		//此PacketCall生成的时候的时隙数
	long lDataBitsOfPC;			//记录当前的PC的成功传输的比特数,计算PC的吞吐量时用到,用不到!
}PACKETCALLARRIVALMESSAGE_TYPE;

const double ProcessGain[4]={17.2,20.2,23.2,23.2};

const double SPDCCHEbNt[][5]={{1.4,1.5,1.55,2.7,1.4},
							{0.9,1.0,1.1,1.2,0.9},
							{0.9,0.9,0.9,1.1,0.9},
							{0.9,0.9,0.9,1.1,0.9}};

const double SPDCCHPowerMargin[4][5]={{2.,4.,11.,16.,1.},
								{1.,1.,6.,3.,1.},
								{1.,1.,1.,1.,1.},
								{1.,1.,1.,1.,1.}};

const double SPDCCHErrorRate[4][5]={{0.0001,0.,0.,0.,0.001},
							{0.004,0.002,0.,0.0001,0.004},
							{0.004,0.004,0.004,0.001,0.004},
							{0.004,0.004,0.004,0.001,0.004}};


class CNetworkDrive;
class CServiceArea;
class CMsManager;
class CLinkPrediction;
class CCell;
class CSector;
class CMobile;
class CChannelModel;
class CVoiceMs;
class CDataMs;
class CHttpDataMs;
class CFtpDataMs;

#define FastFadingValueLength 50000

const float fConstTc=500.;  //zx20010813, 
//计算一定时间内数据用户平均速率的时间窗口常量, 单位为slot, 
//具体情况见Proportional Fair调度算法的说明
typedef struct stC2IFeedbackDelay
{
	float fDelayedC2IValue;
	int iDelayTime;
}C2IFEEDBACKDELAY_TYPE;

#define FEEDBACKDELAY 3;	//反向链路反馈时延,3个时隙

#endif

⌨️ 快捷键说明

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