20 #include "interference-helper.h"
22 #include "error-rate-model.h"
23 #include "ns3/simulator.h"
35 InterferenceHelper::Event::Event (uint32_t size, WifiMode payloadMode,
37 Time duration,
double rxPower)
39 m_payloadMode (payloadMode),
40 m_preamble (preamble),
41 m_startTime (Simulator::
Now ()),
42 m_endTime (m_startTime + duration),
46 InterferenceHelper::Event::~Event ()
51 InterferenceHelper::Event::GetDuration (
void)
const
53 return m_endTime - m_startTime;
56 InterferenceHelper::Event::GetStartTime (
void)
const
61 InterferenceHelper::Event::GetEndTime (
void)
const
66 InterferenceHelper::Event::GetRxPowerW (
void)
const
71 InterferenceHelper::Event::GetSize (
void)
const
76 InterferenceHelper::Event::GetPayloadMode (
void)
const
81 InterferenceHelper::Event::GetPreambleType (
void)
const
91 InterferenceHelper::NiChange::NiChange (Time time,
double delta)
97 InterferenceHelper::NiChange::GetTime (
void)
const
102 InterferenceHelper::NiChange::GetDelta (
void)
const
107 InterferenceHelper::NiChange::operator < (
const InterferenceHelper::NiChange& o)
const
109 return (m_time < o.m_time);
116 InterferenceHelper::InterferenceHelper ()
117 : m_errorRateModel (0),
122 InterferenceHelper::~InterferenceHelper ()
125 m_errorRateModel = 0;
128 Ptr<InterferenceHelper::Event>
129 InterferenceHelper::Add (uint32_t size, WifiMode payloadMode,
131 Time duration,
double rxPowerW)
133 Ptr<InterferenceHelper::Event> event;
135 event = Create<InterferenceHelper::Event> (size,
146 InterferenceHelper::SetNoiseFigure (
double value)
152 InterferenceHelper::GetNoiseFigure (
void)
const
158 InterferenceHelper::SetErrorRateModel (Ptr<ErrorRateModel> rate)
160 m_errorRateModel = rate;
164 InterferenceHelper::GetErrorRateModel (
void)
const
166 return m_errorRateModel;
173 double noiseInterferenceW = 0.0;
175 noiseInterferenceW = m_firstPower;
178 noiseInterferenceW += i->GetDelta ();
184 if (noiseInterferenceW < energyW)
198 NiChanges::iterator nowIterator =
GetPosition (now);
199 for (NiChanges::iterator i =
m_niChanges.begin (); i != nowIterator; i++)
201 m_firstPower += i->GetDelta ();
208 AddNiChangeEvent (NiChange (event->GetStartTime (),
event->GetRxPowerW ()));
210 AddNiChangeEvent (NiChange (event->GetEndTime (), -
event->GetRxPowerW ()));
216 InterferenceHelper::CalculateSnr (
double signal,
double noiseInterference, WifiMode mode)
const
219 static const double BOLTZMANN = 1.3803e-23;
221 double Nt = BOLTZMANN * 290.0 * mode.GetBandwidth ();
224 double noise = noiseFloor + noiseInterference;
225 double snr = signal / noise;
230 InterferenceHelper::CalculateNoiseInterferenceW (Ptr<InterferenceHelper::Event> event, NiChanges *ni)
const
232 double noiseInterference = m_firstPower;
236 if ((event->GetEndTime () == i->GetTime ()) && event->GetRxPowerW () == -i->GetDelta ())
242 ni->insert (ni->begin (), NiChange (event->GetStartTime (), noiseInterference));
243 ni->push_back (NiChange (event->GetEndTime (), 0));
244 return noiseInterference;
248 InterferenceHelper::CalculateChunkSuccessRate (
double snir, Time duration, WifiMode mode)
const
254 uint32_t rate = mode.GetPhyRate ();
255 uint64_t nbits = (uint64_t)(rate * duration.GetSeconds ());
256 double csr = m_errorRateModel->GetChunkSuccessRate (mode, snir, (uint32_t)nbits);
261 InterferenceHelper::CalculatePer (Ptr<const InterferenceHelper::Event> event, NiChanges *ni)
const
264 NiChanges::iterator j = ni->begin ();
265 Time previous = (*j).GetTime ();
266 WifiMode payloadMode =
event->GetPayloadMode ();
271 double noiseInterferenceW = (*j).GetDelta ();
272 double powerW =
event->GetRxPowerW ();
275 while (ni->end () != j)
277 Time current = (*j).GetTime ();
280 if (previous >= plcpPayloadStart)
282 psr *= CalculateChunkSuccessRate (CalculateSnr (powerW,
288 else if (previous >= plcpHeaderStart)
290 if (current >= plcpPayloadStart)
292 psr *= CalculateChunkSuccessRate (CalculateSnr (powerW,
295 plcpPayloadStart - previous,
297 psr *= CalculateChunkSuccessRate (CalculateSnr (powerW,
300 current - plcpPayloadStart,
306 psr *= CalculateChunkSuccessRate (CalculateSnr (powerW,
315 if (current >= plcpPayloadStart)
317 psr *= CalculateChunkSuccessRate (CalculateSnr (powerW,
320 plcpPayloadStart - plcpHeaderStart,
322 psr *= CalculateChunkSuccessRate (CalculateSnr (powerW,
325 current - plcpPayloadStart,
328 else if (current >= plcpHeaderStart)
330 psr *= CalculateChunkSuccessRate (CalculateSnr (powerW,
333 current - plcpHeaderStart,
338 noiseInterferenceW += (*j).GetDelta ();
339 previous = (*j).GetTime ();
343 double per = 1 - psr;
348 struct InterferenceHelper::SnrPer
349 InterferenceHelper::CalculateSnrPer (Ptr<InterferenceHelper::Event> event)
352 double noiseInterferenceW = CalculateNoiseInterferenceW (event, &ni);
353 double snr = CalculateSnr (event->GetRxPowerW (),
355 event->GetPayloadMode ());
360 double per = CalculatePer (event, &ni);
362 struct SnrPer snrPer;
369 InterferenceHelper::EraseEvents (
void)
375 InterferenceHelper::NiChanges::iterator
382 InterferenceHelper::AddNiChangeEvent (NiChange change)
387 InterferenceHelper::NotifyRxStart ()
392 InterferenceHelper::NotifyRxEnd ()
Time NanoSeconds(uint64_t ns)
create ns3::Time instances in units of nanoseconds.
static uint32_t GetPlcpHeaderDurationMicroSeconds(WifiMode payloadMode, WifiPreamble preamble)
smart pointer class similar to boost::intrusive_ptr
#define NS_ASSERT(condition)
Time GetEnergyDuration(double energyW)
#define NS_LOG_COMPONENT_DEFINE(name)
NiChanges::iterator GetPosition(Time moment)
Returns an iterator to the first nichange, which is later than moment.
NiChanges m_niChanges
Experimental: needed for energy duration calculation.
static WifiMode GetPlcpHeaderMode(WifiMode payloadMode, WifiPreamble preamble)
Time Now(void)
create an ns3::Time instance which contains the current simulation time.
static uint32_t GetPlcpPreambleDurationMicroSeconds(WifiMode payloadMode, WifiPreamble preamble)
Time MicroSeconds(uint64_t us)
create ns3::Time instances in units of microseconds.