diff --git a/src/lte/model/lte-ue-cphy-sap.h b/src/lte/model/lte-ue-cphy-sap.h index 82ed036bc..1356a1eb7 100644 --- a/src/lte/model/lte-ue-cphy-sap.h +++ b/src/lte/model/lte-ue-cphy-sap.h @@ -108,6 +108,17 @@ public: */ virtual ~LteUeCphySapUser (); + struct UeMeasurementsElement + { + uint16_t m_cellId; + double m_rsrp; + double m_rsrq; + }; + struct UeMeasurementsParameters + { + std::vector m_ueMeasurementsList; + }; + /** * @@ -121,7 +132,7 @@ public: * \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 @@ public: // 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 @@ MemberLteUeCphySapUser::RecvMasterInformationBlock (LteRrcSap::MasterInformat template void -MemberLteUeCphySapUser::ReportUeMeasurements (uint16_t cellId, double rsrp, double rsrq) +MemberLteUeCphySapUser::ReportUeMeasurements (LteUeCphySapUser::UeMeasurementsParameters params) { - m_owner->DoReportUeMeasurements (cellId, rsrp, rsrq); + m_owner->DoReportUeMeasurements (params); } diff --git a/src/lte/model/lte-ue-phy.cc b/src/lte/model/lte-ue-phy.cc index e5ac3479f..293a5d024 100644 --- a/src/lte/model/lte-ue-phy.cc +++ b/src/lte/model/lte-ue-phy.cc @@ -125,6 +125,8 @@ LteUePhy::LteUePhy (Ptr dlPhy, Ptr ulPhy) m_rsReceivedPowerUpdated (false), m_rsInterferencePowerUpdated (false), m_pssReceived (false), + m_ueMeasurementsFilterPeriod (MilliSeconds (200)), + m_ueMeasurementsFilterLast (MilliSeconds (0)), m_rsrpSinrSampleCounter (0) { m_amc = CreateObject (); @@ -135,6 +137,7 @@ LteUePhy::LteUePhy (Ptr dlPhy, Ptr ulPhy) 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 @@ LteUePhy::GetTypeId (void) MakePointerAccessor (&LteUePhy::GetUlSpectrumPhy), MakePointerChecker ()) .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 ()) + .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 @@ LteUePhy::CreateDlCqiFeedbackMessage (const SpectrumValue& sinr) } - 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 ::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 ((*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 @@ LteUePhy::CreateDlCqiFeedbackMessage (const SpectrumValue& sinr) } +void +LteUePhy::ReportUeMeasurements () +{ + NS_LOG_FUNCTION (this << Simulator::Now ()); + NS_LOG_DEBUG (this << " Report UE Measurements "); + LteUeCphySapUser::UeMeasurementsParameters ret; + std::map ::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 msg) diff --git a/src/lte/model/lte-ue-phy.h b/src/lte/model/lte-ue-phy.h index 3867bdea9..d415627d0 100644 --- a/src/lte/model/lte-ue-phy.h +++ b/src/lte/model/lte-ue-phy.h @@ -40,6 +40,7 @@ class PacketBurst; class LteEnbPhy; class LteHarqPhy; + /** * \ingroup lte * @@ -229,6 +230,8 @@ private: void QueueSubChannelsForTransmission (std::vector rbMap); + void ReportUeMeasurements (); + // UE CPHY SAP methods void DoReset (); void DoSyncronizeWithEnb (uint16_t cellId, uint16_t dlEarfcn); @@ -291,6 +294,18 @@ private: double m_pssReceptionThreshold; // on RSRQ [W] + struct UeMeasurementsElement + { + double rsrpSum; + uint8_t rsrpNum; + double rsrqSum; + uint8_t rsrqNum; + }; + + std::map m_UeMeasurementsMap; + Time m_ueMeasurementsFilterPeriod; + Time m_ueMeasurementsFilterLast; + Ptr m_harqPhyModule; uint32_t m_raPreambleId; diff --git a/src/lte/model/lte-ue-rrc.cc b/src/lte/model/lte-ue-rrc.cc index fd7b557f8..f1f8bc079 100644 --- a/src/lte/model/lte-ue-rrc.cc +++ b/src/lte/model/lte-ue-rrc.cc @@ -544,10 +544,15 @@ LteUeRrc::DoRecvMasterInformationBlock (LteRrcSap::MasterInformationBlock msg) } 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); + + } } diff --git a/src/lte/model/lte-ue-rrc.h b/src/lte/model/lte-ue-rrc.h index 71aea02ca..ebb8670f1 100644 --- a/src/lte/model/lte-ue-rrc.h +++ b/src/lte/model/lte-ue-rrc.h @@ -243,7 +243,7 @@ private: // 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);