1 /* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */ |
|
2 /* |
|
3 * Copyright (c) 2011 Centre Tecnologic de Telecomunicacions de Catalunya (CTTC) |
|
4 * |
|
5 * This program is free software; you can redistribute it and/or modify |
|
6 * it under the terms of the GNU General Public License version 2 as |
|
7 * published by the Free Software Foundation; |
|
8 * |
|
9 * This program is distributed in the hope that it will be useful, |
|
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
12 * GNU General Public License for more details. |
|
13 * |
|
14 * You should have received a copy of the GNU General Public License |
|
15 * along with this program; if not, write to the Free Software |
|
16 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
|
17 * |
|
18 * Author: Marco Miozzo <marco.miozzo@cttc.es> |
|
19 */ |
|
20 |
|
21 #include "ns3/simulator.h" |
|
22 |
|
23 #include "ns3/log.h" |
|
24 |
|
25 #include "ns3/spectrum-test.h" |
|
26 |
|
27 #include "ns3/lte-phy-tag.h" |
|
28 #include "ns3/lte-test-ue-phy.h" |
|
29 #include "ns3/lte-sinr-chunk-processor.h" |
|
30 |
|
31 #include "ns3/lte-test-shadowing.h" |
|
32 #include <ns3/buildings-propagation-loss-model.h> |
|
33 #include <ns3/node-container.h> |
|
34 #include <ns3/mobility-helper.h> |
|
35 #include <ns3/lena-helper.h> |
|
36 #include <ns3/single-model-spectrum-channel.h> |
|
37 #include "ns3/string.h" |
|
38 #include "ns3/double.h" |
|
39 #include <ns3/building.h> |
|
40 #include <ns3/enum.h> |
|
41 #include <ns3/net-device-container.h> |
|
42 #include <ns3/lte-ue-net-device.h> |
|
43 #include <ns3/lte-enb-net-device.h> |
|
44 #include <ns3/lte-ue-rrc.h> |
|
45 #include <ns3/lena-helper.h> |
|
46 #include <ns3/lte-enb-phy.h> |
|
47 #include <ns3/lte-ue-phy.h> |
|
48 #include "lte-test-sinr-chunk-processor.h" |
|
49 |
|
50 NS_LOG_COMPONENT_DEFINE ("LteShadowingTest"); |
|
51 |
|
52 using namespace ns3; |
|
53 |
|
54 |
|
55 /** |
|
56 * Test 1.1 Shadowing compound test |
|
57 */ |
|
58 |
|
59 /** |
|
60 * This TestSuite tests the shadowing model of BuildingPathlossModel |
|
61 * by reproducing several communication scenarios |
|
62 */ |
|
63 |
|
64 |
|
65 LteShadowingTestSuite::LteShadowingTestSuite () |
|
66 : TestSuite ("lte-shadowing-model", SYSTEM) |
|
67 { |
|
68 |
|
69 |
|
70 // -------------- UNIT TESTS ---------------------------------- |
|
71 |
|
72 LogComponentEnable ("LteShadowingTest", LOG_LEVEL_ALL); |
|
73 |
|
74 // NS_LOG_INFO ("Creating LteDownlinkSinrTestSuite"); |
|
75 |
|
76 Ptr<LenaHelper> lena = CreateObject<LenaHelper> (); |
|
77 |
|
78 lena->SetAttribute ("PropagationModel", StringValue ("ns3::BuildingsPropagationLossModel")); |
|
79 |
|
80 // Create Nodes: eNodeB, home eNB, UE and home UE (UE attached to HeNB) |
|
81 NodeContainer enbNodes; |
|
82 NodeContainer henbNodes; |
|
83 NodeContainer ueNodes; |
|
84 NodeContainer hueNodes; |
|
85 enbNodes.Create (1); |
|
86 henbNodes.Create (2); |
|
87 ueNodes.Create (5); |
|
88 hueNodes.Create (3); |
|
89 |
|
90 // Install Mobility Model |
|
91 MobilityHelper mobility; |
|
92 mobility.SetMobilityModel ("ns3::BuildingsMobilityModel"); |
|
93 mobility.Install (enbNodes); |
|
94 mobility.Install (henbNodes); |
|
95 mobility.Install (ueNodes); |
|
96 mobility.Install (hueNodes); |
|
97 |
|
98 NetDeviceContainer enbDevs; |
|
99 NetDeviceContainer henbDevs; |
|
100 NetDeviceContainer ueDevs; |
|
101 NetDeviceContainer hueDevs; |
|
102 enbDevs = lena->InstallEnbDevice (enbNodes); |
|
103 ueDevs = lena->InstallUeDevice (ueNodes); |
|
104 henbDevs = lena->InstallEnbDevice (henbNodes); |
|
105 hueDevs = lena->InstallUeDevice (hueNodes); |
|
106 |
|
107 |
|
108 |
|
109 lena->Attach (ueDevs, enbDevs.Get (0)); |
|
110 lena->Attach (hueDevs, henbDevs.Get (0)); |
|
111 |
|
112 // Test #1 Outdoor Model |
|
113 |
|
114 double distance = 2000; |
|
115 double hm = 1; |
|
116 double hb = 30; |
|
117 double freq = 869e6; // E_UTRA BAND #5 see table 5.5-1 of 36.101 |
|
118 Ptr<BuildingsMobilityModel> mm1 = enbNodes.Get (0)->GetObject<BuildingsMobilityModel> (); |
|
119 mm1->SetPosition (Vector (0.0, 0.0, hb)); |
|
120 |
|
121 Ptr<BuildingsMobilityModel> mm2 = ueNodes.Get (0)->GetObject<BuildingsMobilityModel> (); |
|
122 mm2->SetPosition (Vector (distance, 0.0, hm)); |
|
123 |
|
124 AddTestCase (new LteShadowingTestCase (mm1, mm2, 148.86, 7.0, "Outdoor Shadowing")); |
|
125 |
|
126 // Test #2 Indoor model |
|
127 |
|
128 distance = 30; |
|
129 freq = 2.1140e9; // E_UTRA BAND #1 see table 5.5-1 of 36.101 |
|
130 double henbHeight = 10.0; |
|
131 Ptr<BuildingsMobilityModel> mm5 = henbNodes.Get (0)->GetObject<BuildingsMobilityModel> (); |
|
132 mm5->SetPosition (Vector (0.0, 0.0, henbHeight)); |
|
133 Ptr<Building> building1 = Create<Building> (0.0, 10.0, 0.0, 10.0, 0.0, 20.0/*, 1, 1, 1*/); |
|
134 building1->SetBuildingType (Building::Residential); |
|
135 building1->SetExtWallsType (Building::ConcreteWithWindows); |
|
136 mm5->SetIndoor (building1); |
|
137 Ptr<BuildingsMobilityModel> mm6 = hueNodes.Get (0)->GetObject<BuildingsMobilityModel> (); |
|
138 mm6->SetPosition (Vector (distance, 0.0, hm)); |
|
139 mm6->SetIndoor (building1); |
|
140 mm6->SetFloorNumber (2); |
|
141 AddTestCase (new LteShadowingTestCase (mm5, mm6, 88.5724, 8.0, "Indoor Shadowing")); |
|
142 |
|
143 // Test #3 Indoor -> Outdoor |
|
144 |
|
145 distance = 100; |
|
146 freq = 2.1140e9; // E_UTRA BAND #1 see table 5.5-1 of 36.101 |
|
147 Ptr<BuildingsMobilityModel> mm9 = henbNodes.Get (1)->GetObject<BuildingsMobilityModel> (); |
|
148 mm9->SetPosition (Vector (0.0, 0.0, henbHeight)); |
|
149 mm9->SetIndoor (building1); |
|
150 mm9->SetFloorNumber (2); |
|
151 Ptr<BuildingsMobilityModel> mm10 = hueNodes.Get (1)->GetObject<BuildingsMobilityModel> (); |
|
152 mm10->SetPosition (Vector (distance, 0.0, hm)); |
|
153 // The loss is similar of test #4 plus the building penetration loss |
|
154 // which for ConcreteWithWindows is equal to 7 dB and the height gain |
|
155 // (2 floors x 2 dB/floor = 4) -> 81.838 + 7 - 4 = 84.838 |
|
156 AddTestCase (new LteShadowingTestCase (mm9, mm10, 85.0012, 8.6, "Indoor -> Outdoor Shadowing")); |
|
157 |
|
158 } |
|
159 |
|
160 static LteShadowingTestSuite lteShadowingTestSuite; |
|
161 |
|
162 |
|
163 /** |
|
164 * TestCase |
|
165 */ |
|
166 |
|
167 LteShadowingTestCase::LteShadowingTestCase (Ptr<BuildingsMobilityModel> m1, Ptr<BuildingsMobilityModel> m2, double refValue, double sigmaRef, std::string name) |
|
168 : TestCase ("SHADOWING calculation: " + name), |
|
169 m_node1 (m1), |
|
170 m_node2 (m2), |
|
171 m_lossRef (refValue), |
|
172 m_sigmaRef (sigmaRef) |
|
173 { |
|
174 } |
|
175 |
|
176 LteShadowingTestCase::~LteShadowingTestCase () |
|
177 { |
|
178 } |
|
179 |
|
180 void |
|
181 LteShadowingTestCase::DoRun (void) |
|
182 { |
|
183 // LogLevel logLevel = (LogLevel)(LOG_PREFIX_FUNC | LOG_PREFIX_TIME | LOG_LEVEL_ALL); |
|
184 |
|
185 // LogComponentEnable ("LteEnbRrc", logLevel); |
|
186 // LogComponentEnable ("LteUeRrc", logLevel); |
|
187 // LogComponentEnable ("LteEnbMac", logLevel); |
|
188 // LogComponentEnable ("LteUeMac", logLevel); |
|
189 // LogComponentEnable ("LteRlc", logLevel); |
|
190 // LogComponentEnable ("RrPacketScheduler", logLevel); |
|
191 // |
|
192 // LogComponentEnable ("LtePhy", logLevel); |
|
193 // LogComponentEnable ("LteEnbPhy", logLevel); |
|
194 // LogComponentEnable ("LteUePhy", logLevel); |
|
195 // |
|
196 // LogComponentEnable ("LteSpectrumPhy", logLevel); |
|
197 // LogComponentEnable ("LteInterference", logLevel); |
|
198 // LogComponentEnable ("LteSinrChunkProcessor", logLevel); |
|
199 // |
|
200 // LogComponentEnable ("LtePropagationLossModel", logLevel); |
|
201 // LogComponentEnable ("LossModel", logLevel); |
|
202 // LogComponentEnable ("ShadowingLossModel", logLevel); |
|
203 // LogComponentEnable ("PenetrationLossModel", logLevel); |
|
204 // LogComponentEnable ("MultipathLossModel", logLevel); |
|
205 // LogComponentEnable ("PathLossModel", logLevel); |
|
206 // |
|
207 // LogComponentEnable ("LteNetDevice", logLevel); |
|
208 // LogComponentEnable ("LteUeNetDevice", logLevel); |
|
209 // LogComponentEnable ("LteEnbNetDevice", logLevel); |
|
210 |
|
211 // LogComponentEnable ("BuildingsPropagationLossModel", LOG_LEVEL_ALL); |
|
212 NS_LOG_INFO ("Testing " << GetName()); |
|
213 std::vector<double> loss; |
|
214 double sum = 0.0; |
|
215 double sumSquared = 0.0; |
|
216 int samples = 10000; |
|
217 for (int i = 0; i < samples; i++) |
|
218 { |
|
219 Ptr<SpectrumChannel> m_downlinkChannel = CreateObject<SingleModelSpectrumChannel> (); |
|
220 Ptr<SpectrumChannel> m_uplinkChannel = CreateObject<SingleModelSpectrumChannel> (); |
|
221 Ptr<BuildingsPropagationLossModel> m_downlinkPropagationLossModel = CreateObject<BuildingsPropagationLossModel> (); |
|
222 Ptr<BuildingsPropagationLossModel> m_uplinkPropagationLossModel = CreateObject<BuildingsPropagationLossModel> (); |
|
223 m_downlinkChannel->AddPropagationLossModel (m_downlinkPropagationLossModel); |
|
224 m_uplinkChannel->AddPropagationLossModel (m_uplinkPropagationLossModel); |
|
225 loss.push_back (m_downlinkPropagationLossModel->GetLoss (m_node1, m_node2) - m_lossRef); |
|
226 sum += loss.at (loss.size()-1); |
|
227 sumSquared += (loss.at (loss.size()-1)*loss.at (loss.size()-1)); |
|
228 } |
|
229 double mean = sum/samples; |
|
230 double sigma = sqrt(sumSquared/samples - (mean*mean)); |
|
231 // test whether the distribution falls in the 99% confidence interval, as expected with a nornal distribution |
|
232 double ci = (2.575829303549 * sigma) / sqrt (samples); |
|
233 |
|
234 NS_LOG_INFO ("Mean from simulation " << mean << ", sigma " << sigma << ", reference value " << m_sigmaRef << ", CI(99%) " << ci); |
|
235 |
|
236 NS_TEST_ASSERT_MSG_EQ_TOL(fabs(mean), 0.0, ci, "Wrong shadowing distribution !"); |
|
237 } |
|