00001
00002
00003 #ifndef INTERFERENCE_HELPER_H
00004 #define INTERFERENCE_HELPER_H
00005
00006 #include <stdint.h>
00007 #include <vector>
00008 #include <list>
00009 #include "wifi-mode.h"
00010 #include "wifi-preamble.h"
00011 #include "ns3/nstime.h"
00012 #include "ns3/ref-count-base.h"
00013
00014 namespace ns3 {
00015
00016 class ErrorRateModel;
00017
00018 class InterferenceHelper
00019 {
00020 public:
00021 class Event : public RefCountBase
00022 {
00023 public:
00024 Event (uint32_t size, WifiMode payloadMode,
00025 enum WifiPreamble preamble,
00026 Time duration, double rxPower);
00027 virtual ~Event ();
00028
00029 Time GetDuration (void) const;
00030 Time GetStartTime (void) const;
00031 Time GetEndTime (void) const;
00032 bool Overlaps (Time time) const;
00033 double GetRxPowerW (void) const;
00034 uint32_t GetSize (void) const;
00035 WifiMode GetPayloadMode (void) const;
00036 enum WifiPreamble GetPreambleType (void) const;
00037 private:
00038 uint32_t m_size;
00039 WifiMode m_payloadMode;
00040 enum WifiPreamble m_preamble;
00041 Time m_startTime;
00042 Time m_endTime;
00043 double m_rxPowerW;
00044 };
00045 struct SnrPer
00046 {
00047 double snr;
00048 double per;
00049 };
00050
00051 InterferenceHelper ();
00052 ~InterferenceHelper ();
00053
00054 void Configure80211aParameters (void);
00055
00056
00057
00058
00059 void SetUseConstantNoiseFloor (bool value);
00060
00061
00062
00063
00064 bool GetUseConstantNoiseFloor () const;
00065
00066
00067
00068
00069
00070
00071
00072 void SetConstantNoiseFloorW (double noiseFloorW);
00073
00074
00075
00076
00077 double GetConstantNoiseFloorW () const;
00078
00079 void SetRxNoiseRatio (double ratio);
00080 double GetRxNoiseRatio () const;
00081
00082 void SetErrorRateModel (Ptr<ErrorRateModel> rate);
00083 Ptr<ErrorRateModel> GetErrorRateModel (void) const;
00084
00085
00086
00087
00088
00089
00090
00091
00092 Time GetEnergyDuration (double energyW);
00093 Time CalculateTxDuration (uint32_t size, WifiMode payloadMode, WifiPreamble preamble) const;
00094 Ptr<InterferenceHelper::Event> Add (uint32_t size, WifiMode payloadMode,
00095 enum WifiPreamble preamble,
00096 Time duration, double rxPower);
00097
00098 struct InterferenceHelper::SnrPer CalculateSnrPer (Ptr<InterferenceHelper::Event> event);
00099
00100 double CalculateSnr (Ptr<InterferenceHelper::Event> event);
00101
00102 private:
00103 class NiChange {
00104 public:
00105 NiChange (Time time, double delta);
00106 Time GetTime (void) const;
00107 double GetDelta (void) const;
00108 bool operator < (NiChange const &o) const;
00109 private:
00110 Time m_time;
00111 double m_delta;
00112 };
00113 typedef std::vector <NiChange> NiChanges;
00114 typedef std::list<Ptr<Event> > Events;
00115
00116 InterferenceHelper (const InterferenceHelper &o);
00117 InterferenceHelper &operator = (const InterferenceHelper &o);
00118 void AppendEvent (Ptr<Event> event);
00119 double CalculateNoiseInterferenceW (Ptr<Event> event, NiChanges *ni) const;
00120 double CalculateSnr (double signal, double noiseInterference, WifiMode mode) const;
00121 double CalculateChunkSuccessRate (double snir, Time delay, WifiMode mode) const;
00122 double CalculatePer (Ptr<const Event> event, NiChanges *ni) const;
00123 Time GetMaxPacketDuration (void) const;
00124
00125 uint64_t m_plcpLongPreambleDelayUs;
00126 uint64_t m_plcpShortPreambleDelayUs;
00127 WifiMode m_longPlcpHeaderMode;
00128 WifiMode m_shortPlcpHeaderMode;
00129 uint32_t m_plcpHeaderLength;
00130 Time m_maxPacketDuration;
00131 bool m_useConstantNoiseFloor;
00132 double m_constantNoiseFloorW;
00133 double m_rxNoiseRatio;
00134 Events m_events;
00135 bool m_80211a;
00136 Ptr<ErrorRateModel> m_errorRateModel;
00137 };
00138
00139 }
00140
00141 #endif