A Discrete-Event Network Simulator
API
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
test-lte-antenna.cc
Go to the documentation of this file.
1 /* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
2 /*
3  * Copyright (c) 2011, 2012 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: Manuel Requena <manuel.requena@cttc.es>
19  * Nicola Baldo <nbaldo@cttc.es>
20  */
21 
22 #include "ns3/simulator.h"
23 #include "ns3/log.h"
24 #include "ns3/string.h"
25 #include "ns3/double.h"
26 #include "ns3/enum.h"
27 #include "ns3/boolean.h"
28 #include "ns3/test.h"
29 #include "ns3/mobility-helper.h"
30 #include "ns3/lte-helper.h"
31 
32 #include "ns3/lte-ue-phy.h"
33 #include "ns3/lte-ue-net-device.h"
34 #include "ns3/lte-enb-phy.h"
35 #include "ns3/lte-enb-net-device.h"
36 #include "ns3/ff-mac-scheduler.h"
37 
38 #include "ns3/lte-global-pathloss-database.h"
39 
41 
42 NS_LOG_COMPONENT_DEFINE ("LteAntennaTest");
43 
44 namespace ns3 {
45 
46 
47 
49 {
50 public:
51  static std::string BuildNameString (double orientationDegrees, double beamwidthDegrees, double x, double y);
52  LteEnbAntennaTestCase (double orientationDegrees, double beamwidthDegrees, double x, double y, double antennaGainDb);
54  virtual ~LteEnbAntennaTestCase ();
55 
56 private:
57  virtual void DoRun (void);
58 
61  double m_x;
62  double m_y;
64 };
65 
66 
67 
68 
69 std::string LteEnbAntennaTestCase::BuildNameString (double orientationDegrees, double beamwidthDegrees, double x, double y)
70 {
71  std::ostringstream oss;
72  oss << "o=" << orientationDegrees
73  << ", bw=" << beamwidthDegrees
74  << ", x=" << x
75  << ", y=" << y;
76  return oss.str ();
77 }
78 
79 
80 LteEnbAntennaTestCase::LteEnbAntennaTestCase (double orientationDegrees, double beamwidthDegrees, double x, double y, double antennaGainDb)
81  : TestCase (BuildNameString (orientationDegrees, beamwidthDegrees, x, y)),
82  m_orientationDegrees (orientationDegrees),
83  m_beamwidthDegrees (beamwidthDegrees),
84  m_x (x),
85  m_y (y),
86  m_antennaGainDb (antennaGainDb)
87 {
88  NS_LOG_FUNCTION (this);
89 }
90 
92 {
93 }
94 
95 void
97 {
98  Config::Reset ();
99  Config::SetDefault ("ns3::LteSpectrumPhy::CtrlErrorModelEnabled", BooleanValue (false));
100  Config::SetDefault ("ns3::LteSpectrumPhy::DataErrorModelEnabled", BooleanValue (false));
101  Config::SetDefault ("ns3::LteHelper::UseIdealRrc", BooleanValue (true));
102  Ptr<LteHelper> lteHelper = CreateObject<LteHelper> ();
103 
104  // use 0dB Pathloss, since we are testing only the antenna gain
105  lteHelper->SetAttribute ("PathlossModel", StringValue ("ns3::ConstantSpectrumPropagationLossModel"));
106  lteHelper->SetPathlossModelAttribute ("Loss", DoubleValue (0.0));
107 
108  // Create Nodes: eNodeB and UE
109  NodeContainer enbNodes;
110  NodeContainer ueNodes;
111  enbNodes.Create (1);
112  ueNodes.Create (1);
113  NodeContainer allNodes = NodeContainer ( enbNodes, ueNodes );
114 
115  // Install Mobility Model
116  Ptr<ListPositionAllocator> positionAlloc = CreateObject<ListPositionAllocator> ();
117  positionAlloc->Add (Vector (0.0, 0.0, 0.0)); // eNB
118  positionAlloc->Add (Vector (m_x, m_y, 0.0)); // UE
119  MobilityHelper mobility;
120  mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
121  mobility.SetPositionAllocator (positionAlloc);
122  mobility.Install (allNodes);
123 
124  // Create Devices and install them in the Nodes (eNB and UE)
125  NetDeviceContainer enbDevs;
126  NetDeviceContainer ueDevs;
127  lteHelper->SetSchedulerType ("ns3::RrFfMacScheduler");
128  lteHelper->SetSchedulerAttribute ("UlCqiFilter", EnumValue (FfMacScheduler::PUSCH_UL_CQI));
129  lteHelper->SetEnbAntennaModelType ("ns3::CosineAntennaModel");
130  lteHelper->SetEnbAntennaModelAttribute ("Orientation", DoubleValue (m_orientationDegrees));
131  lteHelper->SetEnbAntennaModelAttribute ("Beamwidth", DoubleValue (m_beamwidthDegrees));
132  lteHelper->SetEnbAntennaModelAttribute ("MaxGain", DoubleValue (0.0));
133 
134  enbDevs = lteHelper->InstallEnbDevice (enbNodes);
135  ueDevs = lteHelper->InstallUeDevice (ueNodes);
136 
137  // Attach a UE to a eNB
138  lteHelper->Attach (ueDevs, enbDevs.Get (0));
139 
140  // Activate the default EPS bearer
142  EpsBearer bearer (q);
143  lteHelper->ActivateDataRadioBearer (ueDevs, bearer);
144 
145  // Use testing chunk processor in the PHY layer
146  // It will be used to test that the SNR is as intended
147  Ptr<LtePhy> uePhy = ueDevs.Get (0)->GetObject<LteUeNetDevice> ()->GetPhy ()->GetObject<LtePhy> ();
148  Ptr<LteTestSinrChunkProcessor> testDlSinr = Create<LteTestSinrChunkProcessor> (uePhy);
149  uePhy->GetDownlinkSpectrumPhy ()->AddDataSinrChunkProcessor (testDlSinr);
150 
151  Ptr<LtePhy> enbphy = enbDevs.Get (0)->GetObject<LteEnbNetDevice> ()->GetPhy ()->GetObject<LtePhy> ();
152  Ptr<LteTestSinrChunkProcessor> testUlSinr = Create<LteTestSinrChunkProcessor> (enbphy);
153  enbphy->GetUplinkSpectrumPhy ()->AddDataSinrChunkProcessor (testUlSinr);
154 
155 
156  // keep track of all path loss values in two centralized objects
158  UplinkLteGlobalPathlossDatabase ulPathlossDb;
159  // we rely on the fact that LteHelper creates the DL channel object first, then the UL channel object,
160  // hence the former will have index 0 and the latter 1
161  Config::Connect ("/ChannelList/0/PathLoss",
163  Config::Connect ("/ChannelList/1/PathLoss",
165 
166  Simulator::Stop (Seconds (0.035));
167  Simulator::Run ();
168 
169  const double enbTxPowerDbm = 30; // default eNB TX power over whole bandwidth
170  const double ueTxPowerDbm = 10; // default UE TX power over whole bandwidth
171  const double ktDbm = -174; // reference LTE noise PSD
172  const double noisePowerDbm = ktDbm + 10 * std::log10 (25 * 180000); // corresponds to kT*bandwidth in linear units
173  const double ueNoiseFigureDb = 9.0; // default UE noise figure
174  const double enbNoiseFigureDb = 5.0; // default eNB noise figure
175  double tolerance = (m_antennaGainDb != 0) ? abs (m_antennaGainDb)*0.001 : 0.001;
176 
177  // first test with SINR from LteTestSinrChunkProcessor
178  // this can only be done for not-too-bad SINR otherwise the measurement won't be available
179  double expectedSinrDl = enbTxPowerDbm + m_antennaGainDb - noisePowerDbm + ueNoiseFigureDb;
180  if (expectedSinrDl > 0)
181  {
182  double calculatedSinrDbDl = -INFINITY;
183  if (testDlSinr->GetSinr () != 0)
184  {
185  calculatedSinrDbDl = 10.0 * std::log10 (testDlSinr->GetSinr ()->operator[] (0));
186  }
187  // remember that propagation loss is 0dB
188  double calculatedAntennaGainDbDl = - (enbTxPowerDbm - calculatedSinrDbDl - noisePowerDbm - ueNoiseFigureDb);
189  NS_TEST_ASSERT_MSG_EQ_TOL (calculatedAntennaGainDbDl, m_antennaGainDb, tolerance, "Wrong DL antenna gain!");
190  }
191  double expectedSinrUl = ueTxPowerDbm + m_antennaGainDb - noisePowerDbm + enbNoiseFigureDb;
192  if (expectedSinrUl > 0)
193  {
194  double calculatedSinrDbUl = -INFINITY;
195  if (testUlSinr->GetSinr () != 0)
196  {
197  calculatedSinrDbUl = 10.0 * std::log10 (testUlSinr->GetSinr ()->operator[] (0));
198  }
199  double calculatedAntennaGainDbUl = - (ueTxPowerDbm - calculatedSinrDbUl - noisePowerDbm - enbNoiseFigureDb);
200  NS_TEST_ASSERT_MSG_EQ_TOL (calculatedAntennaGainDbUl, m_antennaGainDb, tolerance, "Wrong UL antenna gain!");
201  }
202 
203 
204  // repeat the same tests with the LteGlobalPathlossDatabases
205  double measuredLossDl = dlPathlossDb.GetPathloss (1, 1);
206  NS_TEST_ASSERT_MSG_EQ_TOL (measuredLossDl, -m_antennaGainDb, tolerance, "Wrong DL loss!");
207  double measuredLossUl = ulPathlossDb.GetPathloss (1, 1);
208  NS_TEST_ASSERT_MSG_EQ_TOL (measuredLossUl, -m_antennaGainDb, tolerance, "Wrong UL loss!");
209 
210 
212 }
213 
214 
216 {
217 public:
219 };
220 
221 
223  : TestSuite ("lte-antenna", SYSTEM)
224 {
225  NS_LOG_FUNCTION (this);
226 
227  // orientation beamwidth x y gain
228  AddTestCase (new LteEnbAntennaTestCase ( 0.0, 90.0, 1.0, 0.0, 0.0), TestCase::QUICK);
229  AddTestCase (new LteEnbAntennaTestCase ( 0.0, 90.0, 1.0, 1.0, -3.0), TestCase::QUICK);
230  AddTestCase (new LteEnbAntennaTestCase ( 0.0, 90.0, 1.0, -1.0, -3.0), TestCase::QUICK);
231  AddTestCase (new LteEnbAntennaTestCase ( 0.0, 90.0, -1.0, -1.0, -36.396), TestCase::QUICK);
232  AddTestCase (new LteEnbAntennaTestCase ( 0.0, 90.0, -1.0, -0.0, -1414.6), TestCase::QUICK);
233  AddTestCase (new LteEnbAntennaTestCase ( 0.0, 90.0, -1.0, 1.0, -36.396), TestCase::QUICK);
234  AddTestCase (new LteEnbAntennaTestCase ( 45.0, 90.0, 1.0, 1.0, 0.0), TestCase::QUICK);
235  AddTestCase (new LteEnbAntennaTestCase ( -45.0, 90.0, 1.0, -1.0, 0.0), TestCase::QUICK);
236  AddTestCase (new LteEnbAntennaTestCase ( 90.0, 90.0, 1.0, 1.0, -3.0), TestCase::QUICK);
237  AddTestCase (new LteEnbAntennaTestCase ( -90.0, 90.0, 1.0, -1.0, -3.0), TestCase::QUICK);
238 
239  AddTestCase (new LteEnbAntennaTestCase ( 0.0, 120.0, 1.0, 0.0, 0.0), TestCase::QUICK);
240  AddTestCase (new LteEnbAntennaTestCase ( 0.0, 120.0, 0.5, sin(M_PI/3), -3.0), TestCase::QUICK);
241  AddTestCase (new LteEnbAntennaTestCase ( 0.0, 120.0, 0.5, -sin(M_PI/3), -3.0), TestCase::QUICK);
242  AddTestCase (new LteEnbAntennaTestCase ( 0.0, 120.0, -1.0, -2.0, -13.410), TestCase::QUICK);
243  AddTestCase (new LteEnbAntennaTestCase ( 0.0, 120.0, -1.0, 1.0, -20.034), TestCase::QUICK);
244  AddTestCase (new LteEnbAntennaTestCase ( 60.0, 120.0, 0.5, sin(M_PI/3), 0.0), TestCase::QUICK);
245  AddTestCase (new LteEnbAntennaTestCase ( -60.0, 120.0, 0.5, -sin(M_PI/3), 0.0), TestCase::QUICK);
246  AddTestCase (new LteEnbAntennaTestCase ( -60.0, 120.0, 0.5, -sin(M_PI/3), 0.0), TestCase::QUICK);
247  AddTestCase (new LteEnbAntennaTestCase ( -120.0, 120.0, -0.5, -sin(M_PI/3), 0.0), TestCase::QUICK);
248  AddTestCase (new LteEnbAntennaTestCase ( -120.0, 120.0, 0.5, -sin(M_PI/3), -3.0), TestCase::QUICK);
249  AddTestCase (new LteEnbAntennaTestCase ( -120.0, 120.0, -1, 0, -3.0), TestCase::QUICK);
250  AddTestCase (new LteEnbAntennaTestCase ( -120.0, 120.0, -1, 2, -15.578), TestCase::QUICK);
251  AddTestCase (new LteEnbAntennaTestCase ( -120.0, 120.0, 1, 0, -14.457), TestCase::QUICK);
252  AddTestCase (new LteEnbAntennaTestCase ( -120.0, 120.0, 1, 2, -73.154), TestCase::QUICK);
253  AddTestCase (new LteEnbAntennaTestCase ( -120.0, 120.0, 1, -0.1, -12.754), TestCase::QUICK);
254 
255 
256 }
257 
259 
260 
261 } // namespace ns3
262 
smart pointer class similar to boost::intrusive_ptr
Definition: ptr.h:59
#define NS_LOG_FUNCTION(parameters)
Definition: log.h:345
Hold a bool native type.
Definition: boolean.h:38
void Reset(void)
Reset the initial value of every attribute as well as the value of every global to what they were bef...
Definition: config.cc:642
hold variables of type string
Definition: string.h:19
virtual void DoRun(void)
Implementation to actually run this TestCase.
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
encapsulates test code
Definition: test.h:849
void Connect(std::string path, const CallbackBase &cb)
Definition: config.cc:728
a 3d vector
Definition: vector.h:31
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 variables of type 'enum'
Definition: enum.h:37
static std::string BuildNameString(double orientationDegrees, double beamwidthDegrees, double x, double y)
static LteAntennaTestSuite lteAntennaTestSuite
holds a vector of ns3::NetDevice pointers
Callback< R > MakeCallback(R(T::*memPtr)(void), OBJ objPtr)
Definition: callback.h:1238
static void Destroy(void)
Every event scheduled by the Simulator::insertAtDestroy method is invoked.
Definition: simulator.cc:121
void SetDefault(std::string name, const AttributeValue &value)
Definition: config.cc:667
keep track of a set of node pointers.
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("LteAntennaTest")
double GetPathloss(uint16_t cellId, uint64_t imsi)
void AddTestCase(TestCase *testCase) NS_DEPRECATED
Add an individual child TestCase case to this TestCase.
Definition: test.cc:173
Fast test.
Definition: test.h:857
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
void Create(uint32_t n)
Create n nodes and append pointers to them to the end of this NodeContainer.
void SetPositionAllocator(Ptr< PositionAllocator > allocator)
Set the position allocator which will be used to allocate the initial position of every node initiali...
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
The LtePhy models the physical layer of LTE.
Definition: lte-phy.h:52
The LteUeNetDevice class implements the UE net device.