From 5da3f6b44b5331cd9c02231ce47f55ca5814726e Mon Sep 17 00:00:00 2001 From: Nicola Baldo Date: Mon, 16 Jan 2012 19:54:48 +0100 Subject: [PATCH] added support to generate Radio Environment Maps --- src/lte/doc/source/lte-user.rst | 48 +++++ src/lte/examples/lena-rem.cc | 121 +++++++++++ src/lte/examples/wscript | 4 +- .../helper/radio-environment-map-helper.cc | 203 ++++++++++++++++++ src/lte/helper/radio-environment-map-helper.h | 91 ++++++++ src/lte/model/rem-spectrum-phy.cc | 159 ++++++++++++++ src/lte/model/rem-spectrum-phy.h | 105 +++++++++ src/lte/wscript | 4 + 8 files changed, 734 insertions(+), 1 deletion(-) create mode 100644 src/lte/examples/lena-rem.cc create mode 100644 src/lte/helper/radio-environment-map-helper.cc create mode 100644 src/lte/helper/radio-environment-map-helper.h create mode 100644 src/lte/model/rem-spectrum-phy.cc create mode 100644 src/lte/model/rem-spectrum-phy.h diff --git a/src/lte/doc/source/lte-user.rst b/src/lte/doc/source/lte-user.rst index b5f49aeea..929652af3 100644 --- a/src/lte/doc/source/lte-user.rst +++ b/src/lte/doc/source/lte-user.rst @@ -469,6 +469,54 @@ placed at the same position, and to configure separate ``EnbNetDevice`` with different antenna orientations to be installed on each node. +Radio Environment Maps +---------------------- + +By using the class RadioEnvironmentMapHelper it is possible to output +to a file a Radio Environment Map (REM), i.e., a uniform 2D grid of values +that represent the Signal-to-noise ratio in the downlink with respect +to the eNB that has the strongest signal at each point. + +To do this, you just need to add the following code to your simulation +program towards the end, right before the call to Simulator::Run ():: + + Ptr remHelper = CreateObject (); + remHelper->SetAttribute ("ChannelPath", StringValue ("/ChannelList/0")); + remHelper->SetAttribute ("OutputFile", StringValue ("rem.out")); + remHelper->SetAttribute ("XMin", DoubleValue (-400.0)); + remHelper->SetAttribute ("XMax", DoubleValue (400.0)); + remHelper->SetAttribute ("XRes", UintegerValue (100)); + remHelper->SetAttribute ("YMin", DoubleValue (-300.0)); + remHelper->SetAttribute ("YMax", DoubleValue (300.0)); + remHelper->SetAttribute ("YRes", UintegerValue (75)); + remHelper->SetAttribute ("Z", DoubleValue (0.0)); + remHelper->Install (); + +By configuring the attributes of the RadioEnvironmentMapHelper object +as shown above, you can tune the parameters of the REM to be +generated. Note that each RadioEnvironmentMapHelper instance can +generate only one REM; if you want to generate more REMs, you need to +create one separate instance for each REM. + +The REM is stored in an ASCII file in the following format: + + * column 1 is the x coordinate + * column 2 is the y coordinate + * column 3 is the z coordinate + * column 4 is the SINR in linear units + +A minimal gnuplot script that allows you to plot the REM is given +below:: + + set view map; + set xlabel "X" + set ylabel "Y" + set cblabel "SINR (dB)" + plot "rem.out" using ($1):($2):(10*log10($4)) with image + + + + Evolved Packet Core (EPC) ------------------------- diff --git a/src/lte/examples/lena-rem.cc b/src/lte/examples/lena-rem.cc new file mode 100644 index 000000000..5cb00aa0c --- /dev/null +++ b/src/lte/examples/lena-rem.cc @@ -0,0 +1,121 @@ +/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */ +/* + * Copyright (c) 2011 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: Manuel Requena + * Nicola Baldo + */ + + +#include "ns3/core-module.h" +#include "ns3/network-module.h" +#include "ns3/mobility-module.h" +#include "ns3/lte-module.h" +#include "ns3/config-store.h" +#include "ns3/spectrum-module.h" +//#include "ns3/gtk-config-store.h" + +using namespace ns3; + +int main (int argc, char *argv[]) +{ + CommandLine cmd; + cmd.Parse (argc, argv); + + // to save a template default attribute file run it like this: + // ./waf --command-template="%s --ns3::ConfigStore::Filename=input-defaults.txt --ns3::ConfigStore::Mode=Save --ns3::ConfigStore::FileFormat=RawText" --run src/lte/examples/lena-first-sim + // + // to load a previously created default attribute file + // ./waf --command-template="%s --ns3::ConfigStore::Filename=input-defaults.txt --ns3::ConfigStore::Mode=Load --ns3::ConfigStore::FileFormat=RawText" --run src/lte/examples/lena-first-sim + + ConfigStore inputConfig; + inputConfig.ConfigureDefaults (); + + // Parse again so you can override default values from the command line + cmd.Parse (argc, argv); + + Ptr lteHelper = CreateObject (); + + // Uncomment to enable logging + //lteHelper->EnableLogComponents (); + + // Create Nodes: eNodeB and UE + NodeContainer enbNodes; + NodeContainer ueNodes; + enbNodes.Create (1); + ueNodes.Create (1); + + // Install Mobility Model + MobilityHelper mobility; + mobility.SetMobilityModel ("ns3::BuildingsMobilityModel"); + mobility.Install (enbNodes); + mobility.SetMobilityModel ("ns3::BuildingsMobilityModel"); + mobility.Install (ueNodes); + + // Create Devices and install them in the Nodes (eNB and UE) + NetDeviceContainer enbDevs; + NetDeviceContainer ueDevs; + // Default scheduler is PF, uncomment to use RR + //lteHelper->SetSchedulerType ("ns3::RrFfMacScheduler"); + + enbDevs = lteHelper->InstallEnbDevice (enbNodes); + ueDevs = lteHelper->InstallUeDevice (ueNodes); + + // Attach a UE to a eNB + lteHelper->Attach (ueDevs, enbDevs.Get (0)); + + // Activate an EPS bearer + enum EpsBearer::Qci q = EpsBearer::GBR_CONV_VOICE; + EpsBearer bearer (q); + lteHelper->ActivateEpsBearer (ueDevs, bearer, EpcTft::Default ()); + + + // Configure Radio Environment Map (REM) output + // for LTE-only simulations always use /ChannelList/0 which is the downlink channel + Ptr remHelper = CreateObject (); + remHelper->SetAttribute ("ChannelPath", StringValue ("/ChannelList/0")); + remHelper->SetAttribute ("OutputFile", StringValue ("rem.out")); + remHelper->SetAttribute ("XMin", DoubleValue (-400.0)); + remHelper->SetAttribute ("XMax", DoubleValue (400.0)); + remHelper->SetAttribute ("XRes", UintegerValue (100)); + remHelper->SetAttribute ("YMin", DoubleValue (-300.0)); + remHelper->SetAttribute ("YMax", DoubleValue (300.0)); + remHelper->SetAttribute ("YRes", UintegerValue (75)); + remHelper->SetAttribute ("Z", DoubleValue (0.0)); + remHelper->Install (); + + // here's a minimal gnuplot script that will plot the above: + // + // set view map; + // set term x11; + // set xlabel "X" + // set ylabel "Y" + // set cblabel "SINR (dB)" + // plot "rem.out" using ($1):($2):(10*log10($4)) with image + + + + + Simulator::Stop (Seconds (0.020)); + + Simulator::Run (); + + //GtkConfigStore config; + //config.ConfigureAttributes (); + + Simulator::Destroy (); + return 0; +} diff --git a/src/lte/examples/wscript b/src/lte/examples/wscript index 1d73a54d5..60f18a978 100644 --- a/src/lte/examples/wscript +++ b/src/lte/examples/wscript @@ -28,4 +28,6 @@ def build(bld): obj = bld.create_ns3_program('lena-simple-epc', ['lte']) obj.source = 'lena-simple-epc.cc' - + obj = bld.create_ns3_program('lena-rem', + ['lte']) + obj.source = 'lena-rem.cc' diff --git a/src/lte/helper/radio-environment-map-helper.cc b/src/lte/helper/radio-environment-map-helper.cc new file mode 100644 index 000000000..4be4b31d8 --- /dev/null +++ b/src/lte/helper/radio-environment-map-helper.cc @@ -0,0 +1,203 @@ +/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */ +/* + * Copyright (c) 2012 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 + */ + + +#include "radio-environment-map-helper.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + + +NS_LOG_COMPONENT_DEFINE ("RadioEnvironmentMapHelper"); + +namespace ns3 { + + + +NS_OBJECT_ENSURE_REGISTERED (RadioEnvironmentMapHelper); + +RadioEnvironmentMapHelper::RadioEnvironmentMapHelper () +{ +} + + +RadioEnvironmentMapHelper::~RadioEnvironmentMapHelper () +{ +} + + + +void +RadioEnvironmentMapHelper::DoDispose () +{ + NS_LOG_FUNCTION (this); +} + +TypeId +RadioEnvironmentMapHelper::GetTypeId (void) +{ + NS_LOG_FUNCTION ("RadioEnvironmentMapHelper::GetTypeId"); + static TypeId tid = TypeId ("ns3::RadioEnvironmentMapHelper") + .SetParent () + .AddConstructor () + .AddAttribute ("ChannelPath", "The path to the channel for which the Radio Environment Map is to be generated", + StringValue ("/ChannelList/0"), + MakeStringAccessor (&RadioEnvironmentMapHelper::m_channelPath), + MakeStringChecker ()) + .AddAttribute ("OutputFile", "the filename to which the Radio Environment Map is saved", + StringValue ("rem.out"), + MakeStringAccessor (&RadioEnvironmentMapHelper::m_outputFile), + MakeStringChecker ()) + .AddAttribute ("XMin", "The min x coordinate of the map.", + DoubleValue (0.0), + MakeDoubleAccessor (&RadioEnvironmentMapHelper::m_xMin), + MakeDoubleChecker ()) + .AddAttribute ("YMin", "The min y coordinate of the map.", + DoubleValue (0.0), + MakeDoubleAccessor (&RadioEnvironmentMapHelper::m_yMin), + MakeDoubleChecker ()) + .AddAttribute ("XMax", "The max x coordinate of the map.", + DoubleValue (1.0), + MakeDoubleAccessor (&RadioEnvironmentMapHelper::m_xMax), + MakeDoubleChecker ()) + .AddAttribute ("YMax", "The max y coordinate of the map.", + DoubleValue (1.0), + MakeDoubleAccessor (&RadioEnvironmentMapHelper::m_yMax), + MakeDoubleChecker ()) + .AddAttribute ("XRes", "The resolution (number of points) of the map along the x axis.", + UintegerValue (100), + MakeUintegerAccessor (&RadioEnvironmentMapHelper::m_xRes), + MakeUintegerChecker ()) + .AddAttribute ("YRes", "The resolution (number of points) of the map along the y axis.", + UintegerValue (100), + MakeUintegerAccessor (&RadioEnvironmentMapHelper::m_yRes), + MakeUintegerChecker ()) + .AddAttribute ("Z", "The value of the z coordinate for which the map is to be generated", + DoubleValue (0.0), + MakeDoubleAccessor (&RadioEnvironmentMapHelper::m_z), + MakeDoubleChecker ()) + + ; + return tid; +} + + + + +void +RadioEnvironmentMapHelper::Install () +{ + NS_LOG_FUNCTION (this); + if (!m_rem.empty ()) + { + NS_FATAL_ERROR ("only one REM supported per instance of RadioEnvironmentMapHelper"); + } + Config::MatchContainer match = Config::LookupMatches (m_channelPath); + if (match.GetN () != 1) + { + NS_FATAL_ERROR ("Lookup " << m_channelPath << " should have exactly one match"); + } + m_channel = match.Get (0)->GetObject (); + NS_ABORT_MSG_IF (m_channel == 0, "object at " << m_channelPath << "is not of type SpectrumChannel"); + + double xStep = (m_xMax - m_xMin)/m_xRes; + double yStep = (m_yMax - m_yMin)/m_yRes; + + for (double x = m_xMin; x <= m_xMax ; x += xStep) + { + m_rem.push_back (std::list ()); + for (double y = m_yMin; y <= m_yMax ; y += yStep) + { + RemPoint p; + p.phy = CreateObject (); + p.bmm = CreateObject (); + p.phy->SetMobility (p.bmm); + p.bmm->SetPosition (Vector (x, y, m_z)); + m_rem.back ().push_back (p); + } + } + Simulator::Schedule (Seconds (0.0055), &RadioEnvironmentMapHelper::Connect, this); + Simulator::Schedule (Seconds (0.0065), &RadioEnvironmentMapHelper::PrintAndDisconnect, this); + +} + +void +RadioEnvironmentMapHelper::Connect () +{ + NS_LOG_FUNCTION (this); + for (std::list >::iterator it1 = m_rem.begin (); + it1 != m_rem.end (); + ++it1) + { + for (std::list::iterator it2 = it1->begin (); + it2 != it1->end (); + ++it2) + { + NS_LOG_LOGIC ("adding phy " << it2->phy); + m_channel->AddRx (it2->phy); + } + } +} + +void +RadioEnvironmentMapHelper::PrintAndDisconnect () +{ + NS_LOG_FUNCTION (this); + std::ofstream outFile; + outFile.open (m_outputFile.c_str ()); + if (!outFile.is_open ()) + { + NS_FATAL_ERROR ("Can't open file " << (m_outputFile)); + return; + } + + for (std::list >::iterator it1 = m_rem.begin (); + it1 != m_rem.end (); + ++it1) + { + for (std::list::iterator it2 = it1->begin (); + it2 != it1->end (); + ++it2) + { + Vector pos = it2->bmm->GetPosition (); + outFile << pos.x << "\t" + << pos.y << "\t" + << pos.z << "\t" + << it2->phy->GetSinr () + << std::endl; + m_channel->RemoveRx (it2->phy); + } + } + outFile.close (); +} + + +} // namespace ns3 diff --git a/src/lte/helper/radio-environment-map-helper.h b/src/lte/helper/radio-environment-map-helper.h new file mode 100644 index 000000000..1f95309f2 --- /dev/null +++ b/src/lte/helper/radio-environment-map-helper.h @@ -0,0 +1,91 @@ +/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */ +/* + * Copyright (c) 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 + */ + + +#ifndef RADIO_ENVIRONMENT_MAP_HELPER_H +#define RADIO_ENVIRONMENT_MAP_HELPER_H + + +#include + + + +namespace ns3 { + +class RemSpectrumPhy; +class Node; +class NetDevice; +class SpectrumChannel; +class BuildingsMobilityModel; + +/** + * Generates a 2D map of the SINR from the strongest transmitter. + * + */ +class RadioEnvironmentMapHelper : public Object +{ +public: + + RadioEnvironmentMapHelper (); + + virtual ~RadioEnvironmentMapHelper (); + + // inherited from Object + virtual void DoDispose (void); + static TypeId GetTypeId (void); + + void Install (); + +private: + + void Connect (); + void PrintAndDisconnect (); + + + struct RemPoint + { + Ptr phy; + Ptr node; + Ptr dev; + Ptr bmm; + }; + + std::list > m_rem; + + double m_xMin; + double m_xMax; + uint32_t m_xRes; + + double m_yMin; + double m_yMax; + uint32_t m_yRes; + + double m_z; + + std::string m_channelPath; + std::string m_outputFile; + + Ptr m_channel; +}; + + +} + +#endif /* RADIO_ENVIRONMENT_MAP_HELPER_H */ diff --git a/src/lte/model/rem-spectrum-phy.cc b/src/lte/model/rem-spectrum-phy.cc new file mode 100644 index 000000000..15b00bd74 --- /dev/null +++ b/src/lte/model/rem-spectrum-phy.cc @@ -0,0 +1,159 @@ +/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */ +/* + * Copyright (c) 2009 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 + */ + + +#include +#include +#include +#include +#include +#include + +#include "rem-spectrum-phy.h" + +NS_LOG_COMPONENT_DEFINE ("RemSpectrumPhy"); + +namespace ns3 { + +NS_OBJECT_ENSURE_REGISTERED (RemSpectrumPhy); + +RemSpectrumPhy::RemSpectrumPhy () + : m_mobility (0), + m_netDevice (0), + m_channel (0), + m_referenceSignalPower (0), + m_sumPower (0) +{ + NS_LOG_FUNCTION (this); +} + + + +RemSpectrumPhy::~RemSpectrumPhy () +{ + NS_LOG_FUNCTION (this); +} + +void +RemSpectrumPhy::DoDispose () +{ + NS_LOG_FUNCTION (this); + m_mobility = 0; + m_netDevice = 0; + m_channel = 0; + SpectrumPhy::DoDispose (); +} + +TypeId +RemSpectrumPhy::GetTypeId (void) +{ + static TypeId tid = TypeId ("ns3::RemSpectrumPhy") + .SetParent () + .AddConstructor () + .AddAttribute ("NoisePower", + "the power of the measuring instrument noise, in Watts. Default to a kT of -174 dBm with a noise figure of 9 dB and a bandwidth of 25 LTE Resource Blocks", + DoubleValue (1.4230e-10), + MakeDoubleAccessor (&RemSpectrumPhy::m_noisePower), + MakeDoubleChecker ()) + ; + return tid; +} + + + +Ptr +RemSpectrumPhy::GetDevice () +{ + return m_netDevice; +} + + +Ptr +RemSpectrumPhy::GetMobility () +{ + return m_mobility; +} + + +Ptr +RemSpectrumPhy::GetRxSpectrumModel () const +{ + return m_spectrumModel; +} + +void +RemSpectrumPhy::SetDevice (Ptr d) +{ + NS_LOG_FUNCTION (this << d); + m_netDevice = d; +} + + +void +RemSpectrumPhy::SetMobility (Ptr m) +{ + NS_LOG_FUNCTION (this << m); + m_mobility = m; +} + + +void +RemSpectrumPhy::SetChannel (Ptr c) +{ + NS_LOG_FUNCTION (this << c); + m_channel = c; +} + +void +RemSpectrumPhy::SetRxSpectrumModel (Ptr m) +{ + NS_LOG_FUNCTION (this << m); + m_spectrumModel = m; +} + +Ptr +RemSpectrumPhy::GetRxAntenna () +{ + return 0; +} + + +void +RemSpectrumPhy::StartRx (Ptr params) +{ + NS_LOG_FUNCTION ( this << params); + double power = Integral (*(params->psd)); + NS_ASSERT_MSG (params->duration.GetMilliSeconds () == 1, + "RemSpectrumPhy works only for LTE signals with duration of 1 ms"); + m_sumPower += power; + if (power > m_referenceSignalPower) + { + m_referenceSignalPower = power; + } +} + +double +RemSpectrumPhy::GetSinr () +{ + return m_referenceSignalPower / (m_sumPower + m_noisePower); +} + + +} // namespace ns3 diff --git a/src/lte/model/rem-spectrum-phy.h b/src/lte/model/rem-spectrum-phy.h new file mode 100644 index 000000000..24c0ba953 --- /dev/null +++ b/src/lte/model/rem-spectrum-phy.h @@ -0,0 +1,105 @@ +/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */ +/* + * Copyright (c) 2012 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 + */ + +#ifndef REM_SPECTRUM_PHY_H +#define REM_SPECTRUM_PHY_H + + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace ns3 { + + +/** + * + * This minimal SpectrumPhy implemetation calculates the SINR with + * respect to the strongest signal for a given point. The original + * purpose of this class is to be used to generate a + * Radio Environment Map (REM) by locating several instances in a grid + * fashion, and connecting them to the channel only for a very short + * amount of time. + * + * The assumption on which this class works is that the system + * being considered is an infrastructured radio access network using + * FDD, hence all signals will be transmitted simultaneously. + */ +class RemSpectrumPhy : public SpectrumPhy +{ + +public: + RemSpectrumPhy (); + virtual ~RemSpectrumPhy (); + + static TypeId GetTypeId (void); + +// inherited from SpectrumPhy + void SetChannel (Ptr c); + void SetMobility (Ptr m); + void SetDevice (Ptr d); + Ptr GetMobility (); + Ptr GetDevice (); + Ptr GetRxSpectrumModel () const; + Ptr GetRxAntenna (); + void StartRx (Ptr params); + + void SetRxSpectrumModel (Ptr); + + /** + * + * + * \return the Signal to Noise Ratio calculated + */ + double GetSinr (); + +protected: + void DoDispose (); + +private: + Ptr m_mobility; + Ptr m_netDevice; + Ptr m_channel; + Ptr m_spectrumModel; + + double m_referenceSignalPower; + double m_sumPower; + double m_noisePower; + +}; + + + + + + +} + + + + + +#endif /* REM_SPECTRUM_PHY_H */ diff --git a/src/lte/wscript b/src/lte/wscript index dc460ceb9..33bfbbb45 100644 --- a/src/lte/wscript +++ b/src/lte/wscript @@ -38,6 +38,8 @@ def build(bld): 'helper/epc-helper.cc', 'helper/radio-bearer-stats-calculator.cc', 'helper/mac-stats-calculator.cc', + 'helper/radio-environment-map-helper.cc', + 'model/rem-spectrum-phy.cc', 'model/ff-mac-csched-sap.cc', 'model/ff-mac-sched-sap.cc', 'model/lte-mac-sap.cc', @@ -125,6 +127,8 @@ def build(bld): 'helper/epc-helper.h', 'helper/mac-stats-calculator.h', 'helper/radio-bearer-stats-calculator.h', + 'helper/radio-environment-map-helper.h', + 'model/rem-spectrum-phy.h', 'model/ff-mac-common.h', 'model/ff-mac-csched-sap.h', 'model/ff-mac-sched-sap.h',