LTE用户文档
(如有不当的地方,欢迎指正!)
21 Examples Programs(示例程序)
路径 src/lte/examples/ 包含一些示例仿真程序,这些例子表明如何仿真不同的LTE场景。
22 Reference scenarios(参考场景)
文献中可以找到大量的参考仿真场景。下面我们列出了其中一部分:
- [TR36814] 的 A.2 节提到的系统仿真场景。
- dual stripe model [R4-092042], 在示例程序 src/lte/examples/lena-dual-stripe.cc 中有部分提及。该示例程序的特点是有很多可配置的参数,可以通过修改相关的全局变量来自定义。可以使用下列命令来获取所有这些全局变量的列表:
-
./waf --run lena-dual-stripe --command-template="%s --PrintGlobals"
下面小节给出了运行仿真程序的例子。
22.1 Handover simulation campaign
在本小节,我们演示了使用 ns-3 的 LTE 模块运行仿真 campaign 的例子。 campaign 的目标是比较 LTE 模块每一个内置的切换算法的效果。
campaign 使用 lena-dual-stripe 示例程序。首先,我们必须修改示例程序来产生我们需要的输出。这种情况下,我们想要的输出为:产生切换的次数、用户平均吞吐量以及平均 SINR。
切换次数可以通过计算 HandoverEndOk Handover traces is fired 的次数获得。然后用户平均吞吐量可以通过使能 RLC Simulation Output 获得。最后,SINR 可以通过使能 PHY 仿真输出获得。下列样本代码片段显示了获得上述输出的一种可能方式:
void NotifyHandoverEndOkUe (std::string context, uint64_t imsi, uint16_t cellId, uint16_t rnti) { std::cout << "Handover IMSI " << imsi << std::endl; } int main (int argc, char *argv[]) { /*** SNIP ***/ Config::Connect ("/NodeList/*/DeviceList/*/LteUeRrc/HandoverEndOk", MakeCallback (&NotifyHandoverEndOkUe)); lteHelper->EnablePhyTraces (); lteHelper->EnableRlcTraces (); Ptr<RadioBearerStatsCalculator> rlcStats = lteHelper->GetRlcStats (); rlcStats->SetAttribute ("StartTime", TimeValue (Seconds (0))); rlcStats->SetAttribute ("EpochDuration", TimeValue (Seconds (simTime))); Simulator::Run (); Simulator::Destroy (); return 0; }
然后我们必须配置程序的参数来满足我们的仿真需求。我们在仿真中寻求下列假设:
- 将六边形小区划分为3个扇区,每个扇区有 7 个宏基站站点(例如,21个宏小区),站点间的距离为 500 m 。
- 尽管 lena-dual-stripe 最初用于两层网络( macrocell 和 femtocell)仿真,我们简化为只有一层(macrocell)。
- 用户随机部署在站点周围,使用空闲模式小区选择自动连接到网络。此后,用户以 60 kmph 的移动速度在仿真环境中移动。
- 仿真持续时间为 50 秒,因此用户有足够的时间来触发一些切换。
- 宏小区传输功率为 46 dBm ,用户传输功率为 10 dBm。
- 使用 EPC 模式(因为 X2 切换需要)。
- 下行和上行业务为全缓存,5 MHz 带宽,使用 TCP 协议和 Proportional Fair (比例公平)调度器。
- 理想的 RRC 协议。
下面的表格 lena-dual-stripe parameter configuration for handover campaign 表明我们如何配置 lena-dual-stripe 参数来实现上述假设。
Parameter name | Value | Description |
simTime | 50 | 50 seconds simulation duration |
nBlocks | 0 | Disabling apartment buildings and femtocells |
nMacroEnbSites | 7 | Number of macrocell sites (each site has 3 cells) |
nMacroEnbSitesX | 2 | The macrocell sites will be positioned in a 2-3-2 formation |
interSiteDistance | 500 | 500 m distance between adjacent macrocell sites |
macroEnbTxPowerDbm | 46 | 46 dBm Tx power for each macrocell |
epc | 1 | Enable EPC mode |
epcDl | 1 | Enable full-buffer DL traffic |
epcUl | 1 | Enable full-buffer UL traffic |
useUdp | 0 | Disable UDP traffic and enable TCP instead |
macroUeDensity | 0.00002 | Determines number of UEs (translates to 48 UEs in our simulation) |
outdoorUeMinSpeed | 16.6667 | Minimum UE movement speed in m/s (60 kmph) |
outdoorUeMaxSpeed | 16.6667 | Maximum UE movement speed in m/s (60 kmph) |
macroEnbBandwidth | 25 | 5 MHz DL and UL bandwidth |
generateRem | 1 | (Optional) For plotting the Radio Environment Map |
有些要求的假设不能用作 lena-dual-stripe 的参数。 这种情况下,我们可以 override 默认属性。见下面的表格 Overriding default attributes for handover campaign 。
Default value name | Value | Description |
ns3::LteHelper::HandoverAlgorithm | ns3::NoOpHandoverAlgorithm,ns3::A3RsrpHandoverAlgorithm, orns3::A2A4RsrqHandoverAlgorithm | Choice of handover algorithm |
ns3::LteHelper::Scheduler | ns3::PfFfMacScheduler | Proportional Fair scheduler |
ns3::LteHelper::UseIdealRrc | 1 | Ideal RRC protocol |
ns3::RadioBearerStatsCalculator::DlRlcOutputFilename | <run>-DlRlcStats.txt | File name for DL RLC trace output |
ns3::RadioBearerStatsCalculator::UlRlcOutputFilename | <run>-UlRlcStats.txt | File name for UL RLC trace output |
ns3::PhyStatsCalculator::DlRsrpSinrFilename | <run>-DlRsrpSinrStats.txt | File name for DL PHY RSRP/SINR trace output |
ns3::PhyStatsCalculator::UlSinrFilename | <run>-UlSinrStats.txt | File name for UL PHY SINR trace output |
ns-3 提供了很多方法用于传递配置值到仿真中。在本例中,我们使用命令行参数。 当开始每个单独的仿真时,它通过附加参数及其值到 waf 调用中来实现。 因此,waf 调用请求 ns-3 的仿真类似于:
$ ./waf --run="lena-dual-stripe --simTime=50 --nBlocks=0 --nMacroEnbSites=7 --nMacroEnbSitesX=2 --epc=1 --useUdp=0 --outdoorUeMinSpeed=16.6667 --outdoorUeMaxSpeed=16.6667 --ns3::LteHelper::HandoverAlgorithm=ns3::NoOpHandoverAlgorithm --ns3::RadioBearerStatsCalculator::DlRlcOutputFilename=no-op-DlRlcStats.txt --ns3::RadioBearerStatsCalculator::UlRlcOutputFilename=no-op-UlRlcStats.txt --ns3::PhyStatsCalculator::DlRsrpSinrFilename=no-op-DlRsrpSinrStats.txt --ns3::PhyStatsCalculator::UlSinrFilename=no-op-UlSinrStats.txt --RngRun=1" > no-op.txt $ ./waf --run="lena-dual-stripe --simTime=50 --nBlocks=0 --nMacroEnbSites=7 --nMacroEnbSitesX=2 --epc=1 --useUdp=0 --outdoorUeMinSpeed=16.6667 --outdoorUeMaxSpeed=16.6667 --ns3::LteHelper::HandoverAlgorithm=ns3::A3RsrpHandoverAlgorithm --ns3::RadioBearerStatsCalculator::DlRlcOutputFilename=a3-rsrp-DlRlcStats.txt --ns3::RadioBearerStatsCalculator::UlRlcOutputFilename=a3-rsrp-UlRlcStats.txt --ns3::PhyStatsCalculator::DlRsrpSinrFilename=a3-rsrp-DlRsrpSinrStats.txt --ns3::PhyStatsCalculator::UlSinrFilename=a3-rsrp-UlSinrStats.txt --RngRun=1" > a3-rsrp.txt $ ./waf --run="lena-dual-stripe --simTime=50 --nBlocks=0 --nMacroEnbSites=7 --nMacroEnbSitesX=2 --epc=1 --useUdp=0 --outdoorUeMinSpeed=16.6667 --outdoorUeMaxSpeed=16.6667 --ns3::LteHelper::HandoverAlgorithm=ns3::A2A4RsrqHandoverAlgorithm --ns3::RadioBearerStatsCalculator::DlRlcOutputFilename=a2-a4-rsrq-DlRlcStats.txt --ns3::RadioBearerStatsCalculator::UlRlcOutputFilename=a2-a4-rsrq-UlRlcStats.txt --ns3::PhyStatsCalculator::DlRsrpSinrFilename=a2-a4-rsrq-DlRsrpSinrStats.txt --ns3::PhyStatsCalculator::UlSinrFilename=a2-a4-rsrq-UlSinrStats.txt --RngRun=1" > a2-a4-rsrq.txt
仿真过程中的注意事项:
- 注意,有些参数没有指定,因为它们和默认值一样,我们也保持切换算法为各自的默认设置。
- 注意仿真输出的文件名,例如 RLC traces 和 PHY traces,因为我们必须确保它们不被下一次仿真运行覆盖。在本例中,我们通过使用命令行参数来命名。
- --RngRun=1 参数在最后是用于设置被 random number generator(随机数字产生器)使用的运行次数。 我们使用不同的 RngRun 值再次运行仿真, 因此会创建同一仿真的几个独立副本。然后我们把这些副本所得结果进行平均,实现统计意义上的confidence 。
- 我们可以增加一个参数 --generateRem=1 来生成必要的文件——生成仿真的 REM。 结果如下图 REM obtained from a simulation in handover campaign, 产生的步骤参见前面的章节 Radio Environment Maps 。该图也表明在仿真开始使用RngRun = 1 时基站和用户的位置。其他的 RngRun 值可能产生不同的用户位置。
![](https://i-blog.csdnimg.cn/blog_migrate/e64bc085f5c6bf6e80275e48eb584c0c.png)
REM obtained from a simulation in handover campaign
在几个小时的运行后,仿真 campaign 最终结束。接下来我们对产生的仿真输出进行一些后续处理来获得一些有用的信息。
本例中,我们使用 GNU Octave 来帮助处理吞吐量和 SINR 数据,如下演示了一个示例 GNU Octave 脚本:
% RxBytes is the 10th column DlRxBytes = load ("no-op-DlRlcStats.txt") (:,10); DlAverageThroughputKbps = sum (DlRxBytes) * 8 / 1000 / 50 % RxBytes is the 10th column UlRxBytes = load ("no-op-UlRlcStats.txt") (:,10); UlAverageThroughputKbps = sum (UlRxBytes) * 8 / 1000 / 50 % Sinr is the 6th column DlSinr = load ("no-op-DlRsrpSinrStats.txt") (:,6); % eliminate NaN values idx = isnan (DlSinr); DlSinr (idx) = 0; DlAverageSinrDb = 10 * log10 (mean (DlSinr)) % convert to dB % Sinr is the 5th column UlSinr = load ("no-op-UlSinrStats.txt") (:,5); % eliminate NaN values idx = isnan (UlSinr); UlSinr (idx) = 0; UlAverageSinrDb = 10 * log10 (mean (UlSinr)) % convert to dB
至于切换的次数,我们可以使用简单的 shell 脚本计算日志文件中出现字符串 “Handover” 的次数:
$ grep "Handover" no-op.txt | wc -l
下面的表格 Results of handover campaign 是一些完整的统计数据(对每个单独的仿真运行完成后续处理时所得结果)。下面的值是 RngRun 为 1、2、3 和 4 时所得结果的平均值。
Statistics | No-op | A2-A4-RSRQ | Strongest cell |
Average DL system throughput | 6 615 kbps | 20 509 kbps | 19 709 kbps |
Average UL system throughput | 4 095 kbps | 5 705 kbps | 6 627 kbps |
Average DL SINR | -0.10 dB | 5.19 dB | 5.24 dB |
Average UL SINR | 9.54 dB | 81.57 dB | 79.65 dB |
Number of handovers per UE per second | 0 | 0.05694 | 0.04771 |
结果表明,在移动仿真环境中使用切换算法可以显著提高用户的吞吐量和 SINR 。该 campaign 场景中的两种切换算法基本上没什么差异。观察它们在不同的场景下的性能将是一件有趣的事,例如有家庭基站部署的场景。
22.2 Frequency Reuse examples(频率复用例子)
下面的两个例子表明频率复用算法的功能。
lena-frequency-reuse 是一个简单的例子。3个基站位于一个三角形的布局中,3个小区边缘用户位于该三角形的中心,有3个小区中心用户(每个靠近每个基站)。使用者也可以指定随机布置的用户数。FR 算法安装在基站上,每个基站有不同的 FrCellTypeId,这意味着每个基站使用不同的 FR 配置。用户可以使用 6 种不同的 FR 算法运行 lena-frequency-reuse : NoOp、 Hard FR、 Strict FR、 Soft FR、 Soft FFR 和 Enhanced FFR 。 为了运行 Distributed FFR 算法的仿真场景,用户应使用 lena-distributed-ffr。这两个例子非常相似,但是它们不同,因为 Distributed FFR 要求使用 EPC ,而其他算法不需要。
为了使用不同的频率复用算法运行 lena-frequency-reuse , 用户需要通过覆盖默认属 ns3::LteHelper::FfrAlgorithm 来指定 FR 算法。使用 Soft FR 算法运行 lena-frequency-reuse 的命令如下:
$ ./waf --run "lena-frequency-reuse --ns3::LteHelper::FfrAlgorithm=ns3::LteFrSoftAlgorithm"
这些例子添加的功能有:产生 REM 和 spectrum analyzer trace 。 用户可以通过设置 generateRem 和 generateSpectrumTrace 属性来使能它们的生成。
(1)在 lena-frequency-reuse 场景使用 Soft FR 算法生成 REM (RB 1 in data channel )的命令如下:
$ ./waf --run "lena-frequency-reuse --ns3::LteHelper::FfrAlgorithm=ns3::LteFrSoftAlgorithm --generateRem=true --remRbId=1"
![](https://i-blog.csdnimg.cn/blog_migrate/e568e88a1b185ae5d09e52ab740c20b3.png)
REM for RB 1 obtained from lena-frequency-reuse example with Soft FR algorithm enabled
(2)在 lena-frequency-reuse 场景使用 Soft FFR 算法生成频谱 trace 的命令如下(Spectrum Analyzer 位置需要配置在脚本内):
$ ./waf --run "lena-frequency-reuse --ns3::LteHelper::FfrAlgorithm=ns3::LteFfrSoftAlgorithm --generateSpectrumTrace=true"
例子 spectrum analyzer trace 见图 Spectrum Analyzer trace obtained from lena-frequency-reuse example with Soft FFR algorithm enabled. Spectrum Analyzer was located need eNB with FrCellTypeId 2.。正如我们看到的,不同的数据信道子带以不同的功率等级发射(根据配置),与此同时,控制信道以相同的功率沿着整个系统带宽传输。
![](https://i-blog.csdnimg.cn/blog_migrate/ed6be5dbba38bc2dfbd518fce83d1674.png)
Spectrum Analyzer trace obtained from lena-frequency-reuse example with Soft FFR algorithm enabled. Spectrum Analyzer was located need eNB with FrCellTypeId 2.
也可以使用安装在所有宏基站上的频率复用算法运行 lena-dual-stripe。 用户需要通过覆盖默认属性 ns3::LteHelper::FfrAlgorithm来指定 FR 算法。 使用 Hard FR 算法运行 lena-dual-stripe 的命令如下:
$ ./waf --run="lena-dual-stripe --simTime=50 --nBlocks=0 --nMacroEnbSites=7 --nMacroEnbSitesX=2 --epc=1 --useUdp=0 --outdoorUeMinSpeed=16.6667 --outdoorUeMaxSpeed=16.6667 --ns3::LteHelper::HandoverAlgorithm=ns3::NoOpHandoverAlgorithm --ns3::LteHelper::FfrAlgorithm=ns3::LteFrHardAlgorithm --ns3::RadioBearerStatsCalculator::DlRlcOutputFilename=no-op-DlRlcStats.txt --ns3::RadioBearerStatsCalculator::UlRlcOutputFilename=no-op-UlRlcStats.txt --ns3::PhyStatsCalculator::DlRsrpSinrFilename=no-op-DlRsrpSinrStats.txt --ns3::PhyStatsCalculator::UlSinrFilename=no-op-UlSinrStats.txt --RngRun=1" > no-op.txt
在 lena-dual-stripe 场景使用 Hard FR 算法生成 REM ( RB 1 in data channel )的命令如下:
$ ./waf --run="lena-dual-stripe --simTime=50 --nBlocks=0 --nMacroEnbSites=7 --nMacroEnbSitesX=2 --epc=0 --useUdp=0 --outdoorUeMinSpeed=16.6667 --outdoorUeMaxSpeed=16.6667 --ns3::LteHelper::HandoverAlgorithm=ns3::NoOpHandoverAlgorithm --ns3::LteHelper::FfrAlgorithm=ns3::LteFrHardAlgorithm --ns3::RadioBearerStatsCalculator::DlRlcOutputFilename=no-op-DlRlcStats.txt --ns3::RadioBearerStatsCalculator::UlRlcOutputFilename=no-op-UlRlcStats.txt --ns3::PhyStatsCalculator::DlRsrpSinrFilename=no-op-DlRsrpSinrStats.txt --ns3::PhyStatsCalculator::UlSinrFilename=no-op-UlSinrStats.txt --RngRun=1 --generateRem=true --remRbId=1" > no-op.txt
在 lena-dual-stripe 场景使用 Hard Frequency Reuse 算法生成 REM (RB= 1,10 和20 )的结果如下图。选择这些 RB 的原因是每一个使用不同的 FR 小区类型。
![](https://i-blog.csdnimg.cn/blog_migrate/bc3500c60620c22fc666ac5d08ccbdc1.png)
REM for RB 1 obtained from lena-dual-stripe simulation with Hard FR algorithm enabled
![](https://i-blog.csdnimg.cn/blog_migrate/e907c9821c048e82e23da177bbe2c3b7.png)
REM for RB 10 obtained from lena-dual-stripe simulation with Hard FR algorithm enabled
![](https://i-blog.csdnimg.cn/blog_migrate/d83c31eaa341f45854955cd61aabdf62.png)
REM for RB 20 obtained from lena-dual-stripe simulation with Hard FR algorithm enabled
23 故障检测和调试技巧
很多用户在 ns-3-users 论坛上发邮件询问,例如,为什么他们在仿真中没有得到任何业务,或者可能只有上行业务没有下行业务等。大多数情况下,这是用户仿真程序的 bug 。这里有一些调试程序和找到问题原因的建议:
一般的方法是选择性地和递增地使能相关LTE模块组件的日志功能, 验证每次激活——输出能按预期输出。具体地:
- 首先检查控制面,特别是 RRC 连接建立过程,通过使能日志组件 LteUeRrc 和 LteEnbRrc。
- 然后检查数据面的数据包传输,首先使能日志组件 LteUeNetDevice 和 EpcSgwPgwApplication,然后是 EpcEnbApplication,接着向下移动到 LTE 无线协议栈 (PDCP, RLC, MAC, 和 PHY), 直到你找到数据包停止处理/转发的位置(All his until you find where packets stop being processed / forwarded)。
(完)
参考文献
https://www.nsnam.org/docs/models/html/lte-user.html