Update Phy support for Ue Measurements with time filtering and c-phy-sap measurements grouping
authorMarco Miozzo <marco.miozzo@cttc.es>
Thu, 21 Feb 2013 17:22:42 +0100
changeset 9986 d1c0357a227f
parent 9985 ce4cdbfabe12
child 9987 ae556d123e8f
child 9992 16fb353f6347
Update Phy support for Ue Measurements with time filtering and c-phy-sap measurements grouping
src/lte/model/lte-ue-cphy-sap.h
src/lte/model/lte-ue-phy.cc
src/lte/model/lte-ue-phy.h
src/lte/model/lte-ue-rrc.cc
src/lte/model/lte-ue-rrc.h
--- a/src/lte/model/lte-ue-cphy-sap.h	Wed Feb 20 17:46:58 2013 +0100
+++ b/src/lte/model/lte-ue-cphy-sap.h	Thu Feb 21 17:22:42 2013 +0100
@@ -108,6 +108,17 @@
    */
   virtual ~LteUeCphySapUser ();
 
+  struct UeMeasurementsElement
+    {
+      uint16_t m_cellId;
+      double m_rsrp;
+      double m_rsrq;
+    };
+  struct UeMeasurementsParameters
+    {
+      std::vector <struct UeMeasurementsElement> m_ueMeasurementsList;
+    };
+
 
   /** 
    * 
@@ -121,7 +132,7 @@
    * \param rsrp the RSRP measured (see sect. 5.1.1 of 36.214) [W]
    * \param rsrq the RSRQ measured (see sect. 5.1.3 of 36.214) [linear ratio]
    */
-  virtual void ReportUeMeasurements (uint16_t cellId, double rsrp, double rsrq) = 0;
+  virtual void ReportUeMeasurements (UeMeasurementsParameters params) = 0;
 };
 
 
@@ -228,7 +239,7 @@
   // methods inherited from LteUeCphySapUser go here
   virtual void RecvMasterInformationBlock (LteRrcSap::MasterInformationBlock mib);
 
-  virtual void ReportUeMeasurements (uint16_t cellId, double rsrp, double rsrq);
+  virtual void ReportUeMeasurements (LteUeCphySapUser::UeMeasurementsParameters params);
 
 private:
   MemberLteUeCphySapUser ();
@@ -255,9 +266,9 @@
 
 template <class C>
 void
-MemberLteUeCphySapUser<C>::ReportUeMeasurements (uint16_t cellId, double rsrp, double rsrq)
+MemberLteUeCphySapUser<C>::ReportUeMeasurements (LteUeCphySapUser::UeMeasurementsParameters params)
 {
-  m_owner->DoReportUeMeasurements (cellId, rsrp, rsrq);
+  m_owner->DoReportUeMeasurements (params);
 }
 
 
--- a/src/lte/model/lte-ue-phy.cc	Wed Feb 20 17:46:58 2013 +0100
+++ b/src/lte/model/lte-ue-phy.cc	Thu Feb 21 17:22:42 2013 +0100
@@ -125,6 +125,8 @@
     m_rsReceivedPowerUpdated (false),
     m_rsInterferencePowerUpdated (false),
     m_pssReceived (false),
+    m_ueMeasurementsFilterPeriod (MilliSeconds (200)),
+    m_ueMeasurementsFilterLast (MilliSeconds (0)),
     m_rsrpSinrSampleCounter (0)
 {
   m_amc = CreateObject <LteAmc> ();
@@ -135,6 +137,7 @@
   NS_ASSERT_MSG (Simulator::Now ().GetNanoSeconds () == 0,
                  "Cannot create UE devices after simulation started");
   Simulator::ScheduleNow (&LteUePhy::SubframeIndication, this, 1, 1);
+  Simulator::Schedule (m_ueMeasurementsFilterPeriod, &LteUePhy::ReportUeMeasurements, this);
 
   DoReset ();
 }
@@ -239,10 +242,15 @@
                    MakePointerAccessor (&LteUePhy::GetUlSpectrumPhy),
                    MakePointerChecker <LteSpectrumPhy> ())
     .AddAttribute ("RsrqUeMeasThreshold",
-                  "Receive threshold for PSS on RSRQ [W]",
-                  DoubleValue (0.0),
+                  "Receive threshold for PSS on RSRQ [dB]",
+                  DoubleValue (-1000.0),
                    MakeDoubleAccessor (&LteUePhy::m_pssReceptionThreshold                    ),
                   MakeDoubleChecker<double> ())
+    .AddAttribute ("UeMeasurementsFilterPeriod",
+                  "Time period for reporting UE measurements (default 200 ms.) ",
+                  TimeValue (MilliSeconds (200)),
+                  MakeTimeAccessor (&LteUePhy::m_ueMeasurementsFilterPeriod),
+                  MakeTimeChecker ())
   ;
   return tid;
 }
@@ -518,14 +526,32 @@
               
             }
 
-          double rsrp = rsrpSum / (double)rbNum;
-          double rsrq = rsrpSum / rsrqSum;
+          double rsrp_dBm = 10 * log (1000 * rsrpSum / (double)rbNum);
+          double rsrq_dB = 10 * log (rsrpSum / rsrqSum);
 
-          if (rsrq > m_pssReceptionThreshold)
+          if (rsrq_dB > m_pssReceptionThreshold)
             {
               // report UE Measurements to upper layers
-              NS_LOG_DEBUG (this << " CellId " << (*itPss).first << " has RSRP " << rsrp << " and RSRQ " << rsrq);
-              m_ueCphySapUser-> ReportUeMeasurements((*itPss).first, rsrp, rsrq);
+              NS_LOG_DEBUG (this << " CellId " << (*itPss).first << " has RSRP " << rsrp_dBm << " and RSRQ " << rsrq_dB);
+              // store measurements
+              std::map <uint16_t, UeMeasurementsElement>::iterator itMeasMap =  m_UeMeasurementsMap.find ((*itPss).first);
+              if (itMeasMap == m_UeMeasurementsMap.end ())
+                {
+                  // insert new entry
+                  UeMeasurementsElement newEl;
+                  newEl.rsrpSum = rsrp_dBm;
+                  newEl.rsrpNum = 1;
+                  newEl.rsrqSum = rsrq_dB;
+                  newEl.rsrqNum = 1;
+                  m_UeMeasurementsMap.insert (std::pair <uint16_t, UeMeasurementsElement> ((*itPss).first, newEl));
+                }
+              else
+                {
+                  (*itMeasMap).second.rsrpSum += rsrp_dBm;
+                  (*itMeasMap).second.rsrpNum++;
+                  (*itMeasMap).second.rsrqSum += rsrq_dB;
+                  (*itMeasMap).second.rsrqNum++;
+                }
               
             }
           itPss++;
@@ -622,6 +648,30 @@
 }
 
 
+void
+LteUePhy::ReportUeMeasurements ()
+{
+  NS_LOG_FUNCTION (this << Simulator::Now ());
+  NS_LOG_DEBUG (this << " Report UE Measurements ");
+  LteUeCphySapUser::UeMeasurementsParameters ret;
+  std::map <uint16_t, UeMeasurementsElement>::iterator it;
+  for (it = m_UeMeasurementsMap.begin (); it != m_UeMeasurementsMap.end (); it++)
+    {
+      double avg_rsrp = (*it).second.rsrpSum / (double)(*it).second.rsrpNum;
+      double avg_rsrq = (*it).second.rsrqSum / (double)(*it).second.rsrqNum;
+      NS_LOG_DEBUG (this << " CellId " << (*it).first << " RSRP " << avg_rsrp << " (nSamples " << (*it).second.rsrpNum << ") RSRQ " << avg_rsrq << " (nSamples " << (*it).second.rsrpNum << ")");
+      LteUeCphySapUser::UeMeasurementsElement newEl;
+      newEl.m_cellId = (*it).first;
+      newEl.m_rsrp = avg_rsrp;
+      newEl.m_rsrq = avg_rsrq;
+      ret.m_ueMeasurementsList.push_back (newEl);
+    }
+  m_ueCphySapUser-> ReportUeMeasurements(ret);
+  m_UeMeasurementsMap.clear ();
+  Simulator::Schedule (m_ueMeasurementsFilterPeriod, &LteUePhy::ReportUeMeasurements, this);
+}
+
+
 
 void
 LteUePhy::DoSendLteControlMessage (Ptr<LteControlMessage> msg)
--- a/src/lte/model/lte-ue-phy.h	Wed Feb 20 17:46:58 2013 +0100
+++ b/src/lte/model/lte-ue-phy.h	Thu Feb 21 17:22:42 2013 +0100
@@ -40,6 +40,7 @@
 class LteEnbPhy;
 class LteHarqPhy;
 
+
 /**
  * \ingroup lte
  *
@@ -229,6 +230,8 @@
 
   void QueueSubChannelsForTransmission (std::vector <int> rbMap);
 
+  void ReportUeMeasurements ();
+
   // UE CPHY SAP methods
   void DoReset ();  
   void DoSyncronizeWithEnb (uint16_t cellId, uint16_t dlEarfcn);  
@@ -291,6 +294,18 @@
 
   double m_pssReceptionThreshold; // on RSRQ [W]
 
+  struct UeMeasurementsElement
+    {
+      double rsrpSum;
+      uint8_t rsrpNum;
+      double rsrqSum;
+      uint8_t rsrqNum;
+    };
+
+  std::map <uint16_t, UeMeasurementsElement> m_UeMeasurementsMap;
+  Time m_ueMeasurementsFilterPeriod;
+  Time m_ueMeasurementsFilterLast;
+
   Ptr<LteHarqPhy> m_harqPhyModule;
 
   uint32_t m_raPreambleId;
--- a/src/lte/model/lte-ue-rrc.cc	Wed Feb 20 17:46:58 2013 +0100
+++ b/src/lte/model/lte-ue-rrc.cc	Thu Feb 21 17:22:42 2013 +0100
@@ -544,10 +544,15 @@
 }
 
 void
-LteUeRrc::DoReportUeMeasurements (uint16_t cellId, double rsrp, double rsrq)
+LteUeRrc::DoReportUeMeasurements (LteUeCphySapUser::UeMeasurementsParameters params)
 {
   NS_LOG_FUNCTION (this);
-  NS_LOG_DEBUG (this << " CellId " << cellId << " RSRP " << rsrp << " RSRQ " << rsrq);
+  for (uint16_t i = 0; i < params.m_ueMeasurementsList.size (); i++)
+    {
+      
+      NS_LOG_DEBUG (this << " CellId " << params.m_ueMeasurementsList.at (i).m_cellId << " RSRP " << params.m_ueMeasurementsList.at (i).m_rsrp << " RSRQ " << params.m_ueMeasurementsList.at (i).m_rsrq);
+      
+    }
 }
 
 
--- a/src/lte/model/lte-ue-rrc.h	Wed Feb 20 17:46:58 2013 +0100
+++ b/src/lte/model/lte-ue-rrc.h	Thu Feb 21 17:22:42 2013 +0100
@@ -243,7 +243,7 @@
 
   // CPHY SAP methods
   void DoRecvMasterInformationBlock (LteRrcSap::MasterInformationBlock msg);
-  void DoReportUeMeasurements (uint16_t cellId, double rsrp, double rsrq);
+  void DoReportUeMeasurements (LteUeCphySapUser::UeMeasurementsParameters params);
 
   // RRC SAP methods
   void DoCompleteSetup (LteUeRrcSapProvider::CompleteSetupParameters params);