A Discrete-Event Network Simulator
API
Loading...
Searching...
No Matches
spectrum-analyzer.cc
Go to the documentation of this file.
1/*
2 * Copyright (c) 2009 CTTC
3 *
4 * SPDX-License-Identifier: GPL-2.0-only
5 *
6 * Author: Nicola Baldo <nbaldo@cttc.es>
7 */
8
9#include "spectrum-analyzer.h"
10
11#include <ns3/antenna-model.h>
12#include <ns3/double.h>
13#include <ns3/log.h>
14#include <ns3/object-factory.h>
15#include <ns3/simulator.h>
16#include <ns3/trace-source-accessor.h>
17
18namespace ns3
19{
20
21NS_LOG_COMPONENT_DEFINE("SpectrumAnalyzer");
22
23NS_OBJECT_ENSURE_REGISTERED(SpectrumAnalyzer);
24
26 : m_mobility(nullptr),
27 m_netDevice(nullptr),
28 m_channel(nullptr),
29 m_spectrumModel(nullptr),
30 m_sumPowerSpectralDensity(nullptr),
31 m_resolution(MilliSeconds(50)),
32 m_active(false)
33{
34 NS_LOG_FUNCTION(this);
35}
36
41
42void
44{
45 NS_LOG_FUNCTION(this);
46 m_mobility = nullptr;
47 m_netDevice = nullptr;
48 m_channel = nullptr;
49 m_spectrumModel = nullptr;
53}
54
57{
58 static TypeId tid =
59 TypeId("ns3::SpectrumAnalyzer")
61 .SetGroupName("Spectrum")
62 .AddConstructor<SpectrumAnalyzer>()
63 .AddAttribute("Resolution",
64 "The length of the time interval over which the "
65 "power spectral density of incoming signals is averaged",
69 .AddAttribute("NoisePowerSpectralDensity",
70 "The power spectral density of the measuring instrument "
71 "noise, in Watt/Hz. Mostly useful to make spectrograms "
72 "look more similar to those obtained by real devices. "
73 "Defaults to the value for thermal noise at 300K.",
74 DoubleValue(1.38e-23 * 300),
77 .AddTraceSource("AveragePowerSpectralDensityReport",
78 "Trace fired whenever a new value for the average "
79 "Power Spectral Density is calculated",
82 "ns3::SpectrumValue::TracedCallback");
83 return tid;
84}
85
88{
89 return m_netDevice;
90}
91
94{
95 return m_mobility;
96}
97
103
104void
110
111void
117
118void
124
127{
128 return m_antenna;
129}
130
131void
137
138void
140{
141 NS_LOG_FUNCTION(this << params);
142 AddSignal(params->psd);
143 Simulator::Schedule(params->duration, &SpectrumAnalyzer::SubtractSignal, this, params->psd);
144}
145
146void
148{
149 NS_LOG_FUNCTION(this << *psd);
151 (*m_sumPowerSpectralDensity) += (*psd);
152}
153
154void
156{
157 NS_LOG_FUNCTION(this << *psd);
159 (*m_sumPowerSpectralDensity) -= (*psd);
160}
161
162void
164{
165 NS_LOG_FUNCTION(this);
166 if (m_lastChangeTime < Now())
167 {
168 (*m_energySpectralDensity) +=
169 (*m_sumPowerSpectralDensity) * ((Now() - m_lastChangeTime).GetSeconds());
171 }
172 else
173 {
175 }
176}
177
178void
180{
181 NS_LOG_FUNCTION(this);
182
184 Ptr<SpectrumValue> avgPowerSpectralDensity =
186 (*avgPowerSpectralDensity) = (*m_energySpectralDensity) / m_resolution.GetSeconds();
187 (*avgPowerSpectralDensity) += m_noisePowerSpectralDensity;
188 (*m_energySpectralDensity) = 0;
189
190 NS_LOG_INFO("generating report");
191 m_averagePowerSpectralDensityReportTrace(avgPowerSpectralDensity);
192
193 *avgPowerSpectralDensity = 0;
194
195 if (m_active)
196 {
198 }
199}
200
201void
211
212void
214{
215 NS_LOG_FUNCTION(this);
216 if (!m_active)
217 {
218 NS_LOG_LOGIC("activating");
219 m_active = true;
221 }
222}
223
224void
226{
227 m_active = false;
228}
229
230} // namespace ns3
This class can be used to hold variables of floating point type such as 'double' or 'float'.
Definition double.h:31
virtual void DoDispose()
Destructor implementation.
Definition object.cc:433
Smart pointer class similar to boost::intrusive_ptr.
static EventId Schedule(const Time &delay, FUNC f, Ts &&... args)
Schedule an event to expire after delay.
Definition simulator.h:560
Simple SpectrumPhy implementation that averages the spectrum power density of incoming transmissions ...
TracedCallback< Ptr< const SpectrumValue > > m_averagePowerSpectralDensityReportTrace
TracedCallback - average power spectral density report.
void SetRxSpectrumModel(Ptr< SpectrumModel > m)
Set the spectrum model used by the SpectrumAnalyzer to represent incoming signals.
virtual void Start()
Start the spectrum analyzer.
static TypeId GetTypeId()
Get the type ID.
void DoDispose() override
Destructor implementation.
double m_noisePowerSpectralDensity
Noise power spectral density.
void SetAntenna(Ptr< AntennaModel > a)
Set the AntennaModel to be used.
virtual void Stop()
Stop the spectrum analyzer.
void SetMobility(Ptr< MobilityModel > m) override
Set the mobility model associated with this device.
Ptr< Object > GetAntenna() const override
Get the AntennaModel used by this SpectrumPhy instance for transmission and/or reception.
void StartRx(Ptr< SpectrumSignalParameters > params) override
Notify the SpectrumPhy instance of an incoming signal.
bool m_active
True if the analyzer is active.
Ptr< SpectrumChannel > m_channel
Pointer to the channel to be analyzed.
Time m_resolution
Time resolution.
Ptr< AntennaModel > m_antenna
Pointer to the Antenna model.
Ptr< NetDevice > GetDevice() const override
Get the associated NetDevice instance.
Ptr< MobilityModel > GetMobility() const override
Get the associated MobilityModel instance.
virtual void GenerateReport()
Generates a report of the data collected so far.
Ptr< SpectrumModel > m_spectrumModel
Spectrum model.
Time m_lastChangeTime
When the last update happened.
void AddSignal(Ptr< const SpectrumValue > psd)
Adds a signal to the data collected.
Ptr< SpectrumValue > m_sumPowerSpectralDensity
Sum of the received PSD.
Ptr< const SpectrumModel > GetRxSpectrumModel() const override
Ptr< SpectrumValue > m_energySpectralDensity
Energy spectral density.
void UpdateEnergyReceivedSoFar()
Updates the data about the received Energy.
void SetChannel(Ptr< SpectrumChannel > c) override
Set the channel attached to this device.
void SubtractSignal(Ptr< const SpectrumValue > psd)
Removes a signal to the data collected.
Ptr< MobilityModel > m_mobility
Pointer to the mobility model.
void SetDevice(Ptr< NetDevice > d) override
Set the associated NetDevice instance.
Ptr< NetDevice > m_netDevice
Pointer to the NetDevice using this object.
Abstract base class for Spectrum-aware PHY layers.
double GetSeconds() const
Get an approximation of the time stored in this instance in the indicated unit.
Definition nstime.h:392
a unique identifier for an interface.
Definition type-id.h:48
TypeId SetParent(TypeId tid)
Set the parent TypeId.
Definition type-id.cc:1001
#define NS_ASSERT(condition)
At runtime, in debugging builds, if this condition is not true, the program prints the source file,...
Definition assert.h:55
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition log.h:191
#define NS_LOG_LOGIC(msg)
Use NS_LOG to output a message of level LOG_LOGIC.
Definition log.h:271
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by ",...
#define NS_LOG_INFO(msg)
Use NS_LOG to output a message of level LOG_INFO.
Definition log.h:264
#define NS_OBJECT_ENSURE_REGISTERED(type)
Register an Object subclass with the TypeId system.
Definition object-base.h:35
Ptr< T > Create(Ts &&... args)
Create class instances by constructors with varying numbers of arguments and return them by Ptr.
Definition ptr.h:436
Time Now()
create an ns3::Time instance which contains the current simulation time.
Definition simulator.cc:294
Time MilliSeconds(uint64_t value)
Construct a Time in the indicated unit.
Definition nstime.h:1320
Ptr< const TraceSourceAccessor > MakeTraceSourceAccessor(T a)
Create a TraceSourceAccessor which will control access to the underlying trace source.
Every class exported by the ns3 library is enclosed in the ns3 namespace.
Ptr< const AttributeAccessor > MakeTimeAccessor(T1 a1)
Definition nstime.h:1396
Ptr< const AttributeChecker > MakeDoubleChecker()
Definition double.h:82
Ptr< const AttributeAccessor > MakeDoubleAccessor(T1 a1)
Definition double.h:32
Ptr< const AttributeChecker > MakeTimeChecker()
Helper to make an unbounded Time checker.
Definition nstime.h:1416