src/lte/test/lte-test-shadowing.cc
changeset 8248 986f7db9f056
parent 8247 9cc847386565
child 8249 b1c98c4098b3
equal deleted inserted replaced
8247:9cc847386565 8248:986f7db9f056
     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 }