Update Phy support for Ue Measurements with time filtering and c-phy-sap measurements grouping
--- 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);