Bug-fix RSRP/RSRQ measurements: moved to RE basis and update test accordingly
This commit is contained in:
@@ -448,8 +448,10 @@ LteUePhy::GenerateCtrlCqiReport (const SpectrumValue& sinr)
|
||||
Values::const_iterator it;
|
||||
for (it = m_rsReceivedPower.ConstValuesBegin (); it != m_rsReceivedPower.ConstValuesEnd (); it++)
|
||||
{
|
||||
// convert PSD [W/Hz] to linear power [W]
|
||||
double powerTxW = (*it) * (m_dlBandwidth * 180000);
|
||||
// convert PSD [W/Hz] to linear power [W] for the single RE
|
||||
// we consider only one RE for the RS since the channel is
|
||||
// flat within the same RB
|
||||
double powerTxW = ((*it) * 180000.0) / 12.0;
|
||||
sum += powerTxW;
|
||||
rbNum++;
|
||||
}
|
||||
@@ -483,13 +485,13 @@ LteUePhy::GenerateCtrlCqiReport (const SpectrumValue& sinr)
|
||||
for (itPj = m_rsReceivedPower.ConstValuesBegin (); itPj != m_rsReceivedPower.ConstValuesEnd (); itIntN++, itPj++)
|
||||
{
|
||||
rbNum++;
|
||||
// convert PSD [W/Hz] to linear power [W]
|
||||
double noisePowerTxW = (*itIntN) * (m_dlBandwidth * 180000);
|
||||
double intPowerTxW = (*itPj) * (m_dlBandwidth * 180000);
|
||||
// convert PSD [W/Hz] to linear power [W] for the single RE
|
||||
double noisePowerTxW = ((*itIntN) * 180000.0) / 12.0;
|
||||
double intPowerTxW = ((*itPj) * 180000.0) / 12.0;
|
||||
rsrqSum += (noisePowerTxW + intPowerTxW);
|
||||
}
|
||||
NS_ASSERT (rbNum == (*itPss).nRB);
|
||||
double rsrp_dBm = 10 * log10 (1000 * (*itPss).pssPsdSum / (double)rbNum);
|
||||
double rsrp_dBm = 10 * log10 (1000 * ((*itPss).pssPsdSum / (double)rbNum));
|
||||
double rsrq_dB = 10 * log10 ((*itPss).pssPsdSum / rsrqSum);
|
||||
|
||||
if (rsrq_dB > m_pssReceptionThreshold)
|
||||
@@ -854,8 +856,8 @@ LteUePhy::ReceivePss (uint16_t cellId, Ptr<SpectrumValue> p)
|
||||
Values::const_iterator itPi;
|
||||
for (itPi = p->ConstValuesBegin (); itPi != p->ConstValuesEnd (); itPi++)
|
||||
{
|
||||
// convert PSD [W/Hz] to linear power [W]
|
||||
double powerTxW = (*itPi) * (m_dlBandwidth * 180000);
|
||||
// convert PSD [W/Hz] to linear power [W] for the single RE
|
||||
double powerTxW = ((*itPi) * 180000.0) / 12.0;
|
||||
sum += powerTxW;
|
||||
nRB++;
|
||||
}
|
||||
|
||||
@@ -70,19 +70,25 @@ LteUeMeasurementsTestSuite::LteUeMeasurementsTestSuite ()
|
||||
: TestSuite ("lte-ue-measurements", SYSTEM)
|
||||
{
|
||||
|
||||
AddTestCase (new LteUeMeasurementsTestCase ("d1=50, d2=10", 50.000000, 10.000000, -42.947889, -28.968489, -14.149733, -0.170333));
|
||||
AddTestCase (new LteUeMeasurementsTestCase ("d1=50, d2=20", 50.000000, 20.000000, -42.947889, -34.989089, -8.603380, -0.644580));
|
||||
AddTestCase (new LteUeMeasurementsTestCase ("d1=50, d2=50", 50.000000, 50.000000, -42.947889, -42.947889, -3.010300, -3.010300));
|
||||
AddTestCase (new LteUeMeasurementsTestCase ("d1=50, d2=100", 50.000000, 100.000000, -42.947889, -48.968489, -0.969101, -6.989700));
|
||||
AddTestCase (new LteUeMeasurementsTestCase ("d1=50, d2=200", 50.000000, 200.000000, -42.947889, -54.989089, -0.263290, -12.304490));
|
||||
AddTestCase (new LteUeMeasurementsTestCase ("d1=50, d2=500", 50.000000, 500.000000, -42.947889, -62.947889, -0.043214, -20.043214));
|
||||
AddTestCase (new LteUeMeasurementsTestCase ("d1=50, d2=1000", 50.000000, 1000.000000, -42.947889, -68.968489, -0.010844, -26.031444));
|
||||
AddTestCase (new LteUeMeasurementsTestCase ("d1=50, d2=10000", 50.000000, 10000.000000, -42.947889, -88.968489, -0.000109, -46.020709));
|
||||
AddTestCase (new LteUeMeasurementsTestCase ("d1=50, d2=100000", 50.000000, 100000.000000, -42.947889, -108.968489, -0.000002, -66.020601));
|
||||
AddTestCase (new LteUeMeasurementsTestCase ("d1=50, d2=1000000", 50.000000, 1000000.000000, -42.947889, -128.968489, -0.000000, -86.020600));
|
||||
|
||||
AddTestCase (new LteUeMeasurementsTestCase ("d1=4500, d2=12600", 4500.000000, 12600.000000, -82.032740, -90.975900, -0.524862, -9.468022));
|
||||
AddTestCase (new LteUeMeasurementsTestCase ("d1=5400, d2=12600", 5400.000000, 12600.000000, -83.616365, -90.975900, -0.737119, -8.096655));
|
||||
AddTestCase (new LteUeMeasurementsTestCase ("d1=10, d2=10000", 10.000000, 10000.000000, -53.739702, -113.739702, -0.000005, -60.000005));
|
||||
AddTestCase (new LteUeMeasurementsTestCase ("d1=20, d2=10000", 20.000000, 10000.000000, -59.760302, -113.739702, -0.000019, -53.979419));
|
||||
AddTestCase (new LteUeMeasurementsTestCase ("d1=50, d2=10000", 50.000000, 10000.000000, -67.719102, -113.739702, -0.000121, -46.020721));
|
||||
AddTestCase (new LteUeMeasurementsTestCase ("d1=100, d2=10000", 100.000000, 10000.000000, -73.739702, -113.739702, -0.000483, -40.000483));
|
||||
AddTestCase (new LteUeMeasurementsTestCase ("d1=200, d2=10000", 200.000000, 10000.000000, -79.760302, -113.739702, -0.001932, -33.981332));
|
||||
AddTestCase (new LteUeMeasurementsTestCase ("d1=100, d2=10000", 100.000000, 10000.000000, -73.739702, -113.739702, -0.000483, -40.000483));
|
||||
AddTestCase (new LteUeMeasurementsTestCase ("d1=200, d2=10000", 200.000000, 10000.000000, -79.760302, -113.739702, -0.001932, -33.981332));
|
||||
AddTestCase (new LteUeMeasurementsTestCase ("d1=500, d2=10000", 500.000000, 10000.000000, -87.719102, -113.739702, -0.012059, -26.032659));
|
||||
AddTestCase (new LteUeMeasurementsTestCase ("d1=1000, d2=10000", 1000.000000, 10000.000000, -93.739702, -113.739702, -0.048036, -20.048036));
|
||||
AddTestCase (new LteUeMeasurementsTestCase ("d1=2000, d2=10000", 2000.000000, 10000.000000, -99.760302, -113.739702, -0.189037, -14.168438));
|
||||
AddTestCase (new LteUeMeasurementsTestCase ("d1=5000, d2=10000", 5000.000000, 10000.000000, -107.719102, -113.739702, -1.065494, -7.086093));
|
||||
AddTestCase (new LteUeMeasurementsTestCase ("d1=10000, d2=10000", 10000.000000, 10000.000000, -113.739702, -113.739702, -3.247387, -3.247387));
|
||||
AddTestCase (new LteUeMeasurementsTestCase ("d1=20000, d2=10000", 20000.000000, 10000.000000, -119.760302, -113.739702, -7.363065, -1.342465));
|
||||
AddTestCase (new LteUeMeasurementsTestCase ("d1=50000, d2=10000", 50000.000000, 10000.000000, -127.719102, -113.739702, -14.594746, -0.615346));
|
||||
AddTestCase (new LteUeMeasurementsTestCase ("d1=100000, d2=10000", 100000.000000, 10000.000000, -133.739702, -113.739702, -20.500771, -0.500771));
|
||||
AddTestCase (new LteUeMeasurementsTestCase ("d1=200000, d2=10000", 200000.000000, 10000.000000, -139.760302, -113.739702, -26.492249, -0.471649));
|
||||
AddTestCase (new LteUeMeasurementsTestCase ("d1=500000, d2=10000", 500000.000000, 10000.000000, -147.719102, -113.739702, -34.442860, -0.463460));
|
||||
AddTestCase (new LteUeMeasurementsTestCase ("d1=1000000, d2=10000", 1000000.000000, 10000.000000, -153.739702, -113.739702, -40.462289, -0.462289));
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -70,11 +70,11 @@ for d2 = [10000]
|
||||
|
||||
|
||||
%% RSRP (linear)
|
||||
rsrp1 = g11dl.*dlp
|
||||
rsrp1 = g11dl.*dlp;
|
||||
rsrp2 = g21dl.*dlp;
|
||||
|
||||
%% RSRP (dBm)
|
||||
rsrp1dBm = 10.*log10(1000*rsrp1)
|
||||
rsrp1dBm = 10.*log10(1000*rsrp1);
|
||||
rsrp2dBm = 10.*log10(1000*rsrp2);
|
||||
|
||||
%% RSSI (linear)
|
||||
@@ -90,24 +90,13 @@ for d2 = [10000]
|
||||
rsrq2dB = 10.*log10(rsrq2);
|
||||
|
||||
%% SINR (linear)
|
||||
dlsinr = dlp*g11dl / (dlp*g21dl + dln)
|
||||
dlsinr = dlp*g11dl / (dlp*g21dl + dln);
|
||||
% ulsinr = ulp*g11ul / (ulp*g21ul + uln);
|
||||
|
||||
%% SINR (dB)
|
||||
dlsinrdB = 10.*log10(dlsinr);
|
||||
% ulsinrdB = 10.*log10(ulsinr);
|
||||
|
||||
%% Spectal Efficiency
|
||||
% dlse = log2(1 + dlsinr./gamma);
|
||||
% ulse = log2(1 + ulsinr./gamma);
|
||||
|
||||
%% to get the MCS, you need to do a manual lookup into 3GPP R1-081483
|
||||
%% starting from the spectral efficiency value.
|
||||
%% See the Testing section in the LTE module documentation for more info
|
||||
%% on how this is done. You might as well look into lte_amc.m
|
||||
|
||||
|
||||
|
||||
printf("AddTestCase (new LteUeMeasurementsTestCase (\"d1=%d, d2=%d\", % f, %f, % f, %f, % f, %f));\n", \
|
||||
d1, d2, d1, d2, rsrp1dBm, rsrp2dBm, rsrq1dB, rsrq2dB)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user