A Discrete-Event Network Simulator
API
interference-helper.h
Go to the documentation of this file.
1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2 /*
3  * Copyright (c) 2005,2006 INRIA
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License version 2 as
7  * published by the Free Software Foundation;
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software
16  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17  *
18  * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
19  */
20 
21 #ifndef INTERFERENCE_HELPER_H
22 #define INTERFERENCE_HELPER_H
23 
24 #include "phy-entity.h"
25 
26 namespace ns3 {
27 
28 class WifiPpdu;
29 class WifiPsdu;
30 class ErrorRateModel;
31 
37 class Event : public SimpleRefCount<Event>
38 {
39 public:
48  Event (Ptr<const WifiPpdu> ppdu, const WifiTxVector& txVector, Time duration, RxPowerWattPerChannelBand rxPower);
49  ~Event ();
50 
56  Ptr<const WifiPpdu> GetPpdu (void) const;
62  Time GetStartTime (void) const;
68  Time GetEndTime (void) const;
74  Time GetDuration (void) const;
80  double GetRxPowerW (void) const;
87  double GetRxPowerW (WifiSpectrumBand band) const;
99  const WifiTxVector& GetTxVector (void) const;
107 
108 
109 private:
115 };
116 
124 std::ostream& operator<< (std::ostream& os, const Event &event);
125 
126 
132 {
133 public:
136 
142  void AddBand (WifiSpectrumBand band);
143 
147  void RemoveBands (void);
148 
154  void SetNoiseFigure (double value);
160  void SetErrorRateModel (const Ptr<ErrorRateModel> rate);
161 
174  void SetNumberOfReceiveAntennas (uint8_t rx);
175 
184  Time GetEnergyDuration (double energyW, WifiSpectrumBand band);
185 
197  Ptr<Event> Add (Ptr<const WifiPpdu> ppdu, const WifiTxVector& txVector, Time duration, RxPowerWattPerChannelBand rxPower, bool isStartOfdmaRxing = false);
198 
204  void AddForeignSignal (Time duration, RxPowerWattPerChannelBand rxPower);
220  struct PhyEntity::SnrPer CalculatePayloadSnrPer (Ptr<Event> event, uint16_t channelWidth, WifiSpectrumBand band,
221  uint16_t staId, std::pair<Time, Time> relativeMpduStartStop) const;
232  double CalculateSnr (Ptr<Event> event, uint16_t channelWidth, uint8_t nss, WifiSpectrumBand band) const;
244  struct PhyEntity::SnrPer CalculatePhyHeaderSnrPer (Ptr<Event> event, uint16_t channelWidth, WifiSpectrumBand band,
245  WifiPpduField header) const;
246 
250  void NotifyRxStart ();
256  void NotifyRxEnd (Time endTime);
260  void EraseEvents (void);
261 
268  void UpdateEvent (Ptr<Event> event, RxPowerWattPerChannelBand rxPower);
269 
270 
271 protected:
282  double CalculateSnr (double signal, double noiseInterference, uint16_t channelWidth, uint8_t nss) const;
295  double CalculateChunkSuccessRate (double snir, Time duration, WifiMode mode, const WifiTxVector& txVector, WifiPpduField field) const;
307  double CalculatePayloadChunkSuccessRate (double snir, Time duration, const WifiTxVector& txVector, uint16_t staId = SU_STA_ID) const;
308 
309 private:
313  class NiChange
314  {
315 public:
322  NiChange (double power, Ptr<Event> event);
323  ~NiChange ();
329  double GetPower (void) const;
335  void AddPower (double power);
341  Ptr<Event> GetEvent (void) const;
342 
343 
344 private:
345  double m_power;
347  };
348 
352  typedef std::multimap<Time, NiChange> NiChanges;
353 
357  typedef std::map <WifiSpectrumBand, NiChanges> NiChangesPerBand;
358 
365  void AppendEvent (Ptr<Event> event, bool isStartOfdmaRxing);
366 
391  double CalculatePayloadPer (Ptr<const Event> event, uint16_t channelWidth, NiChangesPerBand *nis, WifiSpectrumBand band,
392  uint16_t staId, std::pair<Time, Time> window) const;
406  uint16_t channelWidth, WifiSpectrumBand band,
407  WifiPpduField header) const;
420  uint16_t channelWidth, WifiSpectrumBand band,
421  PhyEntity::PhyHeaderSections phyHeaderSections) const;
422 
423  double m_noiseFigure;
425  uint8_t m_numRxAntennas;
427  std::map <WifiSpectrumBand, double> m_firstPowerPerBand;
428  bool m_rxing;
429 
437  NiChanges::iterator GetNextPosition (Time moment, WifiSpectrumBand band);
445  NiChanges::iterator GetPreviousPosition (Time moment, WifiSpectrumBand band);
446 
456  NiChanges::iterator AddNiChangeEvent (Time moment, NiChange change, WifiSpectrumBand band);
457 };
458 
459 } //namespace ns3
460 
461 #endif /* INTERFERENCE_HELPER_H */
double GetRxPowerW(void) const
Return the total received power (W).
double CalculatePayloadPer(Ptr< const Event > event, uint16_t channelWidth, NiChangesPerBand *nis, WifiSpectrumBand 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...
void NotifyRxEnd(Time endTime)
Notify that RX has ended.
Simulation virtual time values and global simulation resolution.
Definition: nstime.h:103
Time GetEnergyDuration(double energyW, WifiSpectrumBand band)
Smart pointer class similar to boost::intrusive_ptr.
Definition: ptr.h:73
void SetNumberOfReceiveAntennas(uint8_t rx)
Set the number of RX antennas in the receiver corresponding to this interference helper.
Ptr< ErrorRateModel > GetErrorRateModel(void) const
Return the error rate model.
This class mimics the TXVECTOR which is to be passed to the PHY in order to define the parameters whi...
Time GetEndTime(void) const
Return the end time of the signal.
void RemoveBands(void)
Remove the frequency bands.
void UpdateEvent(Ptr< Event > event, RxPowerWattPerChannelBand rxPower)
Update event to scale its received power (W) per band.
handles interference calculations
void SetErrorRateModel(const Ptr< ErrorRateModel > rate)
Set the error rate model for this interference helper.
NiChangesPerBand m_niChangesPerBand
NI Changes for each band.
Time GetStartTime(void) const
Return the start time of the signal.
void UpdateRxPowerW(RxPowerWattPerChannelBand rxPower)
Update the received power (W) for all bands, i.e.
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< const WifiPpdu > GetPpdu(void) const
Return the PPDU.
STL namespace.
Ptr< ErrorRateModel > m_errorRateModel
error rate model
Declaration of:
Ptr< const WifiPpdu > m_ppdu
PPDU.
std::map< WifiPpduField, PhyHeaderChunkInfo > PhyHeaderSections
A map of PhyHeaderChunkInfo elements per PPDU field.
Definition: phy-entity.h:301
NiChanges::iterator AddNiChangeEvent(Time moment, NiChange change, WifiSpectrumBand band)
Add NiChange to the list at the appropriate position and return the iterator of the new event...
std::ostream & operator<<(std::ostream &os, const Angles &a)
Definition: angles.cc:137
Ptr< Event > Add(Ptr< const WifiPpdu > ppdu, const WifiTxVector &txVector, Time duration, RxPowerWattPerChannelBand rxPower, bool isStartOfdmaRxing=false)
Add the PPDU-related signal to interference helper.
std::map< WifiSpectrumBand, double > m_firstPowerPerBand
first power of each band in watts
double CalculatePhyHeaderSectionPsr(Ptr< const Event > event, NiChangesPerBand *nis, uint16_t channelWidth, WifiSpectrumBand band, PhyEntity::PhyHeaderSections phyHeaderSections) const
Calculate the success rate of the PHY header sections for the provided event.
Time GetDuration(void) const
Return the duration of the signal.
WifiPpduField
The type of PPDU field (grouped for convenience)
std::map< WifiSpectrumBand, NiChanges > NiChangesPerBand
Map of NiChanges per band.
std::pair< uint32_t, uint32_t > WifiSpectrumBand
typedef for a pair of start and stop sub-band indexes
A struct for both SNR and PER.
Definition: phy-entity.h:136
double m_noiseFigure
noise figure (linear)
Event(Ptr< const WifiPpdu > ppdu, const WifiTxVector &txVector, Time duration, RxPowerWattPerChannelBand rxPower)
Create an Event with the given parameters.
Every class exported by the ns3 library is enclosed in the ns3 namespace.
void NotifyRxStart()
Notify that RX has started.
Noise and Interference (thus Ni) event.
void EraseEvents(void)
Erase all events.
const WifiTxVector & GetTxVector(void) const
Return the TXVECTOR of the PPDU.
double CalculatePhyHeaderPer(Ptr< const Event > event, NiChangesPerBand *nis, uint16_t channelWidth, WifiSpectrumBand band, WifiPpduField header) const
Calculate the error rate of the PHY header.
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.
uint8_t m_numRxAntennas
the number of RX antennas in the corresponding receiver
void AppendEvent(Ptr< Event > event, bool isStartOfdmaRxing)
Append the given Event.
void AddBand(WifiSpectrumBand band)
Add a frequency band.
double CalculateNoiseInterferenceW(Ptr< Event > event, NiChangesPerBand *nis, WifiSpectrumBand band) const
Calculate noise and interference power in W.
void AddForeignSignal(Time duration, RxPowerWattPerChannelBand rxPower)
Add a non-Wifi signal to interference helper.
void SetNoiseFigure(double value)
Set the noise figure.
struct PhyEntity::SnrPer CalculatePayloadSnrPer(Ptr< Event > event, uint16_t channelWidth, WifiSpectrumBand 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...
RxPowerWattPerChannelBand m_rxPowerW
received power in watts per band
NiChanges::iterator GetPreviousPosition(Time moment, WifiSpectrumBand band)
Returns an iterator to the last NiChange that is before than moment.
WifiTxVector m_txVector
TXVECTOR.
double CalculateSnr(Ptr< Event > event, uint16_t channelWidth, uint8_t nss, WifiSpectrumBand band) const
Calculate the SNIR for the event (starting from now until the event end).
Time m_endTime
end time
handles interference calculations
RxPowerWattPerChannelBand GetRxPowerWPerBand(void) const
Return the received power (W) for all bands.
struct PhyEntity::SnrPer CalculatePhyHeaderSnrPer(Ptr< Event > event, uint16_t channelWidth, WifiSpectrumBand band, WifiPpduField header) const
Calculate the SNIR at the start of the PHY header and accumulate all SNIR changes in the SNIR vector...
A template-based reference counting class.
std::map< WifiSpectrumBand, double > RxPowerWattPerChannelBand
A map of the received power (Watts) for each band.
Definition: phy-entity.h:75
std::multimap< Time, NiChange > NiChanges
typedef for a multimap of NiChange
bool m_rxing
flag whether it is in receiving state
NiChanges::iterator GetNextPosition(Time moment, WifiSpectrumBand band)
Returns an iterator to the first NiChange that is later than moment.
Time m_startTime
start time