📄 cchannelmodel.cpp
字号:
#include "iostream.h"
#include <math.h>
#include "Newran.h"
#include "systemsim.h"
#include "CChannelModel.h"
#include "sys_random.h"
//#define FastFadingValueLength 50000
/////////for test only//
//#include "fstream.h"
//#include "iomanip.h"
//////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////查表法所用到的快衰数组////////////////////////////////////
extern float fFastFadingValue_1[SubslotNumber*FastFadingValueLength];
extern float fFastFadingValue_2[SubslotNumber*FastFadingValueLength];
extern float fFastFadingValue_3[SubslotNumber*FastFadingValueLength];
extern float fFastFadingValue_4[SubslotNumber*FastFadingValueLength];
extern float fFastFadingValue_5[SubslotNumber*FastFadingValueLength];
////////////////////////////////慢衰相关系数//////////////////////////////////////////////
void CChannelModel::CorrelationOfSlowFading()
{
const double ddcorr=100;//不相关距离
m_dCorrelationOfSlowFading=exp((-m_dMsSpeed)*0.5/ddcorr);//计算慢衰相关系数
//0.5秒为两次慢衰之间的时间间隔
}
/////////////////////////衰落初始值计算(近场和远场)////////////////////////////////////
float CChannelModel::InitialValues()
{
Normal y;
float fFading;
fFading=(float)pow(10.,y.Next()/10.0*m_fStdOfSlowFading);
return fFading;
}
/////////////////////////下一时刻衰落值(远场or近场)///////////////////////////////////
float CChannelModel::Next_Shadow_Fading(float fLastShadowFading)
{//sf为上一时刻的远场or近场的衰落值
Normal yy;
float fa=(float)yy.Next();//取一个与慢衰同分布的随机变量
float fy,fFading;
fy=(float)(log10(fLastShadowFading)*m_dCorrelationOfSlowFading*10.0/m_fStdOfSlowFading
+fa*sqrt(1-m_dCorrelationOfSlowFading*m_dCorrelationOfSlowFading));
fFading=(float)pow(10.,fy/10.0*m_fStdOfSlowFading);
return fFading;
}
//////////////下一时刻慢衰值计算(根据下一时刻的远场与近场值得到)//////////////////////
float CChannelModel::Next_Slow_fading(float fFarFading)//下一时刻慢衰值计算
{
float fNextSlowFading_DB=(float)(log10(m_fNearFieldOfSlowFading)*10.0
/(m_fStdOfSlowFading*sqrt(2.0))+log10(fFarFading)*10.0/(m_fStdOfSlowFading*sqrt(2.0)));
float fNextSlowFading=(float)pow(10.,fNextSlowFading_DB/10.0*m_fStdOfSlowFading);
return fNextSlowFading;
}
////////////////////////////////////初始化函数////////////////////////////////////////////////
void CChannelModel::Initialization(float fStdOfSlowFading,int iChannelType,NEIGHBORSECTOR_TYPE *pstNEIGHBORSECTOR_TYPE)
{ //pNT为NEIGHBORSECTOR_TYPE型数组头指针
m_fStdOfSlowFading=fStdOfSlowFading;//慢衰标准差
m_iChannelType=iChannelType;//信道类型
m_dW=0.;
for(int i=0;i<19;i++) //写入邻小区ID号
{
m_astFadingValues[i].stCellID.m=pstNEIGHBORSECTOR_TYPE[3*i].stSectorID.stCellID.m;
m_astFadingValues[i].stCellID.n=pstNEIGHBORSECTOR_TYPE[3*i].stSectorID.stCellID.n;
}
if(m_iChannelType==1) m_dMsSpeed=5.0/6.0; //写入车速
else if(m_iChannelType==2) m_dMsSpeed=25.0/9.0;
else if(m_iChannelType==3) m_dMsSpeed=25.0/3.0;
else if(m_iChannelType==4) m_dMsSpeed=100.0/3.0;
else m_dMsSpeed=0;
CorrelationOfSlowFading();//计算慢衰相关系数
m_fNearFieldOfSlowFading=InitialValues();//近场初始化
for (i=0;i<19;i++)
{
float fFarFading=InitialValues();//远场初始化(设一个变量FarFading便于计算慢衰)
m_astFadingValues[i].fSlowFarFading=fFarFading;//远场初始化
m_astFadingValues[i].fSlowFading=Next_Slow_fading(fFarFading);//慢衰初始化
for(int j=0;j<3;j++)//快衰初始化
{
m_iaStartime[i][j]=(int)((i+j*19)*2500+1000*xUniform());//起始时间初始化
for (int k=0;k<4;k++)
{
if (m_iChannelType==1) m_astFadingValues[i].fFastFadingSet[j][k]=fFastFadingValue_1[(k+m_iaStartime[i][j])];
else if(m_iChannelType==2) m_astFadingValues[i].fFastFadingSet[j][k]=fFastFadingValue_2[(k+m_iaStartime[i][j])];
else if(m_iChannelType==3) m_astFadingValues[i].fFastFadingSet[j][k]=fFastFadingValue_3[(k+m_iaStartime[i][j])];
else if(m_iChannelType==4) m_astFadingValues[i].fFastFadingSet[j][k]=fFastFadingValue_4[(k+m_iaStartime[i][j])];
else m_astFadingValues[i].fFastFadingSet[j][k]=fFastFadingValue_5[(k+m_iaStartime[i][j])];
}
}
}
}
/////////////////////////////////获得衰落值的函数/////////////////////////////////////////
FADINGVALUE_TYPE *CChannelModel::GetFadingValues(int iSlotCounter)
{
int iSlotNumber=iSlotCounter%50000;//如果iSlotCounter>=50000,则表已到尾,要回到表头
if(iSlotCounter==1)//初始化
{
return m_astFadingValues;
}
else if(iSlotCounter!=1&&iSlotCounter%400==0)//计算下一时刻的衰落值(慢衰更新)
{
float fFarFading_exchange=0.0;
float fNearFading_exchange=0.0;
fNearFading_exchange=m_fNearFieldOfSlowFading;//导出上一时刻近场值
m_fNearFieldOfSlowFading=Next_Shadow_Fading(fNearFading_exchange);//计算、写入下一时刻近场值
for(int i=0;i<19;i++)
{
fFarFading_exchange=m_astFadingValues[i].fSlowFarFading;//导出上一时刻远场值
m_astFadingValues[i].fSlowFarFading=Next_Shadow_Fading(fFarFading_exchange);
//计算、写入下一时刻远场值
m_astFadingValues[i].fSlowFading=Next_Slow_fading(m_astFadingValues[i].fSlowFarFading);
//计算、写入下一时刻慢衰值
for (int j=0;j<3;j++)//快衰初始化
{
for (int k=0;k<4;k++)
{
if((4*iSlotNumber+k+m_iaStartime[i][j])==199999)
m_iaStartime[i][j]=0;
if (m_iChannelType==1) m_astFadingValues[i].fFastFadingSet[j][k]=fFastFadingValue_1[(4*iSlotNumber+k+m_iaStartime[i][j])];
else if(m_iChannelType==2) m_astFadingValues[i].fFastFadingSet[j][k]=fFastFadingValue_2[(4*iSlotNumber+k+m_iaStartime[i][j])];
else if(m_iChannelType==3) m_astFadingValues[i].fFastFadingSet[j][k]=fFastFadingValue_3[(4*iSlotNumber+k+m_iaStartime[i][j])];
else if(m_iChannelType==4) m_astFadingValues[i].fFastFadingSet[j][k]=fFastFadingValue_4[(4*iSlotNumber+k+m_iaStartime[i][j])];
else m_astFadingValues[i].fFastFadingSet[j][k]=fFastFadingValue_5[(4*iSlotNumber+k+m_iaStartime[i][j])];
}
}
}
return m_astFadingValues;
}
else//计算下一时刻的衰落值(慢衰保持)
{
for(int i=0;i<19;i++)
{
for (int j=0;j<3;j++)//快衰初始化
{
for (int k=0;k<4;k++)
{
if((4*iSlotNumber+k+m_iaStartime[i][j])==199999)
m_iaStartime[i][j]=0;
if (m_iChannelType==1) m_astFadingValues[i].fFastFadingSet[j][k]=fFastFadingValue_1[(4*iSlotNumber+k+m_iaStartime[i][j])];
else if(m_iChannelType==2) m_astFadingValues[i].fFastFadingSet[j][k]=fFastFadingValue_2[(4*iSlotNumber+k+m_iaStartime[i][j])];
else if(m_iChannelType==3) m_astFadingValues[i].fFastFadingSet[j][k]=fFastFadingValue_3[(4*iSlotNumber+k+m_iaStartime[i][j])];
else if(m_iChannelType==4) m_astFadingValues[i].fFastFadingSet[j][k]=fFastFadingValue_4[(4*iSlotNumber+k+m_iaStartime[i][j])];
else m_astFadingValues[i].fFastFadingSet[j][k]=fFastFadingValue_5[(4*iSlotNumber+k+m_iaStartime[i][j])];
}
}
}
return m_astFadingValues;
}
}
/*///////////////////////////////获得快衰值函数//////////////////////////////////////////////
float (*(CChannelModel::GetFastFadingValPtr(int iSlotCounter)))[SubslotNumber]
{
if(m_iChannelType==1)
{
if(iSlotCounter==0)//iSlotCounter==0即快衰初始并写入数组
{
for(int i=0;i<21;i++)
{
m_iaStartime[i]=rand();
for(int t0=0;t0<4;t0++)
{
// m_faFastFadingValues[i][t0]=FastFading((t0+m_iaStartime[i])/(double)3200);
m_faFastFadingValues[i][t0]=fFastFadingValue_1[(t0+m_iaStartime[i])];
}
}
}
else//非初始的快衰计算并写入数组
{
int t0=iSlotCounter;
for(int i=0;i<21;i++)
{
for(t0=iSlotCounter;t0<4+iSlotCounter;t0++)
{
// m_faFastFadingValues[i][(t0-iSlotCounter)]=FastFading((t0+m_iaStartime[i])/(double)3200);
if ((t0+m_iaStartime[i])<99999)
m_faFastFadingValues[i][(t0-iSlotCounter)]=fFastFadingValue_1[(t0+m_iaStartime[i])];
}
}
}
}
else if(m_iChannelType==2)
{
if(iSlotCounter==0)//iSlotCounter==0即快衰初始并写入数组
{
for(int i=0;i<21;i++)
{
m_iaStartime[i]=rand();
for(int t0=0;t0<4;t0++)
{
// m_faFastFadingValues[i][t0]=FastFading((t0+m_iaStartime[i])/(double)3200);
m_faFastFadingValues[i][t0]=fFastFadingValue_2[(t0+m_iaStartime[i])];
}
}
}
else//非初始的快衰计算并写入数组
{
int t0=iSlotCounter;
for(int i=0;i<21;i++)
{
for(t0=iSlotCounter;t0<4+iSlotCounter;t0++)
{
// m_faFastFadingValues[i][(t0-iSlotCounter)]=FastFading((t0+m_iaStartime[i])/(double)3200);
if ((t0+m_iaStartime[i])<99999)
m_faFastFadingValues[i][(t0-iSlotCounter)]=fFastFadingValue_2[(t0+m_iaStartime[i])];
}
}
}
}
else if(m_iChannelType==3)
{
if(iSlotCounter==0)//iSlotCounter==0即快衰初始并写入数组
{
for(int i=0;i<21;i++)
{
m_iaStartime[i]=rand();
for(int t0=0;t0<4;t0++)
{
// m_faFastFadingValues[i][t0]=FastFading((t0+m_iaStartime[i])/(double)3200);
m_faFastFadingValues[i][t0]=fFastFadingValue_3[(t0+m_iaStartime[i])];
}
}
}
else//非初始的快衰计算并写入数组
{
int t0=iSlotCounter;
for(int i=0;i<21;i++)
{
for(t0=iSlotCounter;t0<4+iSlotCounter;t0++)
{
// m_faFastFadingValues[i][(t0-iSlotCounter)]=FastFading((t0+m_iaStartime[i])/(double)3200);
if ((t0+m_iaStartime[i])<99999)
m_faFastFadingValues[i][(t0-iSlotCounter)]=fFastFadingValue_3[(t0+m_iaStartime[i])];
}
}
}
}
else if(m_iChannelType==4)
{
if(iSlotCounter==0)//iSlotCounter==0即快衰初始并写入数组
{
for(int i=0;i<21;i++)
{
m_iaStartime[i]=rand();
for(int t0=0;t0<4;t0++)
{
// m_faFastFadingValues[i][t0]=FastFading((t0+m_iaStartime[i])/(double)3200);
m_faFastFadingValues[i][t0]=fFastFadingValue_4[(t0+m_iaStartime[i])];
}
}
}
else//非初始的快衰计算并写入数组
{
int t0=iSlotCounter;
for(int i=0;i<21;i++)
{
for(t0=iSlotCounter;t0<4+iSlotCounter;t0++)
{
// m_faFastFadingValues[i][(t0-iSlotCounter)]=FastFading((t0+m_iaStartime[i])/(double)3200);
if ((t0+m_iaStartime[i])<99999)
m_faFastFadingValues[i][(t0-iSlotCounter)]=fFastFadingValue_4[(t0+m_iaStartime[i])];
}
}
}
}
else
{
if(iSlotCounter==0)//iSlotCounter==0即快衰初始并写入数组
{
for(int i=0;i<21;i++)
{
m_iaStartime[i]=rand();
for(int t0=0;t0<4;t0++)
{
// m_faFastFadingValues[i][t0]=FastFading((t0+m_iaStartime[i])/(double)3200);
m_faFastFadingValues[i][t0]=fFastFadingValue_5[(t0+m_iaStartime[i])];
}
}
}
else//非初始的快衰计算并写入数组
{
int t0=iSlotCounter;
for(int i=0;i<21;i++)
{
for(t0=iSlotCounter;t0<4+iSlotCounter;t0++)
{
// m_faFastFadingValues[i][(t0-iSlotCounter)]=FastFading((t0+m_iaStartime[i])/(double)3200);
if ((t0+m_iaStartime[i])<99999)
m_faFastFadingValues[i][(t0-iSlotCounter)]=fFastFadingValue_5[(t0+m_iaStartime[i])];
}
}
}
}
return m_faFastFadingValues;
}*/
///////////////////////////////快衰初始及计算函数////////////////////////////////
float CChannelModel::FastFading(double dt0)
{m_iChannelType=5;
////////////////定义4个随机数组,每1/4chip用一个随机数表示///////////////////////
int j=0;
static float A0[1536];//A0没有延时
for(;j<1536;j++)
A0[j]=rand1();
static float A1[1536];//A1比A0延1/4个chip
A1[0]=A0[1535];
for(j=1;j<1536;j++)
A1[j]=A0[j-1];
static float A2[1536];//A2比A0延1/2个chip
A2[0]=A1[1535];
for(j=1;j<1536;j++)
A2[j]=A1[j-1];
static float A4[1536];//A4比A0延1个chip
A4[0]=A2[1534];
A4[1]=A2[1535];
for(j=2;j<1536;j++)
A4[j]=A2[j-2];
/////////////////////////////////////////////////////////////////////////////////////
double arfa1=0;
double arfa2=2*PI*(2-1)/N2; //第2径相位
double arfa3=2*PI*(3-1)/N2; //第3径相位
int n;
float C1n=0; //同相分量权值
float C1m=0; //正交分量权值
double Wn=0; //同相分量频率
double Wm=0; //正交分量频率
float S=0; //1/4chip内的功率
float S1=0; //1/4个slot内总功率
// float s=0; //实际功率
float Sc=0; //同相分量(功率)
float Ss=0; //正交分量(功率)
float Sc1=0; //幅度同相分量(信道2,3,4。用方法2) or 同相自功率(信道1,5。用方法1)
float Ss1=0; //幅度正交分量(信道2,3,4。用方法2) or 正交自功率(信道1,5。用方法1)
float Sc11=0; //第1径同相分量(加信号,衰减)
float Sc12=0; //第2径同相分量(加信号,衰减)
float Sc13=0; //第3径同相分量(加信号,衰减)
float Ss11=0; //第1径正交分量(加信号,衰减)
float Ss12=0; //第2径正交分量(加信号,衰减)
float Ss13=0; //第3径正交分量(加信号,衰减)
float q=0;
float qn=0;
float qm=0;
float Qc1=0; //第1径同相分量
float Qc2=0; //第2径同相分量
float Qc3=0; //第3径同相分量
float Qs1=0; //第1径正交分量
float Qs2=0; //第2径正交分量
float Qs3=0; //第3径正交分量
float V=0; //速度km/h
float y=0; //归一化后的功率
float S0=0; //用来归一化
int z=0;
/////////////////////////信道一////////////////////////////////////////////////////
if(m_iChannelType==1) //Pedestrian A(jakes,单径)
{
V=3;//km/h
m_dW=2.0*PI*V*Frequency/LightSpeed;
Sc1=jakec1(dt0);
Sc=Sc1;
Ss1=jakes1(dt0);
Ss=Ss1;
S=Sc+Ss;
S0=1.0;
y=S/S0;//归一化
}
////////////////////////////信道二//////////////////////////////////////////////////
else if(m_iChannelType==2)//Pedestrian B(jakes,三径)
{
V=10;//km/h
m_dW=2.0*PI*V*Frequency/LightSpeed;
for(z=0;z<1536;z++)
{
for(n=1;n<N2;n++)
{
arfa1=PI*n/(N2+1);
Wn=m_dW*cos((double)n*PI/(2*N2-1));
C1n=2*delta*(float)sin((double)n*PI/(N2-1))/(float)sqrt((double)N2-1/2);
qn=C1n*(float)cos(Wn*(dt0+z/(1.2288e6))+arfa1);
Qc1=Qc1+qn;
qn=0;
C1m=2*delta*(float)cos((double)n*PI/(N2-1))/(float)sqrt((double)N2-1/2);
qm=C1m*(float)cos(Wn*(dt0+z/(1.2288e6))+arfa1);
Qs1=Qs1+qm;
qm=0;
}
if(n==N2)
{
arfa1=PI*n/(N2+1);
q=delta*(float)cos(m_dW*(dt0+z/(1.2288e6))+arfa1)/(float)sqrt((double)N2-1/2);
Qc1=Qc1+q;
Sc11=A0[z]*Qc1;
Qc1=0;
Qs1=Qs1+q;
Ss11=A0[z]*Qs1;
Qs1=0;
}//第1径
for(n=1;n<N2;n++)
{
arfa1=PI*n/(N2+1);
Wn=m_dW*cos((double)n*PI/(2*N2-1));
C1n=2*delta*(float)sin((double)n*PI/(N2-1))/(float)sqrt((double)N2-1/2);
qn=C1n*(float)cos(Wn*(dt0+z/(1.2288e6))+arfa1+arfa2);
Qc2=Qc2+qn;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -