ns-3-model-library wifi 浅析_ns-3wifi部分解析_ns-3网络模拟器wifi部分文档分析_Part3

28 篇文章 0 订阅
19 篇文章 8 订阅

 

ns(来源于“network simulator”)是一系列离散事件网络模拟器,包括ns-1、ns-2和ns-3。他们主要应用于研究和教学。ns-3是自由软件,以GNU GPLv2协议分发。​——百度百科

wifi是日常生活中不可或缺的一部分,在工业和物联网场景也得到了越来越多的应用,在ns-3网络模拟器的说明文档里面占有46页的比重(说明文档总共605页,四十多章),可见wifi模块在ns-3体系中占有很重要的地位。

ns-3体系中有一种对象称为 节点 node,每一个node相当于一台电脑,一个Linux主机平台,每个node上面可以安装一个或几个网卡,网卡称为net device,net device可以是以太网有线网卡,也可以是蓝牙 wifi 无线网卡(蓝牙也是传输数据,也可以组网,所以也算是net device)。

Part1中,介绍了ns-3网络模拟器中收发基本流程和MacPhy基本组成:

ns-3-model-library wifi 浅析_ns-3wifi部分解析_ns-3网络模拟器wifi部分文档分析_Part1_Mr_liu_666的博客-CSDN博客_ns3自组网​ns(来源于“network simulator”)是一系列离散事件网络模拟器,包括ns-1、ns-2和ns-3。他们主要应用于研究和教学。ns-3是自由软件,以GNU GPLv2协议分发。​——百度百科wifi是日常生活中不可或缺的一部分,在工业和物联网场景也得到了越来越多的应用,在ns-3网络模拟器的说明文档里面占有46页的比重(总共605页,四十多章),可见wifi模块在ns-3体系中占有很重要的地位。ns-3体系中有一种对象称为 节点 node,每一个nohttps://blog.csdn.net/Mr_liu_666/article/details/123597203Part2中,介绍了Phy Entity的构成和PHY接收数据包的大致流程:

ns-3-model-library wifi 浅析_ns-3wifi部分解析_ns-3网络模拟器wifi部分文档分析_Part2_Mr_liu_666的博客-CSDN博客icon-default.png?t=M85Bhttps://blog.csdn.net/Mr_liu_666/article/details/124061083本节Part3介绍interference helper、Error Rate model、Table Based Error Rate Model 、Legacy Error Rate Models、Spectrum Wifi Phy这几个PHY相关的模块:

Interference Helper

前面说过,Interference Helper会设置CCA阈值,计算SNR,根据随机数判断PHY的包头是不是正确的;

在ns-3说明中,它的功能为:跟踪所有进入PHY的数据包、计算数据包的错误概率,评估通道上的能量能否超过CCA阈值。

错误概率计算基本操作如下图所示:

从上图第一行可以看到,A包是我们想要的包,B是interference,第二行给出了A的功率就是信号强度,第三行给出了白噪声加上B的信号强度就是NI(noise+interference),第四行是信号墙强度和NI的对比图,根据只有噪声和既有噪声又有干扰,SINR的计算也就被分为两段chunk1/2

包用bits而不是symbol表示,interference helper将一个包拆成一个/多个chunk(块),每个块的SNIR(signal to noise+interference ratio信噪比)不同。选定error model之后,error model会计算出给定bit数目的错误概率(比如一个chunk有10bits,当前误码率是10e-6,那么这个chunk对的概率就是0.999999e10),根据chunk和各自的持续时间,interference helper算出整个包的错误概率并将错误概率交给PHY。根据SINR,我们能算出传输模型和编码方式的BER和PER(误码率和误包率)。

使用MIMO时,若空间流数目小于RX天线数,那么多出来的天线可以传输同样的数据,可以提高SNR,提升倍数(gain)计算如下(没有使用STBC,也就是说各个空间流里面的数据是不一样的):

可见,接收天线越多,空间流数目越少,对SINR的增益越大(空间流数目越少,吞吐越低)

TX天线足够多时,可以忽略掉高斯白噪声带来的影响,根据以上的公式,不同的TX、RX、空间流数组合,对SINR带来的增益如下表所示:

Error Rate Model

 ns-3的包接收正确或错误基于SINR(signal to Interference/Noise Ratio)。误包率与SINR有关,具体用Error Rate Model去把SINR换算成误包率,Error Rate Model多种可选。PER误包率是由MCS(Modulation and Coding Scheme,包括调制和编码方式)和SINR共同确定的。

Error Rate Model 的默认模式对于OFDM是Table Based Error Rate Model,对于11a和11g,默认模式是Yans Error Rate Model,对于11b,默认模式是DSSS Error Rate Model。

这些模型都是读论文然后使用的他们的成果,我把原文粘贴在这:

The error models are described in more detail in outside references.
The current OFDM model is based on work pub-lished in [patidar2017], using link simulations results from the MATLAB WLAN Toolbox, and validated against IEEE TGn results [erceg2004].
For publications related to other error models, please refer to
[pei80211ofdm],
[pei80211b],
[lacage2006yans], 
[Haccoun], 
[hepner2015] and
[Frenger] 
for a detailed description of the legacy PER models.

当前的ns-3 error rate model 只适用于AWGN 加性高斯白噪声信道,没有有关于频率选择性衰落的部分。 Error Rate Model共有4种:

Table Based Error Rate Model

用于OFDM模式,对于11b,直接使用DSSS。此模型是11n/11ac/11ax的默认 Error Rate Model。

与基于错误边界的错误分析模型不同,Table Based Error Rate Model使用的是查表的方法——一张基于AWGN信道的PER vs SNR的表。PER当然与包大小有关,但做表无法做一个所有包大小都对应一个SNR-PER表。

对于BCC 前向纠错编码的情况:

有两个长度的表来推测任意长度,对于小于400 Byte的的包,按照长度32Byte算,大于400的包,按照1458算

对于LDPC前向纠错编码的情况:

只使用一种参考长度(并没有说长度是多少)

这两个用于BCC的表和一个用于LDPC的表都是MATLAB生成的。对于BCC编码,只支持到MCS9,更高的MCS调用Yans Error Rate Model。

ns-3对2个BCC编码对照表和1个LDPC对照表进行了验证,验证条件如下:

  1. 理想信道(应该指除了AWGN以外理想)和完美信道估计(指的是80211的信道估计)
  2. 完美的包同步和检测(指的是PHY的包同步OK且没有漏包)
  3. 不考虑相位跟踪、相位校正、相位噪声、载波频偏、功放非线性等PHY以下的射频部分带来的问题

 ns-3在链路上模拟多个包以获得PER,包的数量需要足够多,直到使计算PER与真实PER相差不超过10%的概率在95%以上。ns-3 的每一个信噪比都是模拟了40000个包来确定表好用、模型OK的。ns-3将自己的表算出来的结果(自己的表示matlab生成的)与ieee 80211官方给出的TGAX结果对比,认为自己的结果与官方的非常接近,是OK的。对比图如下:

Yans Error Rate Model

用于OFDM模式,对于11b,直接使用DSSS。此模型是11a/11g的默认 Error Rate Model。

这个是ns最初使用的Error Rate model,是基于分析结果的一个模型,对于11b调制,1Mbps是基于DBPSK的,BER是来自[PROAKIS2001]的方程5.2-69。 2 Mbps模型是基于DQPSK的。 [Ferrari2004]的方程8。 更多细节请参见[Lacage2006Yans]。

DSSS Error Rate Model

用于11b模式,对于11b的1Mbps 和 2Mbps的误码率是基于经典调制分析(就是 Yans Error Rate Model)的。如果本地安装了GSL库,那么久使用5.5Mbps和11Mbps进行CCK现场调制,如没有安装,就使用从MATLAB上拷贝出来的CCK模拟模型结果

Nist Error Rate Model

用于OFDM模式,对于11b,直接使用DSSS。——并不是默认模式。

比Yans Error Rate Model更晚出现,对于1Mbps和2Mbps使用DSSS调制,与Yans Error Rate Model基本一致,但5.5Mbps和11Mbps是根据[Pursley2009]中的方程(17)和(18)重新建立的。 对于OFDM调制,基于NIST[Miller2003]之前所做的工作得到了新的结果。 并将其结果与CMU无线网络仿真器进行了比较,验证细节在[PEE80211OFDM]中提供。 由于OFDM模式使用硬判决的删余码,编码误码率计算使用Chernoff边界[Hepner2015]。NIST包含OFDM和11b两部分,11b就被单独分离出来,称为DSSS Error Rate Model,这个模型的关于GSL的部分在上面。

Yans的11b部分和NIST的11b+OFDM结果与官方ieee 80211 TGn 给出的数据误差较大,所以后面OFDM的默认Error Rate就是Table Based Error Rate Model。Yans 和 NIST不准的程度如下图所示:

事实上NIST YANS 或者Table Based都是可以用于OFDM的,对于11b,都是DSSS,在ns3.32之前的版本,OFDM默认是Nist。

Spectrum Wifi Phy

这部分本应该说明更加详细,但事实上说明较短。

Spectrum Wifi Phy在src/wifi/model/spectrum-wifi-phy.{cc,h}、wifi-spectrum-phy-interface.{cc,h}、wifi-spectrum-signal-parameters.{cc,h}、wifi-spectrum-value-helper.{cc,h}中定义。

Spectrum与Yans的Interference Manager和Error Rate Model一致,唯一不同的地方就是把除了Wifi以外的其他信号作为附加噪声。要在Yans基础上变成Spectrum,需要Wifi以外的包也能被PHY收到,信道也要使用各种协议都有的Multi Model Spectrum Channel。Interference Helper也需要能看到其他协议包的功率,并作为噪声加进去,算PER——就像非预期的节点的信号强度(不是和自己连接的其他节点之间的信号强度或者隐藏节点的信号强度)需要加到噪声里一样。

与没有其他协议信号的Yans Phy不同,除了Wifi信号,其他协议信号也会超过CCA Ed Threshold,导致PHY进入CCA_BUSY状态,也就是说,CCA Ed Threshold在Spectrum Phy中使用比Yans Phy更频繁。

Spectrum PHY 在Yans Phy的基础上,收发使用Spectrum Channel API,例如Wifi Spectrum Value Helper用于创建 Spectrum Wifi 信号,再将能量值传播到各个频带——其中OFDM功率分配取决于功率分配给子载波的方式分配,相邻信道使用OFDM发射频谱掩码建模。

Spectrum Wifi helper的忌口与Yans Wifi Helper的一样,配置起来算是比较方便的了。在 Spectrum Wifi Phy和Spectrum Channel之间,还有一个Wifi Spectrum Phy Interface,Wifi Spectrum Phy Interface负责调用不同的Spectrum Wifi Phy::STARTRx()来开始接收,也是先和Rx Sensitivity(-101dbm)做比较,接下来看信号是不是wifi信号,不是wifi信号的交给Spectrum Interference Helper进行CCA_BUSY的判断、作为噪声算PER,之后就丢掉了,是WIFI信号的就调用 Start Receive Preamble,后面就和Yans一样了——只是PER计算不一样而已。(下图的后半截是我上一篇博客的图,不是抄的其他地方的)

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个基于ns-3.27的NS-3 WIFI性能仿真代码,用于模拟802.11n网络的性能。 ``` #include "ns3/core-module.h" #include "ns3/mobility-module.h" #include "ns3/wifi-module.h" #include "ns3/internet-module.h" #include "ns3/network-module.h" #include "ns3/applications-module.h" #include "ns3/flow-monitor-helper.h" #include "ns3/flow-monitor-module.h" using namespace ns3; NS_LOG_COMPONENT_DEFINE ("WifiN"); int main (int argc, char *argv[]) { uint32_t nWifi = 3; bool verbose = false; CommandLine cmd; cmd.AddValue ("nWifi", "Number of wifi STA devices", nWifi); cmd.AddValue ("verbose", "Turn on all WifiNetDevice log components", verbose); cmd.Parse (argc,argv); if (verbose) { LogComponentEnableAll (LOG_LEVEL_INFO); LogComponentEnable ("WifiNetDevice", LOG_LEVEL_ALL); } NodeContainer wifiStaNodes; wifiStaNodes.Create (nWifi); NodeContainer wifiApNode; wifiApNode.Create (1); YansWifiChannelHelper channel = YansWifiChannelHelper::Default (); YansWifiPhyHelper phy = YansWifiPhyHelper::Default (); phy.SetChannel (channel.Create ()); WifiHelper wifi = WifiHelper::Default (); wifi.SetRemoteStationManager ("ns3::AarfWifiManager"); NqosWifiMacHelper mac = NqosWifiMacHelper::Default (); Ssid ssid = Ssid ("ns-3-ssid"); mac.SetType ("ns3::StaWifiMac", "Ssid", SsidValue (ssid), "ActiveProbing", BooleanValue (false)); NetDeviceContainer staDevices; staDevices = wifi.Install (phy, mac, wifiStaNodes); mac.SetType ("ns3::ApWifiMac", "Ssid", SsidValue (ssid)); NetDeviceContainer apDevice; apDevice = wifi.Install (phy, mac, wifiApNode); MobilityHelper mobility; mobility.SetPositionAllocator ("ns3::GridPositionAllocator", "MinX", DoubleValue (0.0), "MinY", DoubleValue (0.0), "DeltaX", DoubleValue (5.0), "DeltaY", DoubleValue (10.0), "GridWidth", UintegerValue (3), "LayoutType", StringValue ("RowFirst")); mobility.SetMobilityModel ("ns3::RandomWalk2dMobilityModel", "Bounds", RectangleValue (Rectangle (-50, 50, -50, 50))); mobility.Install (wifiStaNodes); mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel"); mobility.Install (wifiApNode); InternetStackHelper stack; stack.Install (wifiApNode); stack.Install (wifiStaNodes); Ipv4AddressHelper address; address.SetBase ("10.1.1.0", "255.255.255.0"); Ipv4InterfaceContainer staNodeInterface; staNodeInterface = address.Assign (staDevices); address.SetBase ("10.1.2.0", "255.255.255.0"); Ipv4InterfaceContainer apNodeInterface; apNodeInterface = address.Assign (apDevice); UdpEchoServerHelper echoServer (9); ApplicationContainer serverApps = echoServer.Install (wifiApNode.Get (0)); serverApps.Start (Seconds (1.0)); serverApps.Stop (Seconds (10.0)); UdpEchoClientHelper echoClient (apNodeInterface.GetAddress (0), 9); echoClient.SetAttribute ("MaxPackets", UintegerValue (1)); echoClient.SetAttribute ("Interval", TimeValue (Seconds (1.0))); echoClient.SetAttribute ("PacketSize", UintegerValue (1024)); ApplicationContainer clientApps = echoClient.Install (wifiStaNodes.Get (0)); clientApps.Start (Seconds (2.0)); clientApps.Stop (Seconds (10.0)); FlowMonitorHelper flowmon; Ptr<FlowMonitor> monitor = flowmon.InstallAll (); Simulator::Stop (Seconds (10.0)); Simulator::Run (); monitor->CheckForLostPackets (); Ptr<Ipv4FlowClassifier> classifier = DynamicCast<Ipv4FlowClassifier> (flowmon.GetClassifier ()); std::map<FlowId, FlowMonitor::FlowStats> stats = monitor->GetFlowStats (); for (std::map<FlowId, FlowMonitor::FlowStats>::const_iterator i = stats.begin (); i != stats.end (); ++i) { Ipv4FlowClassifier::FiveTuple t = classifier->FindFlow (i->first); std::cout << "Flow " << i->first << " (" << t.sourceAddress << " -> " << t.destinationAddress << ")\n"; std::cout << " Tx Bytes: " << i->second.txBytes << "\n"; std::cout << " Rx Bytes: " << i->second.rxBytes << "\n"; std::cout << " Throughput: " << i->second.rxBytes * 8.0 / 9.0 / 1000 / 1000 << " Mbps\n"; } Simulator::Destroy (); return 0; } ``` 这个代码创建了一个包含一个AP和三个STA的802.11n网络,使用UDP Echo协议进行通信,并使用Flow Monitor模块监测网络流量。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值