Update Phy support for Ue Measurements with time filtering and c-phy-sap measurements grouping

This commit is contained in:
Marco Miozzo
2013-02-21 17:22:42 +01:00
parent a209590c80
commit fabd3bf731
5 changed files with 95 additions and 14 deletions

View File

@@ -108,6 +108,17 @@ public:
*/
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 @@ 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<C>::RecvMasterInformationBlock (LteRrcSap::MasterInformat
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);
}

View File

@@ -125,6 +125,8 @@ LteUePhy::LteUePhy (Ptr<LteSpectrumPhy> dlPhy, Ptr<LteSpectrumPhy> ulPhy)
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 @@ LteUePhy::LteUePhy (Ptr<LteSpectrumPhy> dlPhy, Ptr<LteSpectrumPhy> 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 <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 @@ 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 <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 @@ 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 <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)

View File

@@ -40,6 +40,7 @@ class PacketBurst;
class LteEnbPhy;
class LteHarqPhy;
/**
* \ingroup lte
*
@@ -229,6 +230,8 @@ private:
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 @@ private:
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;

View File

@@ -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);
}
}

View File

@@ -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);