merge
This commit is contained in:
@@ -26,6 +26,7 @@
|
||||
#include "ns3/lte-module.h"
|
||||
#include "ns3/config-store.h"
|
||||
#include "ns3/radio-bearer-stats-calculator.h"
|
||||
#include "ns3/lte-global-pathloss-database.h"
|
||||
|
||||
#include <iomanip>
|
||||
#include <string>
|
||||
@@ -35,97 +36,9 @@
|
||||
using namespace ns3;
|
||||
|
||||
|
||||
NS_LOG_COMPONENT_DEFINE ("InterCellInterference");
|
||||
NS_LOG_COMPONENT_DEFINE ("LenaPathlossTraces");
|
||||
|
||||
|
||||
/**
|
||||
* Store the last pathloss value for each TX-RX pair. This is an
|
||||
* example of how the PathlossTrace (provided by some SpectrumChannel
|
||||
* implementations) work.
|
||||
*
|
||||
*/
|
||||
class GlobalPathlossDatabase
|
||||
{
|
||||
public:
|
||||
|
||||
/**
|
||||
* update the pathloss value
|
||||
*
|
||||
* \param context
|
||||
* \param txPhy the transmitting PHY
|
||||
* \param rxPhy the receiving PHY
|
||||
* \param lossDb the loss in dB
|
||||
*/
|
||||
virtual void UpdatePathloss (std::string context, Ptr<SpectrumPhy> txPhy, Ptr<SpectrumPhy> rxPhy, double lossDb) = 0;
|
||||
|
||||
/**
|
||||
* print the stored pathloss values to standard output
|
||||
*
|
||||
*/
|
||||
void Print ();
|
||||
|
||||
protected:
|
||||
|
||||
// CELL ID IMSI PATHLOSS
|
||||
std::map<uint16_t, std::map<uint64_t, double> > m_pathlossMap;
|
||||
};
|
||||
|
||||
void
|
||||
GlobalPathlossDatabase::Print ()
|
||||
{
|
||||
NS_LOG_FUNCTION (this);
|
||||
for (std::map<uint16_t, std::map<uint64_t, double> >::const_iterator cellIdIt = m_pathlossMap.begin ();
|
||||
cellIdIt != m_pathlossMap.end ();
|
||||
++cellIdIt)
|
||||
{
|
||||
for (std::map<uint64_t, double>::const_iterator imsiIt = cellIdIt->second.begin ();
|
||||
imsiIt != cellIdIt->second.end ();
|
||||
++imsiIt)
|
||||
{
|
||||
std::cout << "CellId: " << cellIdIt->first << " IMSI: " << imsiIt->first << " pathloss: " << imsiIt->second << " dB" << std::endl;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class DownlinkGlobalPathlossDatabase : public GlobalPathlossDatabase
|
||||
{
|
||||
public:
|
||||
// inherited from GlobalPathlossDatabase
|
||||
virtual void UpdatePathloss (std::string context, Ptr<SpectrumPhy> txPhy, Ptr<SpectrumPhy> rxPhy, double lossDb);
|
||||
};
|
||||
|
||||
void
|
||||
DownlinkGlobalPathlossDatabase::UpdatePathloss (std::string context,
|
||||
Ptr<SpectrumPhy> txPhy,
|
||||
Ptr<SpectrumPhy> rxPhy,
|
||||
double lossDb)
|
||||
{
|
||||
NS_LOG_FUNCTION (this << lossDb);
|
||||
uint16_t cellId = txPhy->GetDevice ()->GetObject<LteEnbNetDevice> ()->GetCellId ();
|
||||
uint16_t imsi = rxPhy->GetDevice ()->GetObject<LteUeNetDevice> ()->GetImsi ();
|
||||
m_pathlossMap[cellId][imsi] = lossDb;
|
||||
}
|
||||
|
||||
|
||||
class UplinkGlobalPathlossDatabase : public GlobalPathlossDatabase
|
||||
{
|
||||
public:
|
||||
// inherited from GlobalPathlossDatabase
|
||||
virtual void UpdatePathloss (std::string context, Ptr<SpectrumPhy> txPhy, Ptr<SpectrumPhy> rxPhy, double lossDb);
|
||||
};
|
||||
|
||||
void
|
||||
UplinkGlobalPathlossDatabase::UpdatePathloss (std::string context,
|
||||
Ptr<SpectrumPhy> txPhy,
|
||||
Ptr<SpectrumPhy> rxPhy,
|
||||
double lossDb)
|
||||
{
|
||||
NS_LOG_FUNCTION (this << lossDb);
|
||||
uint16_t imsi = txPhy->GetDevice ()->GetObject<LteUeNetDevice> ()->GetImsi ();
|
||||
uint16_t cellId = rxPhy->GetDevice ()->GetObject<LteEnbNetDevice> ()->GetCellId ();
|
||||
m_pathlossMap[cellId][imsi] = lossDb;
|
||||
}
|
||||
|
||||
|
||||
int main (int argc, char *argv[])
|
||||
{
|
||||
@@ -242,15 +155,15 @@ int main (int argc, char *argv[])
|
||||
|
||||
|
||||
|
||||
// keep track of all path loss values in a global object
|
||||
DownlinkGlobalPathlossDatabase dlPathlossDb;
|
||||
UplinkGlobalPathlossDatabase ulPathlossDb;
|
||||
// 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 (&DownlinkGlobalPathlossDatabase::UpdatePathloss, &dlPathlossDb));
|
||||
MakeCallback (&DownlinkLteGlobalPathlossDatabase::UpdatePathloss, &dlPathlossDb));
|
||||
Config::Connect ("/ChannelList/1/PathLoss",
|
||||
MakeCallback (&UplinkGlobalPathlossDatabase::UpdatePathloss, &ulPathlossDb));
|
||||
MakeCallback (&UplinkLteGlobalPathlossDatabase::UpdatePathloss, &ulPathlossDb));
|
||||
|
||||
Simulator::Run ();
|
||||
|
||||
|
||||
98
src/lte/helper/lte-global-pathloss-database.cc
Normal file
98
src/lte/helper/lte-global-pathloss-database.cc
Normal file
@@ -0,0 +1,98 @@
|
||||
/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
|
||||
/*
|
||||
* Copyright (c) 2011,2012 Centre Tecnologic de Telecomunicacions de Catalunya (CTTC)
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation;
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
* Author: Nicola Baldo <nbaldo@cttc.es>
|
||||
*/
|
||||
|
||||
|
||||
#include "lte-global-pathloss-database.h"
|
||||
#include "ns3/lte-enb-net-device.h"
|
||||
#include "ns3/lte-ue-net-device.h"
|
||||
#include "ns3/lte-spectrum-phy.h"
|
||||
|
||||
#include <limits>
|
||||
|
||||
namespace ns3 {
|
||||
|
||||
NS_LOG_COMPONENT_DEFINE ("LteGlobalPathlossDatabase");
|
||||
|
||||
|
||||
|
||||
void
|
||||
LteGlobalPathlossDatabase::Print ()
|
||||
{
|
||||
NS_LOG_FUNCTION (this);
|
||||
for (std::map<uint16_t, std::map<uint64_t, double> >::const_iterator cellIdIt = m_pathlossMap.begin ();
|
||||
cellIdIt != m_pathlossMap.end ();
|
||||
++cellIdIt)
|
||||
{
|
||||
for (std::map<uint64_t, double>::const_iterator imsiIt = cellIdIt->second.begin ();
|
||||
imsiIt != cellIdIt->second.end ();
|
||||
++imsiIt)
|
||||
{
|
||||
std::cout << "CellId: " << cellIdIt->first << " IMSI: " << imsiIt->first << " pathloss: " << imsiIt->second << " dB" << std::endl;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
double
|
||||
LteGlobalPathlossDatabase::GetPathloss (uint16_t cellId, uint64_t imsi)
|
||||
{
|
||||
NS_LOG_FUNCTION (this);
|
||||
std::map<uint16_t, std::map<uint64_t, double> >::iterator cellIt = m_pathlossMap.find (cellId);
|
||||
if (cellIt == m_pathlossMap.end())
|
||||
{
|
||||
return std::numeric_limits<double>::infinity ();
|
||||
}
|
||||
std::map<uint64_t, double>::iterator ueIt = cellIt->second.find (imsi);
|
||||
if (ueIt == cellIt->second.end())
|
||||
{
|
||||
return std::numeric_limits<double>::infinity ();
|
||||
}
|
||||
return ueIt->second;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
DownlinkLteGlobalPathlossDatabase::UpdatePathloss (std::string context,
|
||||
Ptr<SpectrumPhy> txPhy,
|
||||
Ptr<SpectrumPhy> rxPhy,
|
||||
double lossDb)
|
||||
{
|
||||
NS_LOG_FUNCTION (this << lossDb);
|
||||
uint16_t cellId = txPhy->GetDevice ()->GetObject<LteEnbNetDevice> ()->GetCellId ();
|
||||
uint16_t imsi = rxPhy->GetDevice ()->GetObject<LteUeNetDevice> ()->GetImsi ();
|
||||
m_pathlossMap[cellId][imsi] = lossDb;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
UplinkLteGlobalPathlossDatabase::UpdatePathloss (std::string context,
|
||||
Ptr<SpectrumPhy> txPhy,
|
||||
Ptr<SpectrumPhy> rxPhy,
|
||||
double lossDb)
|
||||
{
|
||||
NS_LOG_FUNCTION (this << lossDb);
|
||||
uint16_t imsi = txPhy->GetDevice ()->GetObject<LteUeNetDevice> ()->GetImsi ();
|
||||
uint16_t cellId = rxPhy->GetDevice ()->GetObject<LteEnbNetDevice> ()->GetCellId ();
|
||||
m_pathlossMap[cellId][imsi] = lossDb;
|
||||
}
|
||||
|
||||
|
||||
|
||||
} // namespace ns3
|
||||
98
src/lte/helper/lte-global-pathloss-database.h
Normal file
98
src/lte/helper/lte-global-pathloss-database.h
Normal file
@@ -0,0 +1,98 @@
|
||||
/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
|
||||
/*
|
||||
* Copyright (c) 2011,2012 Centre Tecnologic de Telecomunicacions de Catalunya (CTTC)
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation;
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
* Author: Nicola Baldo <nbaldo@cttc.es>
|
||||
*/
|
||||
|
||||
|
||||
#ifndef LTE_GLOBAL_PATHLOSS_DATABASE_H
|
||||
#define LTE_GLOBAL_PATHLOSS_DATABASE_H
|
||||
|
||||
#include <ns3/log.h>
|
||||
#include <ns3/ptr.h>
|
||||
#include <string>
|
||||
#include <map>
|
||||
|
||||
namespace ns3 {
|
||||
|
||||
class SpectrumPhy;
|
||||
|
||||
/**
|
||||
* Store the last pathloss value for each TX-RX pair. This is an
|
||||
* example of how the PathlossTrace (provided by some SpectrumChannel
|
||||
* implementations) work.
|
||||
*
|
||||
*/
|
||||
class LteGlobalPathlossDatabase
|
||||
{
|
||||
public:
|
||||
|
||||
/**
|
||||
* update the pathloss value
|
||||
*
|
||||
* \param context
|
||||
* \param txPhy the transmitting PHY
|
||||
* \param rxPhy the receiving PHY
|
||||
* \param lossDb the loss in dB
|
||||
*/
|
||||
virtual void UpdatePathloss (std::string context, Ptr<SpectrumPhy> txPhy, Ptr<SpectrumPhy> rxPhy, double lossDb) = 0;
|
||||
|
||||
/**
|
||||
*
|
||||
*
|
||||
* \param cellId the id of the eNB
|
||||
* \param imsi the id of the UE
|
||||
*
|
||||
* \return the pathloss value bewteen the UE and the eNB
|
||||
*/
|
||||
double GetPathloss (uint16_t cellId, uint64_t imsi);
|
||||
|
||||
/**
|
||||
* print the stored pathloss values to standard output
|
||||
*
|
||||
*/
|
||||
void Print ();
|
||||
|
||||
protected:
|
||||
|
||||
// CELL ID IMSI PATHLOSS
|
||||
std::map<uint16_t, std::map<uint64_t, double> > m_pathlossMap;
|
||||
};
|
||||
|
||||
|
||||
class DownlinkLteGlobalPathlossDatabase : public LteGlobalPathlossDatabase
|
||||
{
|
||||
public:
|
||||
// inherited from LteGlobalPathlossDatabase
|
||||
virtual void UpdatePathloss (std::string context, Ptr<SpectrumPhy> txPhy, Ptr<SpectrumPhy> rxPhy, double lossDb);
|
||||
};
|
||||
|
||||
|
||||
class UplinkLteGlobalPathlossDatabase : public LteGlobalPathlossDatabase
|
||||
{
|
||||
public:
|
||||
// inherited from LteGlobalPathlossDatabase
|
||||
virtual void UpdatePathloss (std::string context, Ptr<SpectrumPhy> txPhy, Ptr<SpectrumPhy> rxPhy, double lossDb);
|
||||
};
|
||||
|
||||
|
||||
} // namespace ns3
|
||||
|
||||
|
||||
|
||||
|
||||
#endif // LTE_GLOBAL_PATHLOSS_DATABASE_H
|
||||
@@ -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 ();
|
||||
}
|
||||
|
||||
@@ -47,6 +47,7 @@ def build(bld):
|
||||
'helper/phy-rx-stats-calculator.cc',
|
||||
'helper/radio-environment-map-helper.cc',
|
||||
'helper/lte-hex-grid-enb-topology-helper.cc',
|
||||
'helper/lte-global-pathloss-database.cc',
|
||||
'model/rem-spectrum-phy.cc',
|
||||
'model/ff-mac-common.cc',
|
||||
'model/ff-mac-csched-sap.cc',
|
||||
@@ -170,6 +171,7 @@ def build(bld):
|
||||
'helper/radio-bearer-stats-connector.h',
|
||||
'helper/radio-environment-map-helper.h',
|
||||
'helper/lte-hex-grid-enb-topology-helper.h',
|
||||
'helper/lte-global-pathloss-database.h',
|
||||
'model/rem-spectrum-phy.h',
|
||||
'model/ff-mac-common.h',
|
||||
'model/ff-mac-csched-sap.h',
|
||||
|
||||
Reference in New Issue
Block a user