23 #include "ns3/simulator.h"
39 m_payloadMode (payloadMode),
40 m_preamble (preamble),
42 m_endTime (m_startTime + duration),
54 return m_endTime - m_startTime;
117 return (m_time < o.
m_time);
143 event = Create<InterferenceHelper::Event> (size,
182 double noiseInterferenceW = 0.0;
187 noiseInterferenceW += i->GetDelta ();
193 if (noiseInterferenceW < energyW)
198 return end > now ? end - now : MicroSeconds (0);
207 NiChanges::iterator nowIterator =
GetPosition (now);
208 for (NiChanges::iterator i =
m_niChanges.begin (); i != nowIterator; i++)
228 static const double BOLTZMANN = 1.3803e-23;
233 double noise = noiseFloor + noiseInterference;
234 double snr = signal / noise;
245 if ((event->GetEndTime () == i->GetTime ()) && event->GetRxPowerW () == -i->GetDelta ())
251 ni->insert (ni->begin (),
NiChange (event->GetStartTime (), noiseInterference));
252 ni->push_back (
NiChange (event->GetEndTime (), 0));
253 return noiseInterference;
259 if (duration == NanoSeconds (0))
264 uint64_t nbits = (uint64_t)(rate * duration.
GetSeconds ());
265 double csr =
m_errorRateModel->GetChunkSuccessRate (mode, snir, (uint32_t)nbits);
273 NiChanges::iterator j = ni->begin ();
274 Time previous = (*j).GetTime ();
275 WifiMode payloadMode =
event->GetPayloadMode ();
288 double noiseInterferenceW = (*j).GetDelta ();
289 double powerW =
event->GetRxPowerW ();
291 while (ni->end () != j)
296 if (previous >= plcpPayloadStart)
305 else if (previous >= plcpHtTrainingSymbolsStart)
308 if (current >= plcpPayloadStart)
314 current - plcpPayloadStart,
320 else if (previous >=plcpHsigHeaderStart)
323 if (current >=plcpPayloadStart)
328 current - plcpPayloadStart,
334 plcpHtTrainingSymbolsStart - previous,
338 else if (current >=plcpHtTrainingSymbolsStart)
343 plcpHtTrainingSymbolsStart - previous,
359 else if (previous >= plcpHeaderStart)
362 if (current >=plcpPayloadStart)
367 current - plcpPayloadStart,
375 plcpPayloadStart - previous,
383 plcpHtTrainingSymbolsStart - plcpHsigHeaderStart,
388 plcpHsigHeaderStart - previous,
393 else if (current >=plcpHtTrainingSymbolsStart)
398 plcpHtTrainingSymbolsStart - plcpHsigHeaderStart,
403 plcpHsigHeaderStart - previous,
407 else if (current >=plcpHsigHeaderStart)
412 current - plcpHsigHeaderStart,
417 plcpHsigHeaderStart - previous,
446 if (current >= plcpPayloadStart)
452 current - plcpPayloadStart,
460 plcpPayloadStart - plcpHeaderStart,
467 plcpHtTrainingSymbolsStart - plcpHsigHeaderStart,
473 plcpHsigHeaderStart-plcpHeaderStart,
476 else if (current >=plcpHtTrainingSymbolsStart )
483 plcpHtTrainingSymbolsStart - plcpHsigHeaderStart,
489 plcpHsigHeaderStart-plcpHeaderStart,
493 else if (current >=plcpHsigHeaderStart)
498 current- plcpHsigHeaderStart,
505 plcpHsigHeaderStart-plcpHeaderStart,
510 else if (current >= plcpHeaderStart)
517 current - plcpHeaderStart,
525 current - plcpHeaderStart,
531 noiseInterferenceW += (*j).GetDelta ();
532 previous = (*j).GetTime ();
536 double per = 1 - psr;
548 event->GetPayloadMode ());
568 InterferenceHelper::NiChanges::iterator
static uint32_t GetPlcpHeaderDurationMicroSeconds(WifiMode payloadMode, WifiPreamble preamble)
keep track of time values and allow control of global simulation resolution
smart pointer class similar to boost::intrusive_ptr
Control the scheduling of simulation events.
Ptr< ErrorRateModel > GetErrorRateModel(void) const
double CalculatePer(Ptr< const Event > event, NiChanges *ni) const
bool operator<(const NiChange &o) const
std::vector< NiChange > NiChanges
handles interference calculations
#define NS_ASSERT(condition)
Time GetEnergyDuration(double energyW)
static WifiMode GetMFPlcpHeaderMode(WifiMode payloadMode, WifiPreamble preamble)
double GetRxPowerW(void) const
Ptr< ErrorRateModel > m_errorRateModel
NiChanges::iterator GetPosition(Time moment)
Returns an iterator to the first nichange, which is later than moment.
represent a single transmission modeA WifiMode is implemented by a single integer which is used to lo...
uint32_t GetSize(void) const
void SetErrorRateModel(Ptr< ErrorRateModel > rate)
double GetSeconds(void) const
double CalculateNoiseInterferenceW(Ptr< Event > event, NiChanges *ni) const
Time GetStartTime(void) const
WifiTxVector GetTxVector(void) const
NiChanges m_niChanges
Experimental: needed for energy duration calculation.
void AddNiChangeEvent(NiChange change)
static WifiMode GetPlcpHeaderMode(WifiMode payloadMode, WifiPreamble preamble)
Ptr< InterferenceHelper::Event > Add(uint32_t size, WifiMode payloadMode, enum WifiPreamble preamble, Time duration, double rxPower, WifiTxVector txvector)
uint32_t GetBandwidth(void) const
uint64_t GetPhyRate(void) const
double CalculateChunkSuccessRate(double snir, Time delay, WifiMode mode) const
static uint32_t GetPlcpHtTrainingSymbolDurationMicroSeconds(WifiMode payloadMode, WifiPreamble preamble, WifiTxVector txvector)
double GetDelta(void) const
Time GetEndTime(void) const
enum WifiPreamble GetPreambleType(void) const
NS_LOG_COMPONENT_DEFINE("InterferenceHelper")
NiChange(Time time, double delta)
Time GetDuration(void) const
void SetNoiseFigure(double value)
Time Now(void)
create an ns3::Time instance which contains the current simulation time.
WifiMode GetPayloadMode(void) const
Event(uint32_t size, WifiMode payloadMode, enum WifiPreamble preamble, Time duration, double rxPower, WifiTxVector txvector)
double CalculateSnr(double signal, double noiseInterference, WifiMode mode) const
void AppendEvent(Ptr< Event > event)
double GetNoiseFigure(void) const
static uint32_t GetPlcpPreambleDurationMicroSeconds(WifiMode payloadMode, WifiPreamble preamble)
static uint32_t GetPlcpHtSigHeaderDurationMicroSeconds(WifiMode payloadMode, WifiPreamble preamble)