updated tests for RRC real/ideal: interference antenna mimo harq
This commit is contained in:
@@ -110,6 +110,7 @@ LenaHarqTestCase::DoRun (void)
|
||||
Config::SetDefault ("ns3::LteAmc::AmcModel", EnumValue (LteAmc::PiroEW2010));
|
||||
Config::SetDefault ("ns3::LteSpectrumPhy::CtrlErrorModelEnabled", BooleanValue (false));
|
||||
Config::SetDefault ("ns3::LteSpectrumPhy::DataErrorModelEnabled", BooleanValue (true));
|
||||
Config::SetDefault ("ns3::LteHelper::UseIdealRrc", BooleanValue (true));
|
||||
// Config::SetDefault ("ns3::RrFfMacScheduler::HarqEnabled", BooleanValue (false));
|
||||
// LogComponentEnable ("LteEnbRrc", LOG_LEVEL_ALL);
|
||||
// LogComponentEnable ("LteUeRrc", LOG_LEVEL_ALL);
|
||||
|
||||
@@ -68,8 +68,6 @@ LteTestUlSchedulingCallback (LteInterferenceTestCase *testcase, std::string path
|
||||
LteInterferenceTestSuite::LteInterferenceTestSuite ()
|
||||
: TestSuite ("lte-interference", SYSTEM)
|
||||
{
|
||||
NS_LOG_INFO ("Creating LteInterferenceTestSuite");
|
||||
|
||||
AddTestCase (new LteInterferenceTestCase ("d1=3000, d2=6000", 3000.000000, 6000.000000, 3.844681, 1.714583, 0.761558, 0.389662, 6, 4));
|
||||
AddTestCase (new LteInterferenceTestCase ("d1=50, d2=10", 50.000000, 10.000000, 0.040000, 0.040000, 0.010399, 0.010399, 0, 0));
|
||||
AddTestCase (new LteInterferenceTestCase ("d1=50, d2=20", 50.000000, 20.000000, 0.160000, 0.159998, 0.041154, 0.041153, 0, 0));
|
||||
@@ -114,12 +112,15 @@ LteInterferenceTestCase::~LteInterferenceTestCase ()
|
||||
void
|
||||
LteInterferenceTestCase::DoRun (void)
|
||||
{
|
||||
NS_LOG_INFO (this << GetName ());
|
||||
|
||||
Config::SetDefault ("ns3::LteSpectrumPhy::CtrlErrorModelEnabled", BooleanValue (false));
|
||||
Config::SetDefault ("ns3::LteSpectrumPhy::DataErrorModelEnabled", BooleanValue (false));
|
||||
Config::SetDefault ("ns3::LteAmc::AmcModel", EnumValue (LteAmc::PiroEW2010));
|
||||
Config::SetDefault ("ns3::LteAmc::Ber", DoubleValue (0.00005));
|
||||
Ptr<LteHelper> lteHelper = CreateObject<LteHelper> ();
|
||||
lteHelper->SetAttribute ("PathlossModel", StringValue ("ns3::FriisSpectrumPropagationLossModel"));
|
||||
lteHelper->SetAttribute ("UseIdealRrc", BooleanValue (false));
|
||||
|
||||
// Create Nodes: eNodeB and UE
|
||||
NodeContainer enbNodes;
|
||||
@@ -203,21 +204,25 @@ LteInterferenceTestCase::DoRun (void)
|
||||
MakeBoundCallback (&LteTestUlSchedulingCallback, this));
|
||||
|
||||
// need to allow for RRC connection establishment + SRS
|
||||
Simulator::Stop (Seconds (0.040));
|
||||
Simulator::Stop (Seconds (0.100));
|
||||
Simulator::Run ();
|
||||
|
||||
if (m_dlMcs > 0)
|
||||
{
|
||||
double dlSinr1Db = 10.0 * log10 (testDlSinr1->GetSinr ()->operator[] (0));
|
||||
NS_TEST_ASSERT_MSG_EQ_TOL (dlSinr1Db, m_dlSinrDb, 0.01, "Wrong SINR in DL! (eNB1 --> UE1)");
|
||||
|
||||
double dlSinr1Db = 10.0 * log10 (testDlSinr1->GetSinr ()->operator[] (0));
|
||||
NS_TEST_ASSERT_MSG_EQ_TOL (dlSinr1Db, m_dlSinrDb, 0.01, "Wrong SINR in DL! (eNB1 --> UE1)");
|
||||
|
||||
double ulSinr1Db = 10.0 * log10 (testUlSinr1->GetSinr ()->operator[] (0));
|
||||
NS_TEST_ASSERT_MSG_EQ_TOL (ulSinr1Db, m_ulSinrDb, 0.01, "Wrong SINR in UL! (UE1 --> eNB1)");
|
||||
|
||||
double dlSinr2Db = 10.0 * log10 (testDlSinr2->GetSinr ()->operator[] (0));
|
||||
NS_TEST_ASSERT_MSG_EQ_TOL (dlSinr2Db, m_dlSinrDb, 0.01, "Wrong SINR in DL! (eNB2 --> UE2)");
|
||||
|
||||
double ulSinr2Db = 10.0 * log10 (testUlSinr2->GetSinr ()->operator[] (0));
|
||||
NS_TEST_ASSERT_MSG_EQ_TOL (ulSinr2Db, m_ulSinrDb, 0.01, "Wrong SINR in UL! (UE2 --> eNB2)");
|
||||
double dlSinr2Db = 10.0 * log10 (testDlSinr2->GetSinr ()->operator[] (0));
|
||||
NS_TEST_ASSERT_MSG_EQ_TOL (dlSinr2Db, m_dlSinrDb, 0.01, "Wrong SINR in DL! (eNB2 --> UE2)");
|
||||
}
|
||||
if (m_ulMcs > 0)
|
||||
{
|
||||
double ulSinr1Db = 10.0 * log10 (testUlSinr1->GetSinr ()->operator[] (0));
|
||||
NS_TEST_ASSERT_MSG_EQ_TOL (ulSinr1Db, m_ulSinrDb, 0.01, "Wrong SINR in UL! (UE1 --> eNB1)");
|
||||
|
||||
double ulSinr2Db = 10.0 * log10 (testUlSinr2->GetSinr ()->operator[] (0));
|
||||
NS_TEST_ASSERT_MSG_EQ_TOL (ulSinr2Db, m_ulSinrDb, 0.01, "Wrong SINR in UL! (UE2 --> eNB2)");
|
||||
}
|
||||
|
||||
Simulator::Destroy ();
|
||||
|
||||
@@ -240,7 +245,7 @@ LteInterferenceTestCase::UlScheduling (uint32_t frameNo, uint32_t subframeNo, ui
|
||||
uint8_t mcs, uint16_t sizeTb)
|
||||
{
|
||||
// need to allow for RRC connection establishment + SRS transmission
|
||||
if (Simulator::Now () > MilliSeconds (35))
|
||||
if (Simulator::Now () > MilliSeconds (50))
|
||||
{
|
||||
NS_TEST_ASSERT_MSG_EQ ((uint32_t)mcs, (uint32_t)m_ulMcs, "Wrong UL MCS");
|
||||
}
|
||||
|
||||
@@ -74,8 +74,10 @@ LenaTestMimoSuite::LenaTestMimoSuite ()
|
||||
estThrDl.push_back (119100); // TTI 1 estimated throughput for TxMode 1
|
||||
estThrDl.push_back (183600); // TTI 2 estimated throughput for TxMode 2
|
||||
estThrDl.push_back (193400); // TTI 3 estimated throughput for TxMode 3
|
||||
AddTestCase (new LenaMimoTestCase(300, estThrDl, "ns3::RrFfMacScheduler"));
|
||||
AddTestCase (new LenaMimoTestCase(300, estThrDl, "ns3::PfFfMacScheduler"));
|
||||
AddTestCase (new LenaMimoTestCase(300, estThrDl, "ns3::RrFfMacScheduler", true));
|
||||
AddTestCase (new LenaMimoTestCase(300, estThrDl, "ns3::PfFfMacScheduler", true));
|
||||
AddTestCase (new LenaMimoTestCase(300, estThrDl, "ns3::RrFfMacScheduler", false));
|
||||
AddTestCase (new LenaMimoTestCase(300, estThrDl, "ns3::PfFfMacScheduler", false));
|
||||
|
||||
|
||||
}
|
||||
@@ -83,18 +85,27 @@ LenaTestMimoSuite::LenaTestMimoSuite ()
|
||||
static LenaTestMimoSuite lenaTestMimoSuite;
|
||||
|
||||
std::string
|
||||
LenaMimoTestCase::BuildNameString (uint16_t dist, std::string schedulerType)
|
||||
LenaMimoTestCase::BuildNameString (uint16_t dist, std::string schedulerType, bool useIdealRrc)
|
||||
{
|
||||
std::ostringstream oss;
|
||||
oss << " UE distance " << dist << " m" << " Scheduler " << schedulerType;
|
||||
if (useIdealRrc)
|
||||
{
|
||||
oss << ", ideal RRC";
|
||||
}
|
||||
else
|
||||
{
|
||||
oss << ", real RRC";
|
||||
}
|
||||
return oss.str ();
|
||||
}
|
||||
|
||||
LenaMimoTestCase::LenaMimoTestCase (uint16_t dist, std::vector<uint32_t> estThrDl, std::string schedulerType)
|
||||
: TestCase (BuildNameString (dist, schedulerType)),
|
||||
LenaMimoTestCase::LenaMimoTestCase (uint16_t dist, std::vector<uint32_t> estThrDl, std::string schedulerType, bool useIdealRrc)
|
||||
: TestCase (BuildNameString (dist, schedulerType, useIdealRrc)),
|
||||
m_dist (dist),
|
||||
m_estThrDl (estThrDl),
|
||||
m_schedulerType (schedulerType)
|
||||
m_schedulerType (schedulerType),
|
||||
m_useIdealRrc (useIdealRrc)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -105,9 +116,10 @@ LenaMimoTestCase::~LenaMimoTestCase ()
|
||||
void
|
||||
LenaMimoTestCase::DoRun (void)
|
||||
{
|
||||
NS_LOG_FUNCTION (this << GetName ());
|
||||
Config::SetDefault ("ns3::LteSpectrumPhy::DataErrorModelEnabled", BooleanValue (false));
|
||||
Config::SetDefault ("ns3::LteAmc::AmcModel", EnumValue (LteAmc::PiroEW2010));
|
||||
|
||||
Config::SetDefault ("ns3::LteHelper::UseIdealRrc", BooleanValue (m_useIdealRrc));
|
||||
|
||||
/**
|
||||
* Initialize Simulation Scenario: 1 eNB and m_nUser UEs
|
||||
|
||||
@@ -34,7 +34,7 @@ namespace ns3 {
|
||||
class LenaMimoTestCase : public TestCase
|
||||
{
|
||||
public:
|
||||
LenaMimoTestCase (uint16_t dist, std::vector<uint32_t> estThrDl, std::string schedulerType);
|
||||
LenaMimoTestCase (uint16_t dist, std::vector<uint32_t> estThrDl, std::string schedulerType, bool useIdealRrc);
|
||||
virtual ~LenaMimoTestCase ();
|
||||
|
||||
private:
|
||||
@@ -42,12 +42,13 @@ private:
|
||||
|
||||
void GetRlcBufferSample (Ptr<RadioBearerStatsCalculator> rlcStats, uint64_t imsi, uint8_t rnti);
|
||||
|
||||
static std::string BuildNameString (uint16_t dist, std::string schedulerType);
|
||||
static std::string BuildNameString (uint16_t dist, std::string schedulerType, bool useIdealRrc);
|
||||
uint16_t m_nUser;
|
||||
uint16_t m_nLc;
|
||||
uint16_t m_dist;
|
||||
std::vector<uint32_t> m_estThrDl;
|
||||
std::string m_schedulerType;
|
||||
bool m_useIdealRrc;
|
||||
|
||||
std::vector <uint64_t> m_dlDataRxed;
|
||||
|
||||
|
||||
@@ -35,6 +35,8 @@
|
||||
#include "ns3/lte-enb-net-device.h"
|
||||
#include "ns3/ff-mac-scheduler.h"
|
||||
|
||||
#include "ns3/lte-global-pathloss-database.h"
|
||||
|
||||
#include "lte-test-sinr-chunk-processor.h"
|
||||
|
||||
NS_LOG_COMPONENT_DEFINE ("LteAntennaTest");
|
||||
@@ -149,34 +151,60 @@ LteEnbAntennaTestCase::DoRun (void)
|
||||
enbphy->GetUplinkSpectrumPhy ()->AddDataSinrChunkProcessor (testUlSinr);
|
||||
|
||||
|
||||
// keep track of all path loss values in two centralized objects
|
||||
DownlinkLteGlobalPathlossDatabase dlPathlossDb;
|
||||
UplinkLteGlobalPathlossDatabase ulPathlossDb;
|
||||
// we rely on the fact that LteHelper creates the DL channel object first, then the UL channel object,
|
||||
// hence the former will have index 0 and the latter 1
|
||||
Config::Connect ("/ChannelList/0/PathLoss",
|
||||
MakeCallback (&DownlinkLteGlobalPathlossDatabase::UpdatePathloss, &dlPathlossDb));
|
||||
Config::Connect ("/ChannelList/1/PathLoss",
|
||||
MakeCallback (&UplinkLteGlobalPathlossDatabase::UpdatePathloss, &ulPathlossDb));
|
||||
|
||||
Simulator::Stop (Seconds (0.035));
|
||||
Simulator::Run ();
|
||||
|
||||
|
||||
const double enbTxPowerDbm = 30; // default eNB TX power over whole bandwdith
|
||||
const double ueTxPowerDbm = 10; // default UE TX power over whole bandwdith
|
||||
const double ktDbm = -174; // reference LTE noise PSD
|
||||
const double noisePowerDbm = ktDbm + 10 * log10 (25 * 180000); // corresponds to kT*bandwidth in linear units
|
||||
const double ueNoiseFigureDb = 9.0; // default UE noise figure
|
||||
const double enbNoiseFigureDb = 5.0; // default eNB noise figure
|
||||
|
||||
double calculatedSinrDbDl = -INFINITY;
|
||||
if (testDlSinr->GetSinr () != 0)
|
||||
{
|
||||
calculatedSinrDbDl = 10.0 * log10 (testDlSinr->GetSinr ()->operator[] (0));
|
||||
}
|
||||
double calculatedSinrDbUl = -INFINITY;
|
||||
if (testUlSinr->GetSinr () != 0)
|
||||
{
|
||||
calculatedSinrDbUl = 10.0 * log10 (testUlSinr->GetSinr ()->operator[] (0));
|
||||
}
|
||||
|
||||
// remember that propagation loss is 0dB
|
||||
double calculatedAntennaGainDbDl = - (enbTxPowerDbm - calculatedSinrDbDl - noisePowerDbm - ueNoiseFigureDb);
|
||||
double calculatedAntennaGainDbUl = - (ueTxPowerDbm - calculatedSinrDbUl - noisePowerDbm - enbNoiseFigureDb);
|
||||
double tolerance = (m_antennaGainDb != 0) ? abs (m_antennaGainDb)*0.001 : 0.001;
|
||||
NS_TEST_ASSERT_MSG_EQ_TOL (calculatedAntennaGainDbDl, m_antennaGainDb, tolerance, "Wrong DL antenna gain!");
|
||||
NS_TEST_ASSERT_MSG_EQ_TOL (calculatedAntennaGainDbUl, m_antennaGainDb, tolerance, "Wrong UL antenna gain!");
|
||||
|
||||
// first test with SINR from LteTestSinrChunkProcessor
|
||||
// this can only be done for not-too-bad SINR otherwise the measurement won't be available
|
||||
double expectedSinrDl = enbTxPowerDbm + m_antennaGainDb - noisePowerDbm + ueNoiseFigureDb;
|
||||
if (expectedSinrDl > 0)
|
||||
{
|
||||
double calculatedSinrDbDl = -INFINITY;
|
||||
if (testDlSinr->GetSinr () != 0)
|
||||
{
|
||||
calculatedSinrDbDl = 10.0 * log10 (testDlSinr->GetSinr ()->operator[] (0));
|
||||
}
|
||||
// remember that propagation loss is 0dB
|
||||
double calculatedAntennaGainDbDl = - (enbTxPowerDbm - calculatedSinrDbDl - noisePowerDbm - ueNoiseFigureDb);
|
||||
NS_TEST_ASSERT_MSG_EQ_TOL (calculatedAntennaGainDbDl, m_antennaGainDb, tolerance, "Wrong DL antenna gain!");
|
||||
}
|
||||
double expectedSinrUl = ueTxPowerDbm + m_antennaGainDb - noisePowerDbm + enbNoiseFigureDb;
|
||||
if (expectedSinrUl > 0)
|
||||
{
|
||||
double calculatedSinrDbUl = -INFINITY;
|
||||
if (testUlSinr->GetSinr () != 0)
|
||||
{
|
||||
calculatedSinrDbUl = 10.0 * log10 (testUlSinr->GetSinr ()->operator[] (0));
|
||||
}
|
||||
double calculatedAntennaGainDbUl = - (ueTxPowerDbm - calculatedSinrDbUl - noisePowerDbm - enbNoiseFigureDb);
|
||||
NS_TEST_ASSERT_MSG_EQ_TOL (calculatedAntennaGainDbUl, m_antennaGainDb, tolerance, "Wrong UL antenna gain!");
|
||||
}
|
||||
|
||||
|
||||
// repeat the same tests with the LteGlobalPathlossDatabases
|
||||
double measuredLossDl = dlPathlossDb.GetPathloss (1, 1);
|
||||
NS_TEST_ASSERT_MSG_EQ_TOL (measuredLossDl, -m_antennaGainDb, tolerance, "Wrong DL loss!");
|
||||
double measuredLossUl = ulPathlossDb.GetPathloss (1, 1);
|
||||
NS_TEST_ASSERT_MSG_EQ_TOL (measuredLossUl, -m_antennaGainDb, tolerance, "Wrong UL loss!");
|
||||
|
||||
|
||||
Simulator::Destroy ();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user