23#include <ns3/boolean.h>
24#include <ns3/buildings-helper.h>
25#include <ns3/config.h>
26#include <ns3/constant-position-mobility-model.h>
27#include <ns3/double.h>
28#include <ns3/integer.h>
30#include <ns3/lte-spectrum-value-helper.h>
31#include <ns3/mobility-building-info.h>
33#include <ns3/pointer.h>
34#include <ns3/rem-spectrum-phy.h>
35#include <ns3/simulator.h>
36#include <ns3/spectrum-channel.h>
37#include <ns3/string.h>
38#include <ns3/uinteger.h>
69 TypeId(
"ns3::RadioEnvironmentMapHelper")
75 "The DL spectrum channel for which the RadioEnvironment Map is to be generated. "
76 "Alternatively ChannelPath attribute can be used."
77 "Only one of the two (Channel or ChannelPath) should be set.",
80 MakePointerChecker<SpectrumChannel>())
83 "The path to the channel for which the Radio Environment Map is to be generated."
84 "This attribute is an alternative to Channel attribute and is only used if Channel "
85 "is not set (equal to nullptr). "
86 "Only one of the two (Channel or ChannelPath) should be set.",
90 .AddAttribute(
"OutputFile",
91 "the filename to which the Radio Environment Map is saved",
96 "The min x coordinate of the map.",
99 MakeDoubleChecker<double>())
100 .AddAttribute(
"YMin",
101 "The min y coordinate of the map.",
104 MakeDoubleChecker<double>())
105 .AddAttribute(
"XMax",
106 "The max x coordinate of the map.",
109 MakeDoubleChecker<double>())
110 .AddAttribute(
"YMax",
111 "The max y coordinate of the map.",
114 MakeDoubleChecker<double>())
115 .AddAttribute(
"XRes",
116 "The resolution (number of points) of the map along the x axis.",
119 MakeUintegerChecker<uint32_t>(2, std::numeric_limits<uint16_t>::max()))
120 .AddAttribute(
"YRes",
121 "The resolution (number of points) of the map along the y axis.",
124 MakeUintegerChecker<uint16_t>(2, std::numeric_limits<uint16_t>::max()))
126 "The value of the z coordinate for which the map is to be generated",
129 MakeDoubleChecker<double>())
132 "If true, Simulator::Stop () will be called as soon as the REM has been generated",
138 "the power of the measuring instrument noise, in Watts. Default to a kT of -174 "
139 "dBm with a noise figure of 9 dB and a bandwidth of 25 LTE Resource Blocks",
142 MakeDoubleChecker<double>())
143 .AddAttribute(
"MaxPointsPerIteration",
144 "Maximum number of REM points to be calculated per iteration. Every "
145 "point consumes approximately 5KB of memory.",
148 MakeUintegerChecker<uint32_t>(1, std::numeric_limits<uint32_t>::max()))
149 .AddAttribute(
"Earfcn",
150 "E-UTRA Absolute Radio Frequency Channel Number (EARFCN) "
151 "as per 3GPP 36.101 Section 5.7.3.",
154 MakeUintegerChecker<uint16_t>())
155 .AddAttribute(
"Bandwidth",
156 "Transmission Bandwidth Configuration (in number of RBs) over which the "
157 "SINR will be calculated",
161 MakeUintegerChecker<uint16_t>())
162 .AddAttribute(
"UseDataChannel",
163 "If true, REM will be generated for PDSCH and for PDCCH otherwise",
167 .AddAttribute(
"RbId",
168 "Resource block Id, for which REM will be generated, "
169 "default value is -1, what means REM will be averaged from all RBs",
172 MakeIntegerChecker<int32_t>());
208 NS_FATAL_ERROR(
"only one REM supported per instance of RadioEnvironmentMapHelper");
214 if (match.
GetN() != 1)
220 "object at " <<
m_channelPath <<
" is not of type SpectrumChannel");
230 double startDelay = 0.0026;
256 p.
phy = CreateObject<RemSpectrumPhy>();
257 p.
bmm = CreateObject<ConstantPositionMobilityModel>();
261 p.
phy->SetMobility(p.
bmm);
268 double remIterationStartTime = 0.0001;
271 uint32_t numPointsCurrentIteration = 0;
272 bool justScheduled =
false;
281 justScheduled =
false;
284 ++numPointsCurrentIteration;
295 remIterationStartTime += 0.001;
296 justScheduled =
true;
297 numPointsCurrentIteration = 0;
309 std::list<RemPoint>::iterator remIt =
m_rem.begin();
318 remIt->bmm->SetPosition(Vector(x, y,
m_z));
320 (remIt->bmm)->GetObject<MobilityBuildingInfo>();
321 buildingInfo->MakeConsistent(remIt->bmm);
326 if (remIt !=
m_rem.end())
329 NS_LOG_LOGIC(
"deactivating RemSpectrumPhys that are unneeded in the last iteration");
330 while (remIt !=
m_rem.end())
332 remIt->phy->Deactivate();
345 for (std::list<RemPoint>::iterator it =
m_rem.begin(); it !=
m_rem.end(); ++it)
347 if (!(it->phy->IsActive()))
353 Vector pos = it->bmm->GetPosition();
354 NS_LOG_LOGIC(
"output: " << pos.x <<
"\t" << pos.y <<
"\t" << pos.z <<
"\t"
356 m_outFile << pos.x <<
"\t" << pos.y <<
"\t" << pos.z <<
"\t"
AttributeValue implementation for Boolean.
hold a set of objects which match a specific search string.
Ptr< Object > Get(std::size_t i) const
This class can be used to hold variables of floating point type such as 'double' or 'float'.
Hold a signed integer type.
static Ptr< SpectrumModel > GetSpectrumModel(uint32_t earfcn, uint16_t bandwidth)
A base class which provides memory management and object aggregation.
Ptr< T > GetObject() const
Get a pointer to the requested aggregated Object.
void AggregateObject(Ptr< Object > other)
Aggregate two Objects together.
Hold objects of type Ptr<T>.
Smart pointer class similar to boost::intrusive_ptr.
Generates a 2D map of the SINR from the strongest transmitter in the downlink of an LTE FDD system.
~RadioEnvironmentMapHelper() override
void Install()
Deploy the RemSpectrumPhy objects that generate the map according to the specified settings.
uint16_t m_yRes
The YRes attribute.
static TypeId GetTypeId()
Register this type.
uint16_t m_xRes
The XRes attribute.
std::list< RemPoint > m_rem
List of listeners in the environment.
int32_t m_rbId
The RbId attribute.
Ptr< SpectrumChannel > m_channel
The Channel attribute, which is a direct pointer to the DL channel object for which will be created t...
std::ofstream m_outFile
Stream the output to a file.
bool m_useDataChannel
The UseDataChannel attribute.
double m_z
The Z attribute.
std::string m_outputFile
The OutputFile attribute.
double m_noisePower
The NoisePower attribute.
RadioEnvironmentMapHelper()
void SetBandwidth(uint16_t bw)
double m_yMin
The YMin attribute.
void Finalize()
Called when the map generation procedure has been completed.
void DoDispose() override
Destructor implementation.
uint16_t m_earfcn
The Earfcn attribute.
double m_xMax
The XMax attribute.
uint32_t m_maxPointsPerIteration
The MaxPointsPerIteration attribute.
double m_xStep
Distance along X axis between adjacent listening points.
void DelayedInstall()
Scheduled by Install() to perform the actual generation of map.
std::string m_channelPath
The ChannelPath attribute.
void PrintAndReset()
Go through every listener, write the computed SINR, and then reset it.
double m_xMin
The XMin attribute.
uint16_t m_bandwidth
The Bandwidth attribute.
uint16_t GetBandwidth() const
void RunOneIteration(double xMin, double xMax, double yMin, double yMax)
Mobilize all the listeners to a specified area.
double m_yStep
Distance along Y axis between adjacent listening points.
double m_yMax
The YMax attribute.
bool m_stopWhenDone
The StopWhenDone attribute.
static EventId Schedule(const Time &delay, FUNC f, Ts &&... args)
Schedule an event to expire after delay.
static void Stop()
Tell the Simulator the calling event should be the last one executed.
Defines the interface for spectrum-aware channel implementations.
Hold variables of type string.
a unique identifier for an interface.
TypeId SetParent(TypeId tid)
Set the parent TypeId.
Hold an unsigned integer type.
#define NS_ASSERT(condition)
At runtime, in debugging builds, if this condition is not true, the program prints the source file,...
Ptr< const AttributeAccessor > MakeBooleanAccessor(T1 a1)
Ptr< const AttributeChecker > MakeBooleanChecker()
Ptr< const AttributeAccessor > MakeDoubleAccessor(T1 a1)
Ptr< const AttributeAccessor > MakeIntegerAccessor(T1 a1)
Ptr< const AttributeAccessor > MakePointerAccessor(T1 a1)
Ptr< const AttributeChecker > MakeStringChecker()
Ptr< const AttributeAccessor > MakeStringAccessor(T1 a1)
Ptr< const AttributeAccessor > MakeUintegerAccessor(T1 a1)
MatchContainer LookupMatches(std::string path)
#define NS_FATAL_ERROR(msg)
Report a fatal error with a message and terminate.
#define NS_ABORT_MSG_IF(cond, msg)
Abnormal program termination if a condition is true, with a message.
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
#define NS_LOG_LOGIC(msg)
Use NS_LOG to output a message of level LOG_LOGIC.
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by ",...
#define NS_OBJECT_ENSURE_REGISTERED(type)
Register an Object subclass with the TypeId system.
Time Seconds(double value)
Construct a Time in the indicated unit.
Every class exported by the ns3 library is enclosed in the ns3 namespace.
A complete Radio Environment Map is composed of many of this structure.
Ptr< RemSpectrumPhy > phy
Simplified listener which compute SINR over the DL channel.
Ptr< MobilityModel > bmm
Position of the listener in the environment.