Update Phy support for Ue Measurements with time filtering and c-phy-sap measurements grouping
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user