A Discrete-Event Network Simulator
API
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
lte-test-pathloss-model.cc
Go to the documentation of this file.
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-sinr-chunk-processor.h"
29 
30 
31 #include <ns3/hybrid-buildings-propagation-loss-model.h>
32 #include <ns3/node-container.h>
33 #include <ns3/mobility-helper.h>
34 #include <ns3/buildings-helper.h>
35 #include <ns3/lte-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/lte-helper.h>
46 #include <ns3/lte-enb-phy.h>
47 #include <ns3/lte-ue-phy.h>
48 
50 #include "lte-test-ue-phy.h"
52 
53 NS_LOG_COMPONENT_DEFINE ("LtePathlossModelTest");
54 
55 namespace ns3 {
56 
57 
68 void
70  uint32_t frameNo, uint32_t subframeNo, uint16_t rnti,
71  uint8_t mcsTb1, uint16_t sizeTb1, uint8_t mcsTb2, uint16_t sizeTb2)
72 {
73  testcase->DlScheduling (frameNo, subframeNo, rnti, mcsTb1, sizeTb1, mcsTb2, sizeTb2);
74 }
75 
76 
77 
79  : TestSuite ("lte-pathloss-model", SYSTEM)
80 {
81  // LogLevel logLevel = (LogLevel)(LOG_PREFIX_FUNC | LOG_PREFIX_TIME | LOG_LEVEL_ALL);
82  // LogComponentEnable ("LteHelper", logLevel);
83  // LogComponentEnable ("LtePathlossModelTest", logLevel);
84  // LogComponentEnable ("BuildingsPropagationLossModel", logLevel);
85  // LogComponentEnable ("LteInterference", logLevel);
86  // LogComponentEnable ("LteSpectrumValueHelper", logLevel);
87  // LogComponentEnable ("LteEnbNetDevice", logLevel);
88 
89  struct SnrEfficiencyMcs
90  {
91  double snrDb;
92  double efficiency;
93  int mcsIndex;
94  };
95 
100  SnrEfficiencyMcs snrEfficiencyMcs[] = {
101  { -5.00000, 0.08024, -1},
102  { -4.00000, 0.10030, -1},
103  { -3.00000, 0.12518, -1},
104  { -2.00000, 0.15589, 0},
105  { -1.00000, 0.19365, 0},
106  { 0.00000, 0.23983, 2},
107  { 1.00000, 0.29593, 2},
108  { 2.00000, 0.36360, 2},
109  { 3.00000, 0.44451, 4},
110  { 4.00000, 0.54031, 4},
111  { 5.00000, 0.65251, 6},
112  { 6.00000, 0.78240, 6},
113  { 7.00000, 0.93086, 8},
114  { 8.00000, 1.09835, 8},
115  { 9.00000, 1.28485, 10},
116  { 10.00000, 1.48981, 12},
117  { 11.00000, 1.71229, 12},
118  { 12.00000, 1.95096, 14},
119  { 13.00000, 2.20429, 14},
120  { 14.00000, 2.47062, 16},
121  { 15.00000, 2.74826, 18},
122  { 16.00000, 3.03560, 18},
123  { 17.00000, 3.33115, 20},
124  { 18.00000, 3.63355, 20},
125  { 19.00000, 3.94163, 22},
126  { 20.00000, 4.25439, 22},
127  { 21.00000, 4.57095, 24},
128  { 22.00000, 4.89060, 24},
129  { 23.00000, 5.21276, 26},
130  { 24.00000, 5.53693, 26},
131  { 25.00000, 5.86271, 28},
132  { 26.00000, 6.18980, 28},
133  { 27.00000, 6.51792, 28},
134  { 28.00000, 6.84687, 28},
135  { 29.00000, 7.17649, 28},
136  { 30.00000, 7.50663, 28},
137  };
138 
139 
140  double txPowerDbm = 30; // default eNB TX power over whole bandwidth
141  double txPowerLin = std::pow (10, (txPowerDbm - 30)/10);
142  double ktDbm = -174; // reference LTE noise PSD
143  double noisePowerDbm = ktDbm + 10 * std::log10 (25 * 180000); // corresponds to kT*bandwidth in linear units
144  double receiverNoiseFigureDb = 9.0; // default UE noise figure
145  double noiseLin = std::pow (10, (noisePowerDbm-30+receiverNoiseFigureDb)/10);
146 
147  // reference values obtained with the octave script src/lte/test/reference/lte_pathloss.m
148 
149  double loss[] = {81.062444, 134.078605, 144.259958};
150  double dist[] = {100.0, 500.0, 1500};
151 
152  int numOfTests = sizeof (loss) / sizeof (double);
153  for ( int i = 0 ; i < numOfTests; i++ )
154  {
155  // double lossDb = txPowerDbm - snrEfficiencyMcs[i].snrDb - noisePowerDbm - receiverNoiseFigureDb;
156  double sinrLin = (txPowerLin/(pow(10, loss[i]/10))) / noiseLin;
157  // double sinrDb = txPowerDbm- noisePowerDbm - receiverNoiseFigureDb - loss[i];
158  double sinrDb = 10 * std::log10 (sinrLin);
159  NS_LOG_INFO (" Ptx " << txPowerDbm << " Pn " << noisePowerDbm << " Fn " << receiverNoiseFigureDb << " Pl " << loss[i] << " dist " << dist[i]);
160 
161  int mcs = -1;
162  int numSnrEfficiencyMcsEntries = sizeof (snrEfficiencyMcs) / sizeof (SnrEfficiencyMcs);
163  for (int j = 0; j < numSnrEfficiencyMcsEntries && snrEfficiencyMcs[j].snrDb < sinrDb; ++j)
164  {
165  mcs = snrEfficiencyMcs[j].mcsIndex;
166  }
167 
168  std::ostringstream name;
169  name << " snr= " << sinrDb << " dB, "
170  << " mcs= " << snrEfficiencyMcs[i].mcsIndex;
171  AddTestCase (new LtePathlossModelSystemTestCase (name.str (), sinrDb, dist[i], mcs), TestCase::QUICK);
172  }
173 
174 
175 
176 
177 
178 }
179 
181 
182 
183 
184 
185 LtePathlossModelSystemTestCase::LtePathlossModelSystemTestCase (std::string name, double snrDb, double dist, uint16_t mcsIndex)
186 : TestCase (name),
187 m_snrDb (snrDb),
188 m_distance (dist),
189 m_mcsIndex (mcsIndex)
190 {
191  std::ostringstream sstream1, sstream2;
192  sstream1 << " snr=" << snrDb
193  << " mcs=" << mcsIndex << " distance=" << dist;
194 
195  NS_LOG_INFO ("Creating LtePathlossModelSystemTestCase: " + sstream1.str ());
196 }
197 
199 {
200 }
201 
202 void
204 {
209  Ptr<LteHelper> lteHelper = CreateObject<LteHelper> ();
210  // lteHelper->EnableLogComponents ();
211  lteHelper->EnableMacTraces ();
212  lteHelper->EnableRlcTraces ();
213  lteHelper->SetAttribute ("PathlossModel", StringValue ("ns3::HybridBuildingsPropagationLossModel"));
214 
215  // set frequency. This is important because it changes the behavior of the path loss model
216  lteHelper->SetEnbDeviceAttribute ("DlEarfcn", UintegerValue (200));
217  lteHelper->SetUeDeviceAttribute ("DlEarfcn", UintegerValue (200));
218 
219  // remove shadowing component
220  lteHelper->SetPathlossModelAttribute ("ShadowSigmaOutdoor", DoubleValue (0.0));
221  lteHelper->SetPathlossModelAttribute ("ShadowSigmaIndoor", DoubleValue (0.0));
222  lteHelper->SetPathlossModelAttribute ("ShadowSigmaExtWalls", DoubleValue (0.0));
223 
224  // Create Nodes: eNodeB and UE
225  NodeContainer enbNodes;
226  NodeContainer ueNodes;
227  enbNodes.Create (1);
228  ueNodes.Create (1);
229  NodeContainer allNodes = NodeContainer ( enbNodes, ueNodes );
230 
231  // Install Mobility Model
232  MobilityHelper mobility;
233  mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
234  mobility.Install (allNodes);
235  BuildingsHelper::Install (allNodes);
236 
237 
238  // Create Devices and install them in the Nodes (eNB and UE)
239  NetDeviceContainer enbDevs;
240  NetDeviceContainer ueDevs;
241  lteHelper->SetSchedulerType ("ns3::RrFfMacScheduler");
242  enbDevs = lteHelper->InstallEnbDevice (enbNodes);
243  ueDevs = lteHelper->InstallUeDevice (ueNodes);
244 
245  Ptr<MobilityModel> mm_enb = enbNodes.Get (0)->GetObject<MobilityModel> ();
246  mm_enb->SetPosition (Vector (0.0, 0.0, 30.0));
247  Ptr<MobilityModel> mm_ue = ueNodes.Get (0)->GetObject<MobilityModel> ();
248  mm_ue->SetPosition (Vector (m_distance, 0.0, 1.0));
249 
250  Ptr<LteEnbNetDevice> lteEnbDev = enbDevs.Get (0)->GetObject<LteEnbNetDevice> ();
251  Ptr<LteEnbPhy> enbPhy = lteEnbDev->GetPhy ();
252  enbPhy->SetAttribute ("TxPower", DoubleValue (30.0));
253  enbPhy->SetAttribute ("NoiseFigure", DoubleValue (5.0));
254 
255  Ptr<LteUeNetDevice> lteUeDev = ueDevs.Get (0)->GetObject<LteUeNetDevice> ();
256  Ptr<LteUePhy> uePhy = lteUeDev->GetPhy ();
257  uePhy->SetAttribute ("TxPower", DoubleValue (23.0));
258  uePhy->SetAttribute ("NoiseFigure", DoubleValue (9.0));
259 
260 
261  // Attach a UE to a eNB
262  lteHelper->Attach (ueDevs, enbDevs.Get (0));
263 
264  // Activate an EPS bearer
266  EpsBearer bearer (q);
267  lteHelper->ActivateDataRadioBearer (ueDevs, bearer);
268 
269  // Use testing chunk processor in the PHY layer
270  // It will be used to test that the SNR is as intended
271  //Ptr<LtePhy> uePhy = ueDevs.Get (0)->GetObject<LteUeNetDevice> ()->GetPhy ()->GetObject<LtePhy> ();
272  Ptr<LteTestSinrChunkProcessor> testSinr = Create<LteTestSinrChunkProcessor> (uePhy);
273  uePhy->GetDownlinkSpectrumPhy ()->AddCtrlSinrChunkProcessor (testSinr);
274 
275 // Config::Connect ("/NodeList/0/DeviceList/0/LteEnbMac/DlScheduling",
276 // MakeBoundCallback (&LteTestPathlossDlSchedCallback, this));
277 
278  Simulator::Stop (Seconds (0.035));
279  Simulator::Run ();
280 
281  double calculatedSinrDb = 10.0 * std::log10 (testSinr->GetSinr ()->operator[] (0));
282  NS_LOG_INFO ("Distance " << m_distance << " Calculated SINR " << calculatedSinrDb << " ref " << m_snrDb);
284  NS_TEST_ASSERT_MSG_EQ_TOL (calculatedSinrDb, m_snrDb, 0.001, "Wrong SINR !");
285 }
286 
287 
288 void
289 LtePathlossModelSystemTestCase::DlScheduling (uint32_t frameNo, uint32_t subframeNo, uint16_t rnti,
290  uint8_t mcsTb1, uint16_t sizeTb1, uint8_t mcsTb2, uint16_t sizeTb2)
291 {
292  static bool firstTime = true;
293 
294  if ( firstTime )
295  {
296  firstTime = false;
297  NS_LOG_INFO ("SNR\tRef_MCS\tCalc_MCS");
298  }
299 
300 
301  // need to allow for RRC connection establishment + SRS transmission
302  if (Simulator::Now () > MilliSeconds (21))
303  {
304  NS_LOG_INFO (m_snrDb << "\t" << m_mcsIndex << "\t" << (uint16_t)mcsTb1);
305 
306  NS_TEST_ASSERT_MSG_EQ ((uint16_t)mcsTb1, m_mcsIndex, "Wrong MCS index");
307  }
308 }
309 
310 
311 } // namespace ns3
312 
smart pointer class similar to boost::intrusive_ptr
Definition: ptr.h:59
hold variables of type string
Definition: string.h:19
Ptr< NetDevice > Get(uint32_t i) const
Get the Ptr stored in this container at a given index.
#define NS_TEST_ASSERT_MSG_EQ_TOL(actual, limit, tol, msg)
Test that actual and expected (limit) values are equal to plus or minus some tolerance and report and...
Definition: test.h:326
A suite of tests to run.
Definition: test.h:1025
static void Run(void)
Run the simulation until one of:
Definition: simulator.cc:157
#define NS_LOG_INFO(msg)
Definition: log.h:298
encapsulates test code
Definition: test.h:849
a 3d vector
Definition: vector.h:31
Keep track of the current position and velocity of an object.
This class contains the specification of EPS Bearers.
Definition: eps-bearer.h:71
void Install(Ptr< Node > node) const
"Layout" a single node according to the current position allocator type.
Hold an unsigned integer type.
Definition: uinteger.h:46
holds a vector of ns3::NetDevice pointers
static void Destroy(void)
Every event scheduled by the Simulator::insertAtDestroy method is invoked.
Definition: simulator.cc:121
void DlScheduling(uint32_t frameNo, uint32_t subframeNo, uint16_t rnti, uint8_t mcsTb1, uint16_t sizeTb1, uint8_t mcsTb2, uint16_t sizeTb2)
keep track of a set of node pointers.
void LteTestPathlossDlSchedCallback(LtePathlossModelSystemTestCase *testcase, std::string path, uint32_t frameNo, uint32_t subframeNo, uint16_t rnti, uint8_t mcsTb1, uint16_t sizeTb1, uint8_t mcsTb2, uint16_t sizeTb2)
Test 1.1 Pathloss compound test.
void SetMobilityModel(std::string type, std::string n1="", const AttributeValue &v1=EmptyAttributeValue(), std::string n2="", const AttributeValue &v2=EmptyAttributeValue(), std::string n3="", const AttributeValue &v3=EmptyAttributeValue(), std::string n4="", const AttributeValue &v4=EmptyAttributeValue(), std::string n5="", const AttributeValue &v5=EmptyAttributeValue(), std::string n6="", const AttributeValue &v6=EmptyAttributeValue(), std::string n7="", const AttributeValue &v7=EmptyAttributeValue(), std::string n8="", const AttributeValue &v8=EmptyAttributeValue(), std::string n9="", const AttributeValue &v9=EmptyAttributeValue())
NS_LOG_COMPONENT_DEFINE("LtePathlossModelTest")
static Time Now(void)
Return the "current simulation time".
Definition: simulator.cc:180
void AddTestCase(TestCase *testCase) NS_DEPRECATED
Add an individual child TestCase case to this TestCase.
Definition: test.cc:173
void SetPosition(const Vector &position)
virtual void DoRun(void)
Implementation to actually run this TestCase.
Test 1.1 pathloss calculation.
Fast test.
Definition: test.h:857
static LtePathlossModelTestSuite ltePathlossModelTestSuite
Helper class used to assign positions and mobility models to nodes.
static void Stop(void)
If an event invokes this method, it will be the last event scheduled by the Simulator::run method bef...
Definition: simulator.cc:165
Ptr< Node > Get(uint32_t i) const
Get the Ptr stored in this container at a given index.
void Create(uint32_t n)
Create n nodes and append pointers to them to the end of this NodeContainer.
Hold a floating point type.
Definition: double.h:41
The eNodeB device implementation.
Ptr< T > GetObject(void) const
Definition: object.h:361
Qci
QoS Class Indicator.
Definition: eps-bearer.h:77
#define NS_TEST_ASSERT_MSG_EQ(actual, limit, msg)
Test that an actual and expected (limit) value are equal and report and abort if not.
Definition: test.h:137
static void Install(Ptr< Node > node)
Install the MobilityBuildingInfo to a node.
The LteUeNetDevice class implements the UE net device.