A Discrete-Event Network Simulator
API
interference-helper.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2005,2006 INRIA
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License version 2 as
6  * published by the Free Software Foundation;
7  *
8  * This program is distributed in the hope that it will be useful,
9  * but WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11  * GNU General Public License for more details.
12  *
13  * You should have received a copy of the GNU General Public License
14  * along with this program; if not, write to the Free Software
15  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
16  *
17  * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
18  */
19 
20 #ifndef INTERFERENCE_HELPER_H
21 #define INTERFERENCE_HELPER_H
22 
23 #include "phy-entity.h"
24 
25 #include "ns3/object.h"
26 
27 namespace ns3
28 {
29 
30 class WifiPpdu;
31 class WifiPsdu;
32 class ErrorRateModel;
33 
39 class Event : public SimpleRefCount<Event>
40 {
41  public:
50  Event(Ptr<const WifiPpdu> ppdu, Time duration, RxPowerWattPerChannelBand&& rxPower);
51 
63  Time GetStartTime() const;
69  Time GetEndTime() const;
75  Time GetDuration() const;
81  double GetRxPowerW() const;
88  double GetRxPowerW(const WifiSpectrumBandInfo& band) const;
101  void UpdateRxPowerW(const RxPowerWattPerChannelBand& rxPower);
110  void UpdatePpdu(Ptr<const WifiPpdu> ppdu);
111 
112  private:
117 };
118 
126 std::ostream& operator<<(std::ostream& os, const Event& event);
127 
133 {
134  public:
136  ~InterferenceHelper() override;
137 
142  static TypeId GetTypeId();
143 
149  void AddBand(const WifiSpectrumBandInfo& band);
150 
156  bool HasBands() const;
157 
165  void UpdateBands(const std::vector<WifiSpectrumBandInfo>& bands,
166  const FrequencyRange& freqRange);
167 
173  void SetNoiseFigure(double value);
179  void SetErrorRateModel(const Ptr<ErrorRateModel> rate);
180 
193  void SetNumberOfReceiveAntennas(uint8_t rx);
194 
203  Time GetEnergyDuration(double energyW, const WifiSpectrumBandInfo& band);
204 
217  Time duration,
218  RxPowerWattPerChannelBand& rxPower,
219  bool isStartHePortionRxing = false);
220 
226  void AddForeignSignal(Time duration, RxPowerWattPerChannelBand& rxPower);
244  uint16_t channelWidth,
245  const WifiSpectrumBandInfo& band,
246  uint16_t staId,
247  std::pair<Time, Time> relativeMpduStartStop) const;
258  double CalculateSnr(Ptr<Event> event,
259  uint16_t channelWidth,
260  uint8_t nss,
261  const WifiSpectrumBandInfo& band) const;
274  uint16_t channelWidth,
275  const WifiSpectrumBandInfo& band,
276  WifiPpduField header) const;
277 
281  void NotifyRxStart();
288  void NotifyRxEnd(Time endTime, const FrequencyRange& freqRange);
289 
296  void UpdateEvent(Ptr<Event> event, const RxPowerWattPerChannelBand& rxPower);
297 
298  protected:
299  void DoDispose() override;
300 
311  double CalculateSnr(double signal,
312  double noiseInterference,
313  uint16_t channelWidth,
314  uint8_t nss) const;
327  double CalculateChunkSuccessRate(double snir,
328  Time duration,
329  WifiMode mode,
330  const WifiTxVector& txVector,
331  WifiPpduField field) const;
344  double CalculatePayloadChunkSuccessRate(double snir,
345  Time duration,
346  const WifiTxVector& txVector,
347  uint16_t staId = SU_STA_ID) const;
348 
349  private:
353  class NiChange
354  {
355  public:
362  NiChange(double power, Ptr<Event> event);
363  ~NiChange();
369  double GetPower() const;
375  void AddPower(double power);
381  Ptr<Event> GetEvent() const;
382 
383  private:
384  double m_power;
386  };
387 
391  using NiChanges = std::multimap<Time, NiChange>;
392 
396  using NiChangesPerBand = std::map<WifiSpectrumBandInfo, NiChanges>;
397 
401  using FirstPowerPerBand = std::map<WifiSpectrumBandInfo, double>;
402 
409  bool HasBand(const WifiSpectrumBandInfo& band) const;
410 
419  const FrequencyRange& freqRange) const;
420 
428  void AppendEvent(Ptr<Event> event, bool isStartHePortionRxing);
429 
440  NiChangesPerBand& nis,
441  const WifiSpectrumBandInfo& band) const;
442 
453  double CalculateMuMimoPowerW(Ptr<const Event> event, const WifiSpectrumBandInfo& band) const;
454 
470  uint16_t channelWidth,
471  NiChangesPerBand* nis,
472  const WifiSpectrumBandInfo& band,
473  uint16_t staId,
474  std::pair<Time, Time> window) const;
488  NiChangesPerBand* nis,
489  uint16_t channelWidth,
490  const WifiSpectrumBandInfo& band,
491  WifiPpduField header) const;
504  NiChangesPerBand* nis,
505  uint16_t channelWidth,
506  const WifiSpectrumBandInfo& band,
507  PhyEntity::PhyHeaderSections phyHeaderSections) const;
508 
509  double m_noiseFigure;
511  uint8_t m_numRxAntennas;
514  bool m_rxing;
515 
523  NiChanges::iterator GetNextPosition(Time moment, NiChangesPerBand::iterator niIt);
531  NiChanges::iterator GetPreviousPosition(Time moment, NiChangesPerBand::iterator niIt);
532 
542  NiChanges::iterator AddNiChangeEvent(Time moment,
543  NiChange change,
544  NiChangesPerBand::iterator niIt);
545 
555  bool IsSameMuMimoTransmission(Ptr<const Event> currentEvent, Ptr<const Event> otherEvent) const;
556 };
557 
558 } // namespace ns3
559 
560 #endif /* INTERFERENCE_HELPER_H */
handles interference calculations
Time m_endTime
end time
Time m_startTime
start time
Event(Ptr< const WifiPpdu > ppdu, Time duration, RxPowerWattPerChannelBand &&rxPower)
Create an Event with the given parameters.
Ptr< const WifiPpdu > GetPpdu() const
Return the PPDU.
Ptr< const WifiPpdu > m_ppdu
PPDU.
void UpdateRxPowerW(const RxPowerWattPerChannelBand &rxPower)
Update the received power (W) for all bands, i.e.
Time GetEndTime() const
Return the end time of the signal.
Time GetDuration() const
Return the duration of the signal.
double GetRxPowerW() const
Return the total received power (W).
RxPowerWattPerChannelBand m_rxPowerW
received power in watts per band
const RxPowerWattPerChannelBand & GetRxPowerWPerBand() const
Return the received power (W) for all bands.
Time GetStartTime() const
Return the start time of the signal.
void UpdatePpdu(Ptr< const WifiPpdu > ppdu)
Update the PPDU that initially generated the event.
Noise and Interference (thus Ni) event.
void AddPower(double power)
Add a given amount of power.
NiChange(double power, Ptr< Event > event)
Create a NiChange at the given time and the amount of NI change.
double GetPower() const
Return the power.
Ptr< Event > GetEvent() const
Return the event causes the corresponding NI change.
handles interference calculations
void SetNoiseFigure(double value)
Set the noise figure.
double m_noiseFigure
noise figure (linear)
Ptr< ErrorRateModel > GetErrorRateModel() const
Return the error rate model.
void AddForeignSignal(Time duration, RxPowerWattPerChannelBand &rxPower)
Add a non-Wifi signal to interference helper.
bool m_rxing
flag whether it is in receiving state
NiChanges::iterator AddNiChangeEvent(Time moment, NiChange change, NiChangesPerBand::iterator niIt)
Add NiChange to the list at the appropriate position and return the iterator of the new event.
std::map< WifiSpectrumBandInfo, NiChanges > NiChangesPerBand
Map of NiChanges per band.
double CalculateMuMimoPowerW(Ptr< const Event > event, const WifiSpectrumBandInfo &band) const
Calculate power of all other events preceding a given event that belong to the same MU-MIMO transmiss...
uint8_t m_numRxAntennas
the number of RX antennas in the corresponding receiver
bool IsBandInFrequencyRange(const WifiSpectrumBandInfo &band, const FrequencyRange &freqRange) const
Check whether a given band belongs to a given frequency range.
void DoDispose() override
Destructor implementation.
std::multimap< Time, NiChange > NiChanges
typedef for a multimap of NiChange
NiChangesPerBand m_niChanges
NI Changes for each band.
void UpdateBands(const std::vector< WifiSpectrumBandInfo > &bands, const FrequencyRange &freqRange)
Update the frequency bands that belongs to a given frequency range when the spectrum model is changed...
void SetErrorRateModel(const Ptr< ErrorRateModel > rate)
Set the error rate model for this interference helper.
bool HasBands() const
Check whether bands are already tracked by this interference helper.
double CalculatePayloadChunkSuccessRate(double snir, Time duration, const WifiTxVector &txVector, uint16_t staId=SU_STA_ID) const
Calculate the success rate of the payload chunk given the SINR, duration, and TXVECTOR.
Ptr< ErrorRateModel > m_errorRateModel
error rate model
Ptr< Event > Add(Ptr< const WifiPpdu > ppdu, Time duration, RxPowerWattPerChannelBand &rxPower, bool isStartHePortionRxing=false)
Add the PPDU-related signal to interference helper.
void NotifyRxStart()
Notify that RX has started.
NiChanges::iterator GetNextPosition(Time moment, NiChangesPerBand::iterator niIt)
Returns an iterator to the first NiChange that is later than moment.
FirstPowerPerBand m_firstPowers
first power of each band in watts
Time GetEnergyDuration(double energyW, const WifiSpectrumBandInfo &band)
bool IsSameMuMimoTransmission(Ptr< const Event > currentEvent, Ptr< const Event > otherEvent) const
Return whether another event is a MU-MIMO event that belongs to the same transmission and to the same...
double CalculateChunkSuccessRate(double snir, Time duration, WifiMode mode, const WifiTxVector &txVector, WifiPpduField field) const
Calculate the success rate of the chunk given the SINR, duration, and TXVECTOR.
double CalculatePayloadPer(Ptr< const Event > event, uint16_t channelWidth, NiChangesPerBand *nis, const WifiSpectrumBandInfo &band, uint16_t staId, std::pair< Time, Time > window) const
Calculate the error rate of the given PHY payload only in the provided time window (thus enabling per...
bool HasBand(const WifiSpectrumBandInfo &band) const
Check whether a given band is tracked by this interference helper.
void AddBand(const WifiSpectrumBandInfo &band)
Add a frequency band.
double CalculateNoiseInterferenceW(Ptr< Event > event, NiChangesPerBand &nis, const WifiSpectrumBandInfo &band) const
Calculate noise and interference power in W.
double CalculatePhyHeaderPer(Ptr< const Event > event, NiChangesPerBand *nis, uint16_t channelWidth, const WifiSpectrumBandInfo &band, WifiPpduField header) const
Calculate the error rate of the PHY header.
NiChanges::iterator GetPreviousPosition(Time moment, NiChangesPerBand::iterator niIt)
Returns an iterator to the last NiChange that is before than moment.
double CalculateSnr(Ptr< Event > event, uint16_t channelWidth, uint8_t nss, const WifiSpectrumBandInfo &band) const
Calculate the SNIR for the event (starting from now until the event end).
std::map< WifiSpectrumBandInfo, double > FirstPowerPerBand
Map of first power per band.
PhyEntity::SnrPer CalculatePhyHeaderSnrPer(Ptr< Event > event, uint16_t channelWidth, const WifiSpectrumBandInfo &band, WifiPpduField header) const
Calculate the SNIR at the start of the PHY header and accumulate all SNIR changes in the SNIR vector.
void AppendEvent(Ptr< Event > event, bool isStartHePortionRxing)
Append the given Event.
static TypeId GetTypeId()
Get the type ID.
void UpdateEvent(Ptr< Event > event, const RxPowerWattPerChannelBand &rxPower)
Update event to scale its received power (W) per band.
void NotifyRxEnd(Time endTime, const FrequencyRange &freqRange)
Notify that RX has ended.
double CalculatePhyHeaderSectionPsr(Ptr< const Event > event, NiChangesPerBand *nis, uint16_t channelWidth, const WifiSpectrumBandInfo &band, PhyEntity::PhyHeaderSections phyHeaderSections) const
Calculate the success rate of the PHY header sections for the provided event.
void SetNumberOfReceiveAntennas(uint8_t rx)
Set the number of RX antennas in the receiver corresponding to this interference helper.
PhyEntity::SnrPer CalculatePayloadSnrPer(Ptr< Event > event, uint16_t channelWidth, const WifiSpectrumBandInfo &band, uint16_t staId, std::pair< Time, Time > relativeMpduStartStop) const
Calculate the SNIR at the start of the payload and accumulate all SNIR changes in the SNIR vector for...
A base class which provides memory management and object aggregation.
Definition: object.h:89
std::map< WifiPpduField, PhyHeaderChunkInfo > PhyHeaderSections
A map of PhyHeaderChunkInfo elements per PPDU field.
Definition: phy-entity.h:326
Smart pointer class similar to boost::intrusive_ptr.
Definition: ptr.h:77
A template-based reference counting class.
Simulation virtual time values and global simulation resolution.
Definition: nstime.h:105
a unique identifier for an interface.
Definition: type-id.h:59
represent a single transmission mode
Definition: wifi-mode.h:51
This class mimics the TXVECTOR which is to be passed to the PHY in order to define the parameters whi...
WifiPpduField
The type of PPDU field (grouped for convenience)
Every class exported by the ns3 library is enclosed in the ns3 namespace.
std::map< WifiSpectrumBandInfo, double > RxPowerWattPerChannelBand
A map of the received power (Watts) for each band.
Definition: phy-entity.h:77
std::ostream & operator<<(std::ostream &os, const Angles &a)
Definition: angles.cc:159
static constexpr uint16_t SU_STA_ID
STA_ID to identify a single user (SU)
Definition: wifi-mode.h:35
Declaration of:
Struct defining a frequency range between minFrequency (MHz) and maxFrequency (MHz).
A struct for both SNR and PER.
Definition: phy-entity.h:147
WifiSpectrumBandInfo structure containing info about a spectrum band.