在VANET的仿真中,为了使得结果更加的真实,合适的场景和信道模型很有必要。
在很多文献中,所用的信道模型多为Two-ray ground model 和 Two-ray interference model 以及Nakagami信道模型。在我所用的Veins仿真框架中,已有的信道模型是自由空间传播、Log-normal shadowing Two-ray interference等比较简单的模型,并没有集成Nakagami-m信道。而在开源Inetmanet仿真程序包中,作者集成了多种信道模型,包括Log-normal、Rayleigh、Rice、Two-ray ground 以及Nakigami-m信道模型[1]。
而今,众多的文献都认为Nakagami-m信道比起其他的模型来说更加的适合车载环境的仿真,所以为了使得以后的仿真更加的可信,我决定在Veins模块里面以简单的方法加入Nakigami-m信道模型。
在介绍集成方法之前,先从信道对接收功率影响的角度来看看各种信道模型到底是怎么回事[2]。
自由空间传播模型 (Friss model)
假设电磁波在空中的传播是各向同性的,则离源节点d处的接收功率是一个二次衰减的形式,即:
Two-Ray Ground 模型
该模型和Friss模型比起来,进一步的考虑了地面反射造成的损耗. 其接收功率和距离 d 是一个四次方的损耗关系:
Rayleigh信道模型
该信道模型不考虑直射分量(LoS),其接收信号的暴落服从瑞利分布, d 处接收功率与自由空间Friss模型有一下关系:
Rice信道模型
莱斯信道在瑞利信道的基础上加入了LoS分量,它和瑞利信道比起来多了一个scale因子 k . 具体不赘述.
Nakagami信道模型
该信道模型是一个经验模型,也就是通过实验数据拟合所得,比前面的几个模型更具真实性。其 d 处的接收功率服从Gamma分布:
基于接收功率这些简单的性质,[1]中实现的信道模型就从接收功率出发,实现了各个信道模型:
1. 计算自由空间传播模型 d 处的接收功率 pr ;
2. 以 pr 为基本参数,产生随机数,模拟接收功率的随机变化.
以Rayleigh和Nakagami-m为例:
double RayleighModel::calculateReceivedPower(double pSend, double carrierFrequency, double distance)
{
double waveLength = SPEED_OF_LIGHT / carrierFrequency;
//得到平均接收功率:由自由空间传播模型得到
double avg_rx_power = freeSpace(Gt, Gr, L, pSend, waveLength, distance, pathLossAlpha);
double x = normal(0, 1);
double y = normal(0, 1);//用于产生瑞利分布随机数.
double prec = avg_rx_power * 0.5 * (x*x + y*y);
if (prec > pSend)//pSend为发送功率,容错处理
prec = pSend;
return prec;//返回最终的接收功率.
}
double NakagamiModel::calculateReceivedPower(double pSend, double carrierFrequency, double distance)
{
const int rng = 0;
double waveLength = SPEED_OF_LIGHT / carrierFrequency;
//得到平均接收功率
double avg_power = freeSpace(Gt, Gr, L, pSend, waveLength, distance, pathLossAlpha);
avg_power = avg_power/1000;//单位转换mw->w
//服从gamma分布
double prec = gamma_d(m, avg_power / m, rng) * 1000.0;
if (prec > pSend)
prec = pSend;
return prec;
}
可以看到,inetmanet模块中实现的信道模型比较简单,特别是Nakagami-m信道.
故在veins中我也基于这个方法,在自由空间传播模型的基础上进行修改,以简单的方法实现该信道(Decider80211p.cc):
simtime_t Decider80211p::processNewSignal(AirFrame* msg) {
AirFrame11p *frame = check_and_cast(msg);
// get the receiving power of the Signal at start-time and center frequency
Signal& signal = frame->getSignal();
Argument start(DimensionSet::timeFreqDomain);
start.setTime(signal.getReceptionStart());
start.setArgValue(Dimension::frequency_static(), centerFrequency);
signalStates[frame] = EXPECT_END;
double transPower=signal.getTransmissionPower()->getValue(start);//test.如此可得到发送功率
//2015-4-5此处实现了NAKAGAMI-m信道
double m=2;//m参数
double recvPower_o=signal.getReceivingPower()->getValue(start);得到由自由空间传播模型计算的接收功率
recvPower_o=recvPower_o/1000.0;//单位转换
double recvPower=gamma_d(m,((recvPower_o)/m))*1000.0;//功率服从gamma分布,得到新的接收功率.
//2015-4-5
if (recvPower < sensitivity) {//判断接收功率和阀值的关系,以处理接收的数据.
...........
}
上面的实现代码在Decider80211p.cc文件中,该文件作为物理层的补充,里面的函数将调用相应的信道模型来计算接收功率。显然,要想使得上面的代码正确,必须使当前使用的信道模型为自由空间传播模型(config.xml文件中设定).
这个方法的好处就是简单可行,缺点是修改了物理层代码,使得要想使用其他信道,还需要删除掉新添加的代码.
该方法仅供参考,Veins中信道模型的实现方式比较难懂,如果有同学知道其实现机理,还请多多交流!
[1] https://github.com/aarizaq/inetmanet-2.0
[2] Kuntz A, Schmidt-Eisenlohr F, Graute O, et al. Introducing probabilistic radio propagation models in omnet++ mobility framework and cross validation check with ns-2[C]//Proceedings of the 1st international conference on Simulation tools and techniques for communications, networks and systems & workshops. ICST (Institute for Computer Sciences, Social-Informatics and Telecommunications Engineering), 2008: 72.