revised test vector, conditions and scenario of lte-phy-error-model test

This commit is contained in:
Nicola Baldo
2013-09-09 16:03:14 +02:00
parent 47f185eab0
commit 382fa53396
3 changed files with 131 additions and 94 deletions

View File

@@ -608,9 +608,9 @@ The parameters of the nine test cases are reported in the following:
BLER for test 6.
The test verifies that in each case the expected number of packets received correct corresponds to a Bernoulli distribution with a confidence interval of 99%, where the probability of success in each trail is :math:`p=1-BER` and :math:`n` is the total number of packet sent.
The test condition verifies that in each test case the expected number of packets received correct corresponds to a Bernoulli distribution with a confidence interval of 99%, where the probability of success in each trail is :math:`p=1-BER` and :math:`n` is the total number of packet sent.
The error model of PCFICH-PDDCH channels consists of 4 test cases with a single UE and several eNBs, where the UE is connected to only one eNB in order to have the remaining acting as interfering ones. The errors on data are disabled in order to verify only the ones due to erroneous decodification of PCFICH-PDCCH. The test verifies that the error on the data received respects the decodification error probability of the PCFICH-PDCCH with a tolerance of 0.1 due to the errors that might be produced in quantizing the MI and the error curve. As before, the system has been forced on working in a less conservative fashion in the AMC module for appreciating the results in border situations. The parameters of the 4 tests cases are reported in the following:
The error model of PCFICH-PDCCH channels consists of 4 test cases with a single UE and several eNBs, where the UE is connected to only one eNB in order to have the remaining acting as interfering ones. The errors on data are disabled in order to verify only the ones due to erroneous decodification of PCFICH-PDCCH. As before, the system has been forced on working in a less conservative fashion in the AMC module for appreciating the results in border situations. The parameters of the 4 tests cases are reported in the following:
#. 2 eNBs placed 1078 meters far from the UE, which implies a SINR of -2.00 dB and a TB of 217 bits, that in turns produce a BLER of 0.007.
#. 3 eNBs placed 1078 meters far from the UE, which implies a SINR of -4.00 dB and a TB of 217 bits, that in turns produce a BLER of 0.045.
@@ -618,6 +618,9 @@ The error model of PCFICH-PDDCH channels consists of 4 test cases with a single
#. 5 eNBs placed 1078 meters far from the UE, which implies a SINR of -7.00 dB and a TB of 81 bits, that in turns produce a BLER of 0.343.
The test condition verifies that in each test case the expected number of packets received correct corresponds to a Bernoulli distribution with a confidence interval of 99.8%, where the probability of success in each trail is :math:`p=1-BER` and :math:`n` is the total number of packet sent. The larger confidence interval is due to the errors that might be produced in quantizing the MI and the error curve.
HARQ Model
----------

View File

@@ -46,13 +46,14 @@
#include <ns3/config.h>
#include <ns3/boolean.h>
#include <ns3/enum.h>
#include <ns3/integer.h>
#include <ns3/unused.h>
#include <ns3/ff-mac-scheduler.h>
#include <ns3/buildings-helper.h>
#include "lte-test-phy-error-model.h"
NS_LOG_COMPONENT_DEFINE ("LenaTestPhyErrorModel");
NS_LOG_COMPONENT_DEFINE ("LteTestPhyErrorModel");
namespace ns3 {
@@ -63,59 +64,70 @@ LenaTestPhyErrorModelrSuite::LenaTestPhyErrorModelrSuite ()
NS_LOG_INFO ("creating LenaTestPhyErrorModelTestCase");
// Tests on DL Control Channels (PCFICH+PDDCH)
// 1 interfering eNB SINR -2.0 BLER 0.007 TB size 217
AddTestCase (new LenaDlCtrlPhyErrorModelTestCase (2, 1078, 217, 0.007), TestCase::QUICK);
// 2 interfering eNBs SINR -4.0 BLER 0.037 TB size 217
AddTestCase (new LenaDlCtrlPhyErrorModelTestCase (3, 1040, 217, 0.045), TestCase::EXTENSIVE);
// 3 interfering eNBs SINR -6.0 BLER 0.21 TB size 133
AddTestCase (new LenaDlCtrlPhyErrorModelTestCase (4, 1250, 133, 0.206), TestCase::EXTENSIVE);
// 4 interfering eNBs SINR -7.0 BLER 0.34 TB size 133
AddTestCase (new LenaDlCtrlPhyErrorModelTestCase (5, 1260, 81, 0.343), TestCase::EXTENSIVE);
for (uint32_t rngRun = 1; rngRun <= 3; ++rngRun)
{
// Tests on DL Control Channels (PCFICH+PDCCH)
// the tolerance is calculated with the following octave code:
//
// n = 1000; # TX packets
// for p=1-[0.007 0.045 0.206 0.343]
// tol = n*p - binoinv(0.001, n, p)
// endfor
// Tests on DL Data channels (PDSCH)
// the tolerance is calculated with the following octave code:
//
// n = 1000;
// for p=1-[0.33 0.11 0.2 0.3 0.55 0.14]
// tol = n*p - binoinv(0.005, n, p)
// endfor
// 1 interfering eNB SINR -2.0 BLER 0.007 TB size 217
AddTestCase (new LenaDlCtrlPhyErrorModelTestCase (2, 1078, 217, 0.007, 9, rngRun), (rngRun == 1) ? TestCase::QUICK : TestCase::TAKES_FOREVER);
// 2 interfering eNBs SINR -4.0 BLER 0.037 TB size 217
AddTestCase (new LenaDlCtrlPhyErrorModelTestCase (3, 1040, 217, 0.045, 21, rngRun), (rngRun == 1) ? TestCase::EXTENSIVE : TestCase::TAKES_FOREVER);
// 3 interfering eNBs SINR -6.0 BLER 0.21 TB size 133
AddTestCase (new LenaDlCtrlPhyErrorModelTestCase (4, 1250, 133, 0.206, 40, rngRun), (rngRun == 1) ? TestCase::EXTENSIVE : TestCase::TAKES_FOREVER);
// 4 interfering eNBs SINR -7.0 BLER 0.34 TB size 133
AddTestCase (new LenaDlCtrlPhyErrorModelTestCase (5, 1260, 81, 0.343, 47, rngRun), (rngRun == 1) ? TestCase::EXTENSIVE : TestCase::TAKES_FOREVER);
// MCS 2 TB size of 256 bits BLER 0.33 SINR -5.51
AddTestCase (new LenaDataPhyErrorModelTestCase (4, 1800, 32, 0.33, 39), TestCase::QUICK);
// MCS 2 TB size of 528 bits BLER 0.11 SINR -5.51
AddTestCase (new LenaDataPhyErrorModelTestCase (2, 1800, 66, 0.11, 26), TestCase::EXTENSIVE);
// MCS 2 TB size of 1088 bits BLER 0.02 SINR -5.51
AddTestCase (new LenaDataPhyErrorModelTestCase (1, 1800, 136, 0.02, 33), TestCase::EXTENSIVE);
// MCS 12 TB size of 4800 bits BLER 0.3 SINR 4.43
AddTestCase (new LenaDataPhyErrorModelTestCase (1, 600, 600, 0.3, 38), TestCase::EXTENSIVE);
// MCS 12 TB size of 1632 bits BLER 0.55 SINR 4.43
AddTestCase (new LenaDataPhyErrorModelTestCase (3, 600, 204, 0.55, 40), TestCase::EXTENSIVE);
// MCS 16 TB size of 7272 bits (3648 x 3584) BLER 0.14 SINR 8.48
// BLER 0.14 = 1 - ((1-0.075)*(1-0.075))
AddTestCase (new LenaDataPhyErrorModelTestCase (1, 470, 781, 0.14, 29), TestCase::EXTENSIVE);
// Tests on DL Data channels (PDSCH)
// the tolerance is calculated with the following octave code:
//
// n = 1000; # TX packets
// for p=1-[0.33 0.11 0.2 0.3 0.55 0.14]
// tol = n*p - binoinv(0.005, n, p)
// endfor
// MCS 2 TB size of 256 bits BLER 0.33 SINR -5.51
AddTestCase (new LenaDataPhyErrorModelTestCase (4, 1800, 32, 0.33, 39, rngRun), (rngRun == 1) ? TestCase::QUICK : TestCase::TAKES_FOREVER);
// MCS 2 TB size of 528 bits BLER 0.11 SINR -5.51
AddTestCase (new LenaDataPhyErrorModelTestCase (2, 1800, 66, 0.11, 26, rngRun), (rngRun == 1) ? TestCase::EXTENSIVE : TestCase::TAKES_FOREVER);
// MCS 2 TB size of 1088 bits BLER 0.02 SINR -5.51
AddTestCase (new LenaDataPhyErrorModelTestCase (1, 1800, 136, 0.02, 33, rngRun), (rngRun == 1) ? TestCase::EXTENSIVE : TestCase::TAKES_FOREVER);
// MCS 12 TB size of 4800 bits BLER 0.3 SINR 4.43
AddTestCase (new LenaDataPhyErrorModelTestCase (1, 600, 600, 0.3, 38, rngRun), (rngRun == 1) ? TestCase::EXTENSIVE : TestCase::TAKES_FOREVER);
// MCS 12 TB size of 1632 bits BLER 0.55 SINR 4.43
AddTestCase (new LenaDataPhyErrorModelTestCase (3, 600, 204, 0.55, 40, rngRun), (rngRun == 1) ? TestCase::EXTENSIVE : TestCase::TAKES_FOREVER);
// MCS 16 TB size of 7272 bits (3648 x 3584) BLER 0.14 SINR 8.48
// BLER 0.14 = 1 - ((1-0.075)*(1-0.075))
AddTestCase (new LenaDataPhyErrorModelTestCase (1, 470, 781, 0.14, 29, rngRun), (rngRun == 1) ? TestCase::EXTENSIVE : TestCase::TAKES_FOREVER);
}
}
static LenaTestPhyErrorModelrSuite lenaTestPhyErrorModelrSuite;
std::string
LenaDataPhyErrorModelTestCase::BuildNameString (uint16_t nUser, uint16_t dist)
LenaDataPhyErrorModelTestCase::BuildNameString (uint16_t nUser, uint16_t dist, uint32_t rngRun)
{
std::ostringstream oss;
oss << nUser << " UEs, distance " << dist << " m";
oss << "DataPhyErrorModel " << nUser << " UEs, distance " << dist << " m, RngRun " << rngRun;
return oss.str ();
}
LenaDataPhyErrorModelTestCase::LenaDataPhyErrorModelTestCase (uint16_t nUser, uint16_t dist, uint16_t tbSize, double blerRef, uint16_t toleranceRxPackets)
: TestCase (BuildNameString (nUser, dist)),
LenaDataPhyErrorModelTestCase::LenaDataPhyErrorModelTestCase (uint16_t nUser, uint16_t dist, uint16_t tbSize, double blerRef, uint16_t toleranceRxPackets, uint32_t rngRun)
: TestCase (BuildNameString (nUser, dist, rngRun)),
m_nUser (nUser),
m_dist (dist),
m_tbSize (tbSize),
m_blerRef (blerRef),
m_toleranceRxPackets (toleranceRxPackets)
m_toleranceRxPackets (toleranceRxPackets),
m_rngRun (rngRun)
{
}
@@ -133,12 +145,13 @@ LenaDataPhyErrorModelTestCase::DoRun (void)
Config::SetDefault ("ns3::LteSpectrumPhy::CtrlErrorModelEnabled", BooleanValue (false));
Config::SetDefault ("ns3::LteSpectrumPhy::DataErrorModelEnabled", BooleanValue (true));
Config::SetDefault ("ns3::RrFfMacScheduler::HarqEnabled", BooleanValue (false));
Config::SetGlobal ("RngRun", IntegerValue (m_rngRun));
/**
/*
* Initialize Simulation Scenario: 1 eNB and m_nUser UEs
*/
int64_t stream = 1;
Ptr<LteHelper> lena = CreateObject<LteHelper> ();
// Create Nodes: eNodeB and UE
@@ -169,7 +182,9 @@ LenaDataPhyErrorModelTestCase::DoRun (void)
lena->SetSchedulerAttribute ("UlCqiFilter", EnumValue (FfMacScheduler::PUSCH_UL_CQI));
enbDevs = lena->InstallEnbDevice (enbNodes);
stream += lena->AssignStreams (enbDevs, stream);
ueDevs = lena->InstallUeDevice (ueNodes);
stream += lena->AssignStreams (ueDevs, stream);
// Attach a UE to a eNB
lena->Attach (ueDevs, enbDevs.Get (0));
@@ -199,13 +214,16 @@ LenaDataPhyErrorModelTestCase::DoRun (void)
uePhy->SetAttribute ("NoiseFigure", DoubleValue (9.0));
}
lena->EnableRlcTraces ();
Time simulationTime = Seconds (1.000);
double statsStartTime = 0.04; // need to allow for RRC connection establishment + SRS
double statsDuration = 1.0;
Simulator::Stop (simulationTime);
Simulator::Stop (Seconds (statsStartTime + statsDuration - 0.0001));
lena->EnableRlcTraces ();
Ptr<RadioBearerStatsCalculator> rlcStats = lena->GetRlcStats ();
rlcStats->SetAttribute ("EpochDuration", TimeValue (simulationTime));
rlcStats->SetAttribute ("StartTime", TimeValue (Seconds (statsStartTime)));
rlcStats->SetAttribute ("EpochDuration", TimeValue (Seconds (statsDuration)));
Simulator::Run ();
@@ -231,16 +249,14 @@ LenaDataPhyErrorModelTestCase::DoRun (void)
NS_UNUSED (dlBler);
// sanity check for whether the tx packets reported by the stats are correct
// we expect one packet per TTI, excluding the initial RRC connection establishment period
double expectedDlMinTxPackets = simulationTime.GetMilliSeconds () - 50;
NS_TEST_ASSERT_MSG_GT (dlTxPackets, expectedDlMinTxPackets, " too few DL TX packets reported");
// the quantiles are evaluated offline according to a Bernoulli
// ditribution with n equal to the number of packet sent and p equal
// to the BLER (see /reference/bernuolliDistribution.m for details)
NS_TEST_ASSERT_MSG_EQ_TOL (dlRxPackets, expectedDlRxPackets, m_toleranceRxPackets, " Unexpected DL BLER distribution!");
// we expect one packet per TTI
double expectedDlTxPackets = statsDuration * 1000;
NS_TEST_ASSERT_MSG_EQ_TOL (dlTxPackets, expectedDlTxPackets, expectedDlTxPackets * 0.005,
" too different DL TX packets reported");
// this is the main test condition: check that the RX packets are consistent with the BLER
NS_TEST_ASSERT_MSG_EQ_TOL (dlRxPackets, expectedDlRxPackets, m_toleranceRxPackets,
" Unexpected DL BLER distribution!");
}
@@ -251,20 +267,22 @@ LenaDataPhyErrorModelTestCase::DoRun (void)
std::string
LenaDlCtrlPhyErrorModelTestCase::BuildNameString (uint16_t nEnb, uint16_t dist)
LenaDlCtrlPhyErrorModelTestCase::BuildNameString (uint16_t nEnb, uint16_t dist, uint32_t rngRun)
{
std::ostringstream oss;
oss << nEnb << " eNBs, distance " << dist << " m";
oss << "DlCtrlPhyErrorModel " << nEnb << " eNBs, distance " << dist << " m, RngRun " << rngRun;
return oss.str ();
}
LenaDlCtrlPhyErrorModelTestCase::LenaDlCtrlPhyErrorModelTestCase (uint16_t nEnb, uint16_t dist, uint16_t tbSize, double blerRef)
: TestCase (BuildNameString (nEnb, dist)),
m_nEnb (nEnb),
m_dist (dist),
m_tbSize (tbSize),
m_blerRef (blerRef)
LenaDlCtrlPhyErrorModelTestCase::LenaDlCtrlPhyErrorModelTestCase (uint16_t nEnb, uint16_t dist, uint16_t tbSize, double blerRef, uint16_t toleranceRxPackets, uint32_t rngRun)
: TestCase (BuildNameString (nEnb, dist, rngRun)),
m_nEnb (nEnb),
m_dist (dist),
m_tbSize (tbSize),
m_blerRef (blerRef),
m_toleranceRxPackets (toleranceRxPackets),
m_rngRun (rngRun)
{
}
@@ -282,11 +300,13 @@ LenaDlCtrlPhyErrorModelTestCase::DoRun (void)
Config::SetDefault ("ns3::LteSpectrumPhy::CtrlErrorModelEnabled", BooleanValue (true));
Config::SetDefault ("ns3::LteSpectrumPhy::DataErrorModelEnabled", BooleanValue (false));
Config::SetDefault ("ns3::RrFfMacScheduler::HarqEnabled", BooleanValue (false));
/**
* Initialize Simulation Scenario: 1 eNB and m_nUser UEs
*/
Config::SetGlobal ("RngRun", IntegerValue (m_rngRun));
/*
* Initialize Simulation Scenario: 1 eNB and m_nUser UEs
*/
int64_t stream = 1;
Ptr<LteHelper> lena = CreateObject<LteHelper> ();
// Create Nodes: eNodeB and UE
@@ -317,7 +337,9 @@ LenaDlCtrlPhyErrorModelTestCase::DoRun (void)
lena->SetSchedulerAttribute ("UlCqiFilter", EnumValue (FfMacScheduler::PUSCH_UL_CQI));
enbDevs = lena->InstallEnbDevice (enbNodes);
stream += lena->AssignStreams (enbDevs, stream);
ueDevs = lena->InstallUeDevice (ueNodes);
stream += lena->AssignStreams (ueDevs, stream);
// Attach a UE to one eNB (the others are interfering ones)
lena->Attach (ueDevs, enbDevs.Get (0));
@@ -347,14 +369,16 @@ LenaDlCtrlPhyErrorModelTestCase::DoRun (void)
uePhy->SetAttribute ("TxPower", DoubleValue (23.0));
uePhy->SetAttribute ("NoiseFigure", DoubleValue (9.0));
double statsStartTime = 0.04; // need to allow for RRC connection establishment + SRS
double statsDuration = 1.0;
Simulator::Stop (Seconds (statsStartTime + statsDuration - 0.0001));
lena->EnableRlcTraces ();
Time simulationTime = Seconds (1.000);
Simulator::Stop (simulationTime);
Ptr<RadioBearerStatsCalculator> rlcStats = lena->GetRlcStats ();
rlcStats->SetAttribute ("EpochDuration", TimeValue (simulationTime));
rlcStats->SetAttribute ("StartTime", TimeValue (Seconds (statsStartTime)));
rlcStats->SetAttribute ("EpochDuration", TimeValue (Seconds (statsDuration)));
Simulator::Run ();
@@ -369,18 +393,25 @@ LenaDlCtrlPhyErrorModelTestCase::DoRun (void)
uint8_t lcId = 3;
double dlRxPackets = rlcStats->GetDlRxPackets (imsi, lcId);
double dlTxPackets = rlcStats->GetDlTxPackets (imsi, lcId);
double bler = 1.0 - (dlRxPackets/dlTxPackets);
NS_LOG_INFO ("\tUser " << i << " imsi " << imsi
double dlBler = 1.0 - (dlRxPackets/dlTxPackets);
double expectedDlRxPackets = dlTxPackets -dlTxPackets*m_blerRef;
NS_LOG_INFO ("\tUser " << i << " imsi " << imsi << " DOWNLINK"
<< " pkts rx " << dlRxPackets << " tx " << dlTxPackets
<< " BLER " << bler << " Err " << fabs (m_blerRef - bler));
NS_UNUSED (bler);
<< " BLER " << dlBler << " Err " << std::fabs (m_blerRef - dlBler)
<< " expected rx " << expectedDlRxPackets
<< " difference " << std::abs (expectedDlRxPackets - dlRxPackets)
<< " tolerance " << m_toleranceRxPackets);
NS_UNUSED (dlBler);
// sanity check for whether the tx packets reported by the stats are correct
// we expect one packet per TTI, excluding the initial RRC connection establishment period
double expectedMinDlTxPackets = simulationTime.GetMilliSeconds () - 50;
NS_TEST_ASSERT_MSG_GT (dlTxPackets, expectedMinDlTxPackets, " too few TX packets reported");
// we expect one packet per TTI
double expectedDlTxPackets = statsDuration * 1000;
NS_TEST_ASSERT_MSG_EQ_TOL (dlTxPackets, expectedDlTxPackets, expectedDlTxPackets * 0.005,
" too different DL TX packets reported");
NS_TEST_ASSERT_MSG_EQ_TOL (bler, m_blerRef, 0.1, " Unexpected BLER distribution!");
// this is the main test condition: check that the RX packets are consistent with the BLER
NS_TEST_ASSERT_MSG_EQ_TOL (dlRxPackets, expectedDlRxPackets, m_toleranceRxPackets,
" Unexpected DL BLER distribution!");
}
Simulator::Destroy ();

View File

@@ -38,17 +38,18 @@ namespace ns3 {
class LenaDataPhyErrorModelTestCase : public TestCase
{
public:
LenaDataPhyErrorModelTestCase (uint16_t nUser, uint16_t dist, uint16_t tbSize, double refBler, uint16_t toleranceRxPackets);
LenaDataPhyErrorModelTestCase (uint16_t nUser, uint16_t dist, uint16_t tbSize, double refBler, uint16_t toleranceRxPackets, uint32_t rngRun);
virtual ~LenaDataPhyErrorModelTestCase ();
private:
virtual void DoRun (void);
static std::string BuildNameString (uint16_t nUser, uint16_t dist);
static std::string BuildNameString (uint16_t nUser, uint16_t dist, uint32_t rngRun);
uint16_t m_nUser;
uint16_t m_dist;
uint16_t m_tbSize;
double m_blerRef;
uint16_t m_toleranceRxPackets;
uint32_t m_rngRun;
};
@@ -56,18 +57,20 @@ private:
class LenaDlCtrlPhyErrorModelTestCase : public TestCase
{
public:
LenaDlCtrlPhyErrorModelTestCase (uint16_t nEnbr, uint16_t dist, uint16_t tbSize, double refBler);
virtual ~LenaDlCtrlPhyErrorModelTestCase ();
private:
virtual void DoRun (void);
static std::string BuildNameString (uint16_t nUser, uint16_t dist);
uint16_t m_nEnb;
uint16_t m_dist;
uint16_t m_tbSize;
double m_blerRef;
public:
LenaDlCtrlPhyErrorModelTestCase (uint16_t nEnbr, uint16_t dist, uint16_t tbSize, double refBler, uint16_t toleranceRxPackets, uint32_t rngRun);
virtual ~LenaDlCtrlPhyErrorModelTestCase ();
private:
virtual void DoRun (void);
static std::string BuildNameString (uint16_t nUser, uint16_t dist, uint32_t rngRun);
uint16_t m_nEnb;
uint16_t m_dist;
uint16_t m_tbSize;
double m_blerRef;
uint16_t m_toleranceRxPackets;
uint32_t m_rngRun;
};