added SNR test to lte-test-link-adaptation & updated it with new tx psd & noise values
authorNicola Baldo <nbaldo@cttc.es>
Thu, 12 May 2011 15:54:32 +0200
changeset 8064 026861f85f53
parent 8063 7d7cfd0ab33c
child 8065 47f0ce9e40cd
added SNR test to lte-test-link-adaptation & updated it with new tx psd & noise values
src/lte/model/lte-interference.cc
src/lte/model/lte-phy.cc
src/lte/model/lte-phy.h
src/lte/test/lte-test-link-adaptation.cc
src/lte/test/lte-test-link-adaptation.h
src/lte/test/lte-test-sinr-chunk-processor.cc
src/lte/test/lte-test-sinr-chunk-processor.h
--- a/src/lte/model/lte-interference.cc	Thu May 12 15:53:04 2011 +0200
+++ b/src/lte/model/lte-interference.cc	Thu May 12 15:54:32 2011 +0200
@@ -145,6 +145,8 @@
   NS_LOG_DEBUG (this << " now "  << Now () << " last " << m_lastChangeTime);
   if (m_receiving && (Now () > m_lastChangeTime))
     {
+      NS_LOG_LOGIC (this << " signal = " << *m_rxSignal << " allSignals = " << *m_allSignals << " noise = " << *m_noise);
+                    
       SpectrumValue sinr = (*m_rxSignal) / ((*m_allSignals) - (*m_rxSignal) + (*m_noise));
       Time duration = Now () - m_lastChangeTime;
       for (std::list<Ptr<LteSinrChunkProcessor> >::const_iterator it = m_sinrChunkProcessorList.begin (); it != m_sinrChunkProcessorList.end (); ++it)
@@ -161,7 +163,7 @@
 void
 LteInterference::SetNoisePowerSpectralDensity (Ptr<const SpectrumValue> noisePsd)
 {
-  NS_LOG_FUNCTION (this << noisePsd);
+  NS_LOG_FUNCTION (this << *noisePsd);
   m_noise = noisePsd;
   // we can initialize m_allSignal only now, because earlier we
   // didn't know what spectrum model was going to be used.
--- a/src/lte/model/lte-phy.cc	Thu May 12 15:53:04 2011 +0200
+++ b/src/lte/model/lte-phy.cc	Thu May 12 15:54:32 2011 +0200
@@ -107,6 +107,18 @@
   NS_LOG_FUNCTION (this);
   return m_netDevice;
 }
+  
+Ptr<LteSpectrumPhy> 
+LtePhy::GetDownlinkSpectrumPhy ()
+{
+  return m_downlinkSpectrumPhy;
+}
+
+Ptr<LteSpectrumPhy> 
+LtePhy::GetUplinkSpectrumPhy ()
+{
+  return m_uplinkSpectrumPhy;
+}
 
 
 void
--- a/src/lte/model/lte-phy.h	Thu May 12 15:53:04 2011 +0200
+++ b/src/lte/model/lte-phy.h	Thu May 12 15:54:32 2011 +0200
@@ -75,6 +75,19 @@
    */
   Ptr<LteNetDevice> GetDevice ();
 
+  /** 
+   * 
+   * \return a pointer to the LteSpectrumPhy instance that manages the downlink
+   */
+  Ptr<LteSpectrumPhy> GetDownlinkSpectrumPhy ();
+
+
+  /** 
+   * 
+   * \return a pointer to the LteSpectrumPhy instance that manages the uplink
+   */
+  Ptr<LteSpectrumPhy> GetUplinkSpectrumPhy ();
+  
   /**
   * \brief Queue the MAC PDU to be sent (according to m_macChTtiDelay)
   * \param p the MAC PDU to sent
--- a/src/lte/test/lte-test-link-adaptation.cc	Thu May 12 15:53:04 2011 +0200
+++ b/src/lte/test/lte-test-link-adaptation.cc	Thu May 12 15:54:32 2011 +0200
@@ -26,8 +26,13 @@
 #include "ns3/mobility-helper.h"
 #include "ns3/lena-helper.h"
 
+#include "ns3/lte-ue-phy.h"
+#include "ns3/lte-ue-net-device.h"
+
 #include "ns3/lte-test-link-adaptation.h"
 
+#include "lte-test-sinr-chunk-processor.h"
+
 NS_LOG_COMPONENT_DEFINE ("LteLinkAdaptationTest");
 
 using namespace ns3;
@@ -89,13 +94,13 @@
 
   struct SnrEfficiencyMcs
     {
-      double  snr;
+      double  snrDb;
       double  efficiency;
       int  mcsIndex;
     };
 
   /**
-    * Test vectors: SNR, Spectral Efficiency, MCS index
+    * Test vectors: SNRDB, Spectral Efficiency, MCS index
     * From XXX
     */
   SnrEfficiencyMcs snrEfficiencyMcs[] = {
@@ -139,30 +144,22 @@
   int numOfTests = sizeof (snrEfficiencyMcs) / sizeof (SnrEfficiencyMcs);
 
 
+  double txPowerDbm = 30; // default eNB TX power over whole bandwdith
+  double ktDbm = -174;    // reference LTE noise PSD
+  double noisePowerDbm = ktDbm + 10*log10(25*180000); // corresponds to kT*bandwidth in linear units
+  double receiverNoiseFigureDb = 9.0; // default UE noise figure
+ 
   for ( int i = 0 ; i < numOfTests; i++ )
-    {
-      /**
-       * SNR (in dB)
-       *
-       *  SNR = P_tx - loss - noise - receiverNoiseFigure
-       *
-       *  loss = P_tx - SNR - noise - receiverNoiseFigure
-       *
-       *  where: P_tx is transmission power
-       *         loss in (dB)
-       *         noise
-       */
-      double noiseDb = -107.5;
-      double receiverNoiseFigureDb = 5.0;
-      double lossDb = 30.0 - snrEfficiencyMcs[i].snr - noiseDb - receiverNoiseFigureDb;
+    {    
+      double lossDb = txPowerDbm - snrEfficiencyMcs[i].snrDb - noisePowerDbm - receiverNoiseFigureDb;
       double lossLinear = pow (10, lossDb / 10);
       double distance = ( ( 3e8 * sqrt ( lossLinear ) ) / ( 4.0 * M_PI * 2.160e9 ) );
 
       std::ostringstream name;
       name << "link adaptation"
-           << " snr= " << snrEfficiencyMcs[i].snr
+           << " snr= " << snrEfficiencyMcs[i].snrDb
            << " mcs= " << snrEfficiencyMcs[i].mcsIndex;
-      AddTestCase (new LteLinkAdaptationTestCase (name.str (),  snrEfficiencyMcs[i].snr, lossDb, distance, snrEfficiencyMcs[i].mcsIndex));
+      AddTestCase (new LteLinkAdaptationTestCase (name.str (),  snrEfficiencyMcs[i].snrDb, lossDb, distance, snrEfficiencyMcs[i].mcsIndex));
     }
 
 }
@@ -174,15 +171,15 @@
  * TestCase
  */
 
-LteLinkAdaptationTestCase::LteLinkAdaptationTestCase (std::string name, double snr, double loss, double distance, uint16_t mcsIndex)
+LteLinkAdaptationTestCase::LteLinkAdaptationTestCase (std::string name, double snrDb, double loss, double distance, uint16_t mcsIndex)
   : TestCase (name),
-    m_snr (snr),
+    m_snrDb (snrDb),
     m_loss (loss),
     m_distance (distance),
     m_mcsIndex (mcsIndex)
 {
   std::ostringstream sstream1, sstream2;
-  sstream1 << " snr=" << snr 
+  sstream1 << " snr=" << snrDb 
            << " mcs=" << mcsIndex;
 
   NS_LOG_UNCOND ("Creating LteLinkAdaptationTestCase: " + sstream1.str ());
@@ -195,44 +192,46 @@
 void
 LteLinkAdaptationTestCase::DoRun (void)
 {
-   LogLevel logLevel = (LogLevel)(LOG_PREFIX_FUNC | LOG_PREFIX_TIME | LOG_LEVEL_ALL);
-   LogComponentEnable ("LteAmc", logLevel);
-   LogComponentEnable ("LteLinkAdaptationTest", logLevel);
-//   LogComponentEnable ("LteEnbRrc", logLevel);
-//   LogComponentEnable ("LteUeRrc", logLevel);
-//   LogComponentEnable ("LteEnbMac", logLevel);
-//   LogComponentEnable ("LteUeMac", logLevel);
-//   LogComponentEnable ("LteRlc", logLevel);
-//   LogComponentEnable ("RrPacketScheduler", logLevel);
+  //   LogLevel logLevel = (LogLevel)(LOG_PREFIX_FUNC | LOG_PREFIX_TIME | LOG_LEVEL_ALL);
+  //    LogComponentEnable ("LteAmc", logLevel);
+  //    LogComponentEnable ("LteLinkAdaptationTest", logLevel);
+  //   LogComponentEnable ("LteEnbRrc", logLevel);
+  //   LogComponentEnable ("LteUeRrc", logLevel);
+  //   LogComponentEnable ("LteEnbMac", logLevel);
+  //   LogComponentEnable ("LteUeMac", logLevel);
+  //   LogComponentEnable ("LteRlc", logLevel);
+  //   LogComponentEnable ("RrPacketScheduler", logLevel);
 
-//   LogComponentEnable ("RrFfMacScheduler", logLevel);
+  //   LogComponentEnable ("RrFfMacScheduler", logLevel);
 
-//   LogComponentEnable ("LtePhy", logLevel);
-//   LogComponentEnable ("LteEnbPhy", logLevel);
-//   LogComponentEnable ("LteUePhy", logLevel);
+  // LogComponentEnable ("LtePhy", logLevel);
+  // LogComponentEnable ("LteEnbPhy", logLevel);
+  // LogComponentEnable ("LteUePhy", logLevel);
 
-//   LogComponentEnable ("LteSpectrumValueHelper", logLevel);
-//   LogComponentEnable ("LteSpectrumPhy", logLevel);
-//   LogComponentEnable ("LteInterference", logLevel);
-//   LogComponentEnable ("LteSinrChunkProcessor", logLevel);
+  // LogComponentEnable ("LteSpectrumValueHelper", logLevel);
+  // LogComponentEnable ("LteSpectrumPhy", logLevel);
+  // LogComponentEnable ("LteInterference", logLevel);
+  // LogComponentEnable ("LteSinrChunkProcessor", logLevel);
+  // LogComponentEnable ("LteTestSinrChunkProcessor", logLevel);
 
-//   LogComponentEnable ("LtePropagationLossModel", logLevel);
-//   LogComponentEnable ("LossModel", logLevel);
-//   LogComponentEnable ("ShadowingLossModel", logLevel);
-//   LogComponentEnable ("PenetrationLossModel", logLevel);
-//   LogComponentEnable ("MultipathLossModel", logLevel);
-//   LogComponentEnable ("PathLossModel", logLevel);
-//   LogComponentEnable ("FriisSpectrumPropagationLossModel", logLevel);
-//   LogComponentEnable ("ConstantSpectrumPropagationLossModel", logLevel);
+  //   LogComponentEnable ("LtePropagationLossModel", logLevel);
+  //   LogComponentEnable ("LossModel", logLevel);
+  //   LogComponentEnable ("ShadowingLossModel", logLevel);
+  //   LogComponentEnable ("PenetrationLossModel", logLevel);
+  //   LogComponentEnable ("MultipathLossModel", logLevel);
+  //   LogComponentEnable ("PathLossModel", logLevel);
+  //   LogComponentEnable ("FriisSpectrumPropagationLossModel", logLevel);
+  //   LogComponentEnable ("ConstantSpectrumPropagationLossModel", logLevel);
 
-//   LogComponentEnable ("LteNetDevice", logLevel);
-//   LogComponentEnable ("LteUeNetDevice", logLevel);
-//   LogComponentEnable ("LteEnbNetDevice", logLevel);
+  //   LogComponentEnable ("LteNetDevice", logLevel);
+  //   LogComponentEnable ("LteUeNetDevice", logLevel);
+  //   LogComponentEnable ("LteEnbNetDevice", logLevel);
 
-//   LogComponentEnable ("MobilityModel", logLevel);
-//   LogComponentEnable ("ConstantPositionMobilityModel", logLevel);
-//   LogComponentEnable ("MultiModelSpectrumChannel", logLevel);
-//   LogComponentEnable ("SingleModelSpectrumChannel", logLevel);
+  //   LogComponentEnable ("MobilityModel", logLevel);
+  //   LogComponentEnable ("ConstantPositionMobilityModel", logLevel);
+  //   LogComponentEnable ("MultiModelSpectrumChannel", logLevel);
+  //   LogComponentEnable ("SingleModelSpectrumChannel", logLevel);
+   
 
   /**
     * Simulation Topology
@@ -243,7 +242,7 @@
   lena->EnableMacTraces ();
   lena->EnableRlcTraces ();
   lena->SetAttribute ("PropagationModel", StringValue ("ns3::ConstantSpectrumPropagationLossModel"));
-  NS_LOG_INFO ("SNR = " << m_snr << "  LOSS = " << m_loss);
+  NS_LOG_INFO ("SNR = " << m_snrDb << "  LOSS = " << m_loss);
   lena->SetPropagationModelAttribute ("Loss", DoubleValue (m_loss));
 
   // Create Nodes: eNodeB and UE
@@ -280,15 +279,24 @@
   lena->ActivateEpsBearer (ueDevs, bearer);
 
 
+  // this is to test that the SNR is as intended
+  Ptr<LtePhy> uePhy = ueDevs.Get (0)->GetObject<LteUeNetDevice> ()->GetPhy ()->GetObject<LtePhy> ();
+  Ptr<LteTestSinrChunkProcessor> testSinr = Create<LteTestSinrChunkProcessor> (uePhy);
+  uePhy->GetDownlinkSpectrumPhy ()->AddSinrChunkProcessor (testSinr);
+
+
   Config::Connect ("/NodeList/0/DeviceList/0/LteEnbMac/DlScheduling",
                     MakeBoundCallback(&LteTestDlSchedulingCallback, this));
 
-   Simulator::Stop (Seconds (0.005));
-   //Simulator::Stop (Seconds (0.01));
+  Simulator::Stop (Seconds (0.005));
+  //Simulator::Stop (Seconds (0.01));
 //   Simulator::Stop (Seconds (0.1));
 /*  Simulator::Stop (Seconds (2.0));*/
 //   Simulator::Stop (Seconds (10.0));
   Simulator::Run ();
+
+  double calculatedSinrDb = 10.0 * log10 (testSinr->GetSinr ()[0]);
+  NS_TEST_ASSERT_MSG_EQ_TOL (calculatedSinrDb, m_snrDb, 0.0000001, "Wrong SINR !");
   Simulator::Destroy ();
 }
 
@@ -318,7 +326,7 @@
 //                         << (uint16_t)mcsTb1 << "\t" << sizeTb1 << "\t"
 //                         << (uint16_t)mcsTb2 << "\t" << sizeTb2);
 
-      NS_LOG_UNCOND (m_snr << "\t" << m_mcsIndex << "\t" << (uint16_t)mcsTb1);
+      NS_LOG_UNCOND (m_snrDb << "\t" << m_mcsIndex << "\t" << (uint16_t)mcsTb1);
 
       NS_TEST_ASSERT_MSG_EQ ((uint16_t)mcsTb1, m_mcsIndex, "Wrong MCS index");
     }
--- a/src/lte/test/lte-test-link-adaptation.h	Thu May 12 15:53:04 2011 +0200
+++ b/src/lte/test/lte-test-link-adaptation.h	Thu May 12 15:54:32 2011 +0200
@@ -40,7 +40,7 @@
 class LteLinkAdaptationTestCase : public TestCase
 {
   public:
-  LteLinkAdaptationTestCase (std::string name, double snr, double loss, double distance, uint16_t mcsIndex);
+  LteLinkAdaptationTestCase (std::string name, double snrDb, double loss, double distance, uint16_t mcsIndex);
     LteLinkAdaptationTestCase ();
     virtual ~LteLinkAdaptationTestCase ();
 
@@ -50,7 +50,7 @@
   private:
     virtual void DoRun (void);
 
-    double m_snr;
+    double m_snrDb;
     double m_loss;
     double m_distance;
     uint16_t m_mcsIndex;
--- a/src/lte/test/lte-test-sinr-chunk-processor.cc	Thu May 12 15:53:04 2011 +0200
+++ b/src/lte/test/lte-test-sinr-chunk-processor.cc	Thu May 12 15:54:32 2011 +0200
@@ -70,7 +70,8 @@
     {
       NS_LOG_LOGIC (this << " m_sumSinr = " << *m_sumSinr);
       NS_LOG_LOGIC (this << " m_totDuration = " << m_totDuration);
-      NS_LOG_LOGIC (this << " m_sumSinr / m_totDuration = " << (*m_sumSinr) / m_totDuration.GetSeconds ());
+      m_sinr = Create<SpectrumValue> ((*m_sumSinr) / m_totDuration.GetSeconds ());
+      NS_LOG_LOGIC (this << " m_sumSinr / m_totDuration = " << *m_sinr);
     }
   else
     {
@@ -83,7 +84,7 @@
 {
   NS_LOG_FUNCTION (this);
 
-  return (*m_sumSinr) / m_totDuration.GetSeconds ();
+  return *m_sinr;
 }
 
 } // namespace ns3
--- a/src/lte/test/lte-test-sinr-chunk-processor.h	Thu May 12 15:53:04 2011 +0200
+++ b/src/lte/test/lte-test-sinr-chunk-processor.h	Thu May 12 15:54:32 2011 +0200
@@ -46,6 +46,7 @@
 
 private:
   Ptr<SpectrumValue> m_sumSinr;
+  Ptr<SpectrumValue> m_sinr;
   Time m_totDuration;
   Ptr<LtePhy> m_phy;
 };