INET Framework for OMNeT++/OMNEST
inet::physicallayer::Ieee80211LayeredOfdmReceiver Class Reference

#include <Ieee80211LayeredOfdmReceiver.h>

Inheritance diagram for inet::physicallayer::Ieee80211LayeredOfdmReceiver:
inet::physicallayer::SnirReceiverBase inet::physicallayer::ReceiverBase inet::physicallayer::IReceiver inet::IPrintableObject

Public Types

enum  LevelOfDetail { PACKET_DOMAIN, BIT_DOMAIN, SYMBOL_DOMAIN, SAMPLE_DOMAIN }
 
- Public Types inherited from inet::IPrintableObject
enum  PrintLevel {
  PRINT_LEVEL_TRACE, PRINT_LEVEL_DEBUG, PRINT_LEVEL_DETAIL, PRINT_LEVEL_INFO,
  PRINT_LEVEL_COMPLETE = INT_MIN
}
 
enum  PrintFlag { PRINT_FLAG_FORMATTED = (1 << 0), PRINT_FLAG_MULTILINE = (1 << 1) }
 

Public Member Functions

virtual ~Ieee80211LayeredOfdmReceiver ()
 
virtual const Ieee80211OfdmModegetMode (const Packet *packet) const
 
virtual bool computeIsReceptionPossible (const IListening *listening, const IReception *reception, IRadioSignal::SignalPart part) const override
 Returns whether the reception of the provided part is possible or not. More...
 
virtual const IListeningDecisioncomputeListeningDecision (const IListening *listening, const IInterference *interference) const override
 Returns the result of the listening process specifying the reception state of the receiver. More...
 
virtual const IListeningcreateListening (const IRadio *radio, const simtime_t startTime, const simtime_t endTime, const Coord &startPosition, const Coord &endPosition) const override
 Returns a description of how the receiver is listening on the medium. More...
 
virtual const IReceptionResultcomputeReceptionResult (const IListening *listening, const IReception *reception, const IInterference *interference, const ISnir *snir, const std::vector< const IReceptionDecision * > *decisions) const override
 Returns the complete result of the reception process for the provided reception. More...
 
virtual std::ostream & printToStream (std::ostream &stream, int level, int evFlags=0) const override
 Prints this object to the provided output stream. More...
 
- Public Member Functions inherited from inet::physicallayer::SnirReceiverBase
virtual double getSNIRThreshold () const
 
virtual bool computeIsReceptionSuccessful (const IListening *listening, const IReception *reception, IRadioSignal::SignalPart part, const IInterference *interference, const ISnir *snir) const override
 Returns whether the reception of the provided part is actually successful or failed by the receiver. More...
 
- Public Member Functions inherited from inet::physicallayer::ReceiverBase
 ReceiverBase ()
 
virtual W getMinInterferencePower () const override
 Returns the minimum interference power below which receptions are to be ignored while computing the interference. More...
 
virtual W getMinReceptionPower () const override
 Returns the minimum reception power below which successful reception is definitely not possible. More...
 
virtual bool computeIsReceptionPossible (const IListening *listening, const ITransmission *transmission) const override
 Returns whether the reception of the provided transmission is possible or not independently of the reception conditions. More...
 
virtual bool computeIsReceptionAttempted (const IListening *listening, const IReception *reception, IRadioSignal::SignalPart part, const IInterference *interference) const override
 Returns whether the reception of the provided part is actually attempted or ignored by the receiver. More...
 
virtual const IReceptionDecisioncomputeReceptionDecision (const IListening *listening, const IReception *reception, IRadioSignal::SignalPart part, const IInterference *interference, const ISnir *snir) const override
 Returns the reception decision for the transmission part that specifies whether the reception is possible, attempted, and successful. More...
 
- Public Member Functions inherited from inet::IPrintableObject
virtual ~IPrintableObject ()
 
virtual std::string printToString () const
 
virtual std::string printToString (int level, int evFlags=0) const
 
virtual std::string getInfoStringRepresentation (int evFlags=0) const
 
virtual std::string getDetailStringRepresentation (int evFlags=0) const
 
virtual std::string getDebugStringRepresentation (int evFlags=0) const
 
virtual std::string getTraceStringRepresentation (int evFlags=0) const
 
virtual std::string getCompleteStringRepresentation (int evFlags=0) const
 

Protected Member Functions

virtual void initialize (int stage) override
 
const IReceptionAnalogModelcreateAnalogModel (const LayeredTransmission *transmission, const ISnir *snir) const
 
const IReceptionSampleModelcreateSampleModel (const LayeredTransmission *transmission, const ISnir *snir) const
 
const IReceptionSymbolModelcreateSignalFieldSymbolModel (const IReceptionSymbolModel *symbolModel) const
 
const IReceptionSymbolModelcreateDataFieldSymbolModel (const IReceptionSymbolModel *symbolModel) const
 
const IReceptionSymbolModelcreateSymbolModel (const LayeredTransmission *transmission, const ISnir *snir) const
 
const IReceptionSymbolModelcreateCompleteSymbolModel (const IReceptionSymbolModel *signalFieldSymbolModel, const IReceptionSymbolModel *dataFieldSymbolModel) const
 
const IReceptionBitModelcreateSignalFieldBitModel (const IReceptionBitModel *bitModel, const IReceptionSymbolModel *symbolModel) const
 
const IReceptionBitModelcreateDataFieldBitModel (const IReceptionBitModel *bitModel, const IReceptionSymbolModel *symbolModel, const IReceptionPacketModel *signalFieldPacketModel, const IReceptionBitModel *signalFieldBitModel) const
 
const IReceptionBitModelcreateBitModel (const LayeredTransmission *transmission, const ISnir *snir) const
 
const IReceptionBitModelcreateCompleteBitModel (const IReceptionBitModel *signalFieldBitModel, const IReceptionBitModel *dataFieldBitModel) const
 
const IReceptionPacketModelcreateSignalFieldPacketModel (const IReceptionBitModel *signalFieldBitModel) const
 
const IReceptionPacketModelcreateDataFieldPacketModel (const IReceptionBitModel *signalFieldBitModel, const IReceptionBitModel *dataFieldBitModel, const IReceptionPacketModel *signalFieldPacketModel) const
 
const IReceptionPacketModelcreatePacketModel (const LayeredTransmission *transmission, const ISnir *snir) const
 
const IReceptionPacketModelcreateCompletePacketModel (const char *name, const IReceptionPacketModel *signalFieldPacketModel, const IReceptionPacketModel *dataFieldPacketModel) const
 
const Ieee80211OfdmModecomputeMode (Hz bandwidth) const
 
unsigned int getSignalFieldLength (const BitVector *signalField) const
 
unsigned int calculatePadding (unsigned int dataFieldLengthInBits, const ApskModulationBase *modulation, double codeRate) const
 
double getCodeRateFromDecoderModule (const IDecoder *decoder) const
 
- Protected Member Functions inherited from inet::physicallayer::ReceiverBase
virtual int numInitStages () const override
 
virtual W computeSignalPower (const IListening *listening, const ISnir *snir, const IInterference *interference) const
 
virtual PacketcomputeReceivedPacket (const ISnir *snir, bool isReceptionSuccessful) const
 

Protected Attributes

LevelOfDetail levelOfDetail
 
const Ieee80211OfdmModemode = nullptr
 
const ILayeredErrorModelerrorModel = nullptr
 
const IDecoderdataDecoder = nullptr
 
const IDecodersignalDecoder = nullptr
 
const IDemodulatordataDemodulator = nullptr
 
const IDemodulatorsignalDemodulator = nullptr
 
const IPulseFilterpulseFilter = nullptr
 
const IAnalogDigitalConverteranalogDigitalConverter = nullptr
 
W energyDetection
 
W sensitivity
 
Hz centerFrequency
 
Hz bandwidth
 
Hz channelSpacing
 
double snirThreshold
 
bool isCompliant
 
- Protected Attributes inherited from inet::physicallayer::SnirReceiverBase
double snirThreshold = NaN
 
SnirThresholdMode snirThresholdMode = SnirThresholdMode::STM_UNDEFINED
 

Additional Inherited Members

- Protected Types inherited from inet::physicallayer::SnirReceiverBase
enum  SnirThresholdMode { SnirThresholdMode::STM_UNDEFINED = -1, SnirThresholdMode::STM_MIN, SnirThresholdMode::STM_MEAN }
 

Member Enumeration Documentation

◆ LevelOfDetail

Enumerator
PACKET_DOMAIN 
BIT_DOMAIN 
SYMBOL_DOMAIN 
SAMPLE_DOMAIN 
30  {
32  BIT_DOMAIN,
35  };

Constructor & Destructor Documentation

◆ ~Ieee80211LayeredOfdmReceiver()

inet::physicallayer::Ieee80211LayeredOfdmReceiver::~Ieee80211LayeredOfdmReceiver ( )
virtual
471 {
472  if (!isCompliant) {
473  delete mode->getPreambleMode();
474  delete mode->getSignalMode();
475  delete mode->getDataMode();
476  delete mode;
477  }
478 }

Member Function Documentation

◆ calculatePadding()

unsigned int inet::physicallayer::Ieee80211LayeredOfdmReceiver::calculatePadding ( unsigned int  dataFieldLengthInBits,
const ApskModulationBase modulation,
double  codeRate 
) const
protected
194 {
195  ASSERT(modulation != nullptr);
196  unsigned int codedBitsPerOFDMSymbol = modulation->getCodeWordSize() * NUMBER_OF_OFDM_DATA_SUBCARRIERS;
197  unsigned int dataBitsPerOFDMSymbol = codedBitsPerOFDMSymbol * codeRate;
198  return dataBitsPerOFDMSymbol - dataFieldLengthInBits % dataBitsPerOFDMSymbol;
199 }

Referenced by createDataFieldBitModel().

◆ computeIsReceptionPossible()

bool inet::physicallayer::Ieee80211LayeredOfdmReceiver::computeIsReceptionPossible ( const IListening listening,
const IReception reception,
IRadioSignal::SignalPart  part 
) const
overridevirtual

Returns whether the reception of the provided part is possible or not.

For example, it might check if the reception power is above sensitivity.

This function may be called before the reception actually starts at the receiver, thus it must be purely functional and support optimistic parallel computation.

Reimplemented from inet::physicallayer::ReceiverBase.

452 {
453  const BandListening *bandListening = check_and_cast<const BandListening *>(listening);
454  const LayeredReception *scalarReception = check_and_cast<const LayeredReception *>(reception);
455  // TODO scalar
456  const ScalarReceptionSignalAnalogModel *analogModel = check_and_cast<const ScalarReceptionSignalAnalogModel *>(scalarReception->getAnalogModel());
457  if (bandListening->getCenterFrequency() != analogModel->getCenterFrequency() || bandListening->getBandwidth() != analogModel->getBandwidth()) {
458  EV_DEBUG << "Computing reception possible: listening and reception bands are different -> reception is impossible" << endl;
459  return false;
460  }
461  else {
462  const INarrowbandSignal *narrowbandSignalAnalogModel = check_and_cast<const INarrowbandSignal *>(reception->getAnalogModel());
463  W minReceptionPower = narrowbandSignalAnalogModel->computeMinPower(reception->getStartTime(), reception->getEndTime());
464  bool isReceptionPossible = minReceptionPower >= sensitivity;
465  EV_DEBUG << "Computing reception possible" << EV_FIELD(minReceptionPower) << EV_FIELD(sensitivity) << " -> reception is " << (isReceptionPossible ? "possible" : "impossible") << endl;
466  return isReceptionPossible;
467  }
468 }

◆ computeListeningDecision()

const IListeningDecision * inet::physicallayer::Ieee80211LayeredOfdmReceiver::computeListeningDecision ( const IListening listening,
const IInterference interference 
) const
overridevirtual

Returns the result of the listening process specifying the reception state of the receiver.

This function must be purely functional and support optimistic parallel computation.

Implements inet::physicallayer::IReceiver.

436 {
437  const IRadio *receiver = listening->getReceiver();
438  const IRadioMedium *radioMedium = receiver->getMedium();
439  const IAnalogModel *analogModel = radioMedium->getAnalogModel();
440  const INoise *noise = analogModel->computeNoise(listening, interference);
441  const NarrowbandNoiseBase *flatNoise = check_and_cast<const NarrowbandNoiseBase *>(noise);
442  W maxPower = flatNoise->computeMaxPower(listening->getStartTime(), listening->getEndTime());
443  bool isListeningPossible = maxPower >= energyDetection;
444  delete noise;
445  EV_DEBUG << "Computing listening possible: maximum power = " << maxPower << ", energy detection = " << energyDetection << " -> listening is " << (isListeningPossible ? "possible" : "impossible") << endl;
446  return new ListeningDecision(listening, isListeningPossible);
447 }

◆ computeMode()

const Ieee80211OfdmMode * inet::physicallayer::Ieee80211LayeredOfdmReceiver::computeMode ( Hz  bandwidth) const
protected
348 {
349  const Ieee80211OfdmDecoderModule *ofdmSignalDecoderModule = check_and_cast<const Ieee80211OfdmDecoderModule *>(signalDecoder);
350  const Ieee80211OfdmDecoderModule *ofdmDataDecoderModule = check_and_cast<const Ieee80211OfdmDecoderModule *>(dataDecoder);
351  const Ieee80211OfdmDemodulatorModule *ofdmSignalDemodulatorModule = check_and_cast<const Ieee80211OfdmDemodulatorModule *>(signalDemodulator);
352  const Ieee80211OfdmDemodulatorModule *ofdmDataDemodulatorModule = check_and_cast<const Ieee80211OfdmDemodulatorModule *>(dataDemodulator);
353  const Ieee80211OfdmSignalMode *signalMode = new Ieee80211OfdmSignalMode(ofdmSignalDecoderModule->getCode(), ofdmSignalDemodulatorModule->getModulation(), channelSpacing, bandwidth, 0);
354  const Ieee80211OfdmDataMode *dataMode = new Ieee80211OfdmDataMode(ofdmDataDecoderModule->getCode(), ofdmDataDemodulatorModule->getModulation(), channelSpacing, bandwidth);
355  return new Ieee80211OfdmMode("", new Ieee80211OfdmPreambleMode(channelSpacing), signalMode, dataMode, channelSpacing, bandwidth);
356 }

Referenced by computeReceptionResult().

◆ computeReceptionResult()

const IReceptionResult * inet::physicallayer::Ieee80211LayeredOfdmReceiver::computeReceptionResult ( const IListening listening,
const IReception reception,
const IInterference interference,
const ISnir snir,
const std::vector< const IReceptionDecision * > *  decisions 
) const
overridevirtual

Returns the complete result of the reception process for the provided reception.

This function may be called before the reception actually starts at the receiver, thus it must be purely functional and support optimistic parallel computation.

Reimplemented from inet::physicallayer::ReceiverBase.

359 {
360  const Ieee80211LayeredTransmission *transmission = dynamic_cast<const Ieee80211LayeredTransmission *>(reception->getTransmission());
361  // corruted model
362  const IReceptionAnalogModel *analogModel = createAnalogModel(transmission, snir);
363  const IReceptionSampleModel *sampleModel = createSampleModel(transmission, snir);
364  const IReceptionSymbolModel *symbolModel = createSymbolModel(transmission, snir);
365  const IReceptionBitModel *bitModel = createBitModel(transmission, snir);
366  const IReceptionPacketModel *packetModel = createPacketModel(transmission, snir);
367  // signal field model
368  const IReceptionSymbolModel *signalFieldSymbolModel = createSignalFieldSymbolModel(symbolModel);
369  const IReceptionSymbolModel *dataFieldSymbolModel = createDataFieldSymbolModel(symbolModel);
370  const IReceptionBitModel *signalFieldBitModel = createSignalFieldBitModel(bitModel, signalFieldSymbolModel);
371  const IReceptionPacketModel *signalFieldPacketModel = createSignalFieldPacketModel(signalFieldBitModel);
372  // determine mode
373  if (isCompliant) {
374  auto packet = signalFieldPacketModel != nullptr ? signalFieldPacketModel->getPacket() : packetModel->getPacket();
375  const auto& signalFieldBytesChunk = packet->peekAllAsBytes();
376  uint8_t rate = signalFieldBytesChunk->getByte(0) >> 4;
378  if (mode == nullptr)
379  const_cast<Packet *>(packet)->setBitError(true);
380  }
381  else if (!mode)
383  // data field model
384  const IReceptionBitModel *dataFieldBitModel = mode != nullptr ? createDataFieldBitModel(bitModel, dataFieldSymbolModel, signalFieldPacketModel, signalFieldBitModel) : nullptr;
385  const IReceptionPacketModel *dataFieldPacketModel = mode != nullptr ? createDataFieldPacketModel(signalFieldBitModel, dataFieldBitModel, signalFieldPacketModel) : nullptr;
386  // complete model
387 // if (!sampleModel)
388 // sampleModel = createCompleteSampleModel(signalFieldSampleModel, dataFieldSampleModel);
389  if (!symbolModel)
390  symbolModel = createCompleteSymbolModel(signalFieldSymbolModel, dataFieldSymbolModel);
391  if (!bitModel)
392  bitModel = createCompleteBitModel(signalFieldBitModel, dataFieldBitModel);
393  if (!packetModel)
394  packetModel = createCompletePacketModel(transmission->getPacket()->getName(), signalFieldPacketModel, dataFieldPacketModel);
395  // delete signal and data field models
396  delete signalFieldSymbolModel;
397  delete dataFieldSymbolModel;
398  delete signalFieldBitModel;
399  delete dataFieldBitModel;
400  if (signalFieldPacketModel != nullptr) {
401  delete signalFieldPacketModel->getPacket();
402  delete signalFieldPacketModel;
403  }
404  if (dataFieldPacketModel != nullptr) {
405  delete dataFieldPacketModel->getPacket();
406  delete dataFieldPacketModel;
407  }
408  // add indications
409  auto packet = const_cast<Packet *>(packetModel->getPacket());
410  auto snirInd = packet->addTagIfAbsent<SnirInd>();
411  snirInd->setMinimumSnir(snir->getMin());
412  snirInd->setMaximumSnir(snir->getMax());
413  snirInd->setAverageSnir(snir->getMean());
414  auto errorRateInd = packet->addTagIfAbsent<ErrorRateInd>();
415  if (symbolModel != nullptr)
416  errorRateInd->setSymbolErrorRate(symbolModel->getSymbolErrorRate());
417  if (bitModel != nullptr)
418  errorRateInd->setBitErrorRate(bitModel->getBitErrorRate());
419  if (packetModel != nullptr)
420  errorRateInd->setPacketErrorRate(packetModel->getPacketErrorRate());
421  auto modeInd = packet->addTagIfAbsent<Ieee80211ModeInd>();
422  modeInd->setMode(transmission->getMode());
423  auto channelInd = packet->addTagIfAbsent<Ieee80211ChannelInd>();
424  channelInd->setChannel(transmission->getChannel());
425  return new LayeredReceptionResult(reception, decisions, packetModel, bitModel, symbolModel, sampleModel, analogModel);
426 }

◆ createAnalogModel()

const IReceptionAnalogModel * inet::physicallayer::Ieee80211LayeredOfdmReceiver::createAnalogModel ( const LayeredTransmission transmission,
const ISnir snir 
) const
protected
84 {
85  return nullptr;
86 }

Referenced by computeReceptionResult().

◆ createBitModel()

const IReceptionBitModel * inet::physicallayer::Ieee80211LayeredOfdmReceiver::createBitModel ( const LayeredTransmission transmission,
const ISnir snir 
) const
protected
119 {
120  if (levelOfDetail == BIT_DOMAIN)
121  return errorModel->computeBitModel(transmission, snir);
122  return nullptr;
123 }

Referenced by computeReceptionResult().

◆ createCompleteBitModel()

const IReceptionBitModel * inet::physicallayer::Ieee80211LayeredOfdmReceiver::createCompleteBitModel ( const IReceptionBitModel signalFieldBitModel,
const IReceptionBitModel dataFieldBitModel 
) const
protected
148 {
149  if (levelOfDetail >= BIT_DOMAIN) {
150  if (dataFieldBitModel == nullptr)
151  return new ReceptionBitModel(signalFieldBitModel->getHeaderLength(), signalFieldBitModel->getHeaderBitRate(), b(-1), bps(NaN), new BitVector(*signalFieldBitModel->getBits()), NaN);
152  else {
153  BitVector *bits = new BitVector(*signalFieldBitModel->getBits());
154  const BitVector *dataBits = dataFieldBitModel->getBits();
155  for (unsigned int i = 0; i < dataBits->getSize(); i++)
156  bits->appendBit(dataBits->getBit(i));
157  return new ReceptionBitModel(signalFieldBitModel->getHeaderLength(), signalFieldBitModel->getHeaderBitRate(), dataFieldBitModel->getDataLength(), dataFieldBitModel->getDataBitRate(), bits, NaN);
158  }
159  }
160  return nullptr;
161 }

Referenced by computeReceptionResult().

◆ createCompletePacketModel()

const IReceptionPacketModel * inet::physicallayer::Ieee80211LayeredOfdmReceiver::createCompletePacketModel ( const char *  name,
const IReceptionPacketModel signalFieldPacketModel,
const IReceptionPacketModel dataFieldPacketModel 
) const
protected
335 {
336  if (dataFieldPacketModel == nullptr)
337  return new ReceptionPacketModel(signalFieldPacketModel->getPacket()->dup(), bps(NaN), NaN);
338  else {
339  Packet *packet = new Packet(name);
340  packet->insertAtBack(signalFieldPacketModel->getPacket()->peekAllAsBits());
341  packet->insertAtBack(dataFieldPacketModel->getPacket()->peekAllAsBits());
342  packet->setBitError(signalFieldPacketModel->getPacket()->hasBitError() | dataFieldPacketModel->getPacket()->hasBitError());
343  return new ReceptionPacketModel(packet, bps(NaN), NaN);
344  }
345 }

Referenced by computeReceptionResult().

◆ createCompleteSymbolModel()

const IReceptionSymbolModel * inet::physicallayer::Ieee80211LayeredOfdmReceiver::createCompleteSymbolModel ( const IReceptionSymbolModel signalFieldSymbolModel,
const IReceptionSymbolModel dataFieldSymbolModel 
) const
protected
322 {
323  if (levelOfDetail >= SYMBOL_DOMAIN) {
324  const std::vector<const ISymbol *> *symbols = signalFieldSymbolModel->getSymbols();
325  std::vector<const ISymbol *> *completeSymbols = new std::vector<const ISymbol *>(*symbols);
326  symbols = dataFieldSymbolModel->getSymbols();
327  for (auto& symbol : *symbols)
328  completeSymbols->push_back(new Ieee80211OfdmSymbol(*static_cast<const Ieee80211OfdmSymbol *>(symbol)));
329  return new Ieee80211OfdmReceptionSymbolModel(signalFieldSymbolModel->getHeaderSymbolLength(), signalFieldSymbolModel->getHeaderSymbolRate(), dataFieldSymbolModel->getPayloadSymbolLength(), dataFieldSymbolModel->getPayloadSymbolRate(), completeSymbols);
330  }
331  return nullptr;
332 }

Referenced by computeReceptionResult().

◆ createDataFieldBitModel()

const IReceptionBitModel * inet::physicallayer::Ieee80211LayeredOfdmReceiver::createDataFieldBitModel ( const IReceptionBitModel bitModel,
const IReceptionSymbolModel symbolModel,
const IReceptionPacketModel signalFieldPacketModel,
const IReceptionBitModel signalFieldBitModel 
) const
protected
274 {
275  const IReceptionBitModel *dataFieldBitModel = nullptr;
276  if (levelOfDetail > BIT_DOMAIN) { // Create from symbol model
277  if (dataDemodulator) // non-compliant
278  dataFieldBitModel = dataDemodulator->demodulate(dataFieldSymbolModel);
279  else { // compliant
280  const Ieee80211OfdmDataMode *dataMode = mode->getDataMode();
281  const Ieee80211OfdmDemodulator ofdmDemodulator(dataMode->getModulation());
282  dataFieldBitModel = ofdmDemodulator.demodulate(dataFieldSymbolModel);
283  }
284  }
285  else if (levelOfDetail == BIT_DOMAIN) { // Create from bit model (made by the error model)
286  const ConvolutionalCode *convolutionalCode = nullptr;
287  const ApskModulationBase *modulation = nullptr;
288  double codeRate = NaN;
289  const auto& bytesChunk = signalFieldPacketModel->getPacket()->peekAllAsBytes();
290  unsigned int psduLengthInBits = getSignalFieldLength(new BitVector(bytesChunk->getBytes())) * 8;
291  unsigned int dataFieldLengthInBits = psduLengthInBits + PPDU_SERVICE_FIELD_BITS_LENGTH + PPDU_TAIL_BITS_LENGTH;
292  if (isCompliant) {
293  const Ieee80211OfdmDataMode *dataMode = mode->getDataMode();
294  modulation = dataMode->getModulation()->getSubcarrierModulation();
295  const Ieee80211OfdmCode *code = dataMode->getCode();
296  convolutionalCode = code->getConvolutionalCode();
297  codeRate = convolutionalCode->getCodeRatePuncturingN() * 1.0 / convolutionalCode->getCodeRatePuncturingK();
298  }
299  else {
300  const Ieee80211OfdmDecoderModule *decoderModule = check_and_cast<const Ieee80211OfdmDecoderModule *>(dataDecoder);
301  const Ieee80211OfdmCode *code = decoderModule->getCode();
302  convolutionalCode = code->getConvolutionalCode();
305  }
306  dataFieldLengthInBits += calculatePadding(dataFieldLengthInBits, modulation, 1.0 / codeRate);
307 // ASSERT(dataFieldLengthInBits % convolutionalCode->getCodeRatePuncturingK() == 0);
308  unsigned int encodedDataFieldLengthInBits = dataFieldLengthInBits * codeRate;
309  const BitVector *bits = bitModel->getBits();
310  unsigned int encodedSignalFieldLength = b(signalFieldBitModel->getHeaderLength()).get();
311  if (dataFieldLengthInBits + encodedSignalFieldLength > bits->getSize())
312  throw cRuntimeError("The calculated data field length = %d is greater then the actual bitvector length = %d", dataFieldLengthInBits, bits->getSize());
313  BitVector *dataBits = new BitVector();
314  for (unsigned int i = 0; i < encodedDataFieldLengthInBits; i++)
315  dataBits->appendBit(bits->getBit(encodedSignalFieldLength + i));
316  dataFieldBitModel = new ReceptionBitModel(b(-1), bps(NaN), b(encodedDataFieldLengthInBits), bitModel->getDataBitRate(), dataBits, NaN);
317  }
318  return dataFieldBitModel;
319 }

Referenced by computeReceptionResult().

◆ createDataFieldPacketModel()

const IReceptionPacketModel * inet::physicallayer::Ieee80211LayeredOfdmReceiver::createDataFieldPacketModel ( const IReceptionBitModel signalFieldBitModel,
const IReceptionBitModel dataFieldBitModel,
const IReceptionPacketModel signalFieldPacketModel 
) const
protected
164 {
165  const IReceptionPacketModel *dataFieldPacketModel = nullptr;
166  if (levelOfDetail > PACKET_DOMAIN) { // Create from the bit model
167  if (dataDecoder)
168  dataFieldPacketModel = dataDecoder->decode(dataFieldBitModel);
169  else {
170  const Ieee80211OfdmCode *code = mode->getDataMode()->getCode();
171  const Ieee80211OfdmDecoder decoder(code);
172  dataFieldPacketModel = decoder.decode(dataFieldBitModel);
173  }
174  }
175  return dataFieldPacketModel;
176 }

Referenced by computeReceptionResult().

◆ createDataFieldSymbolModel()

const IReceptionSymbolModel * inet::physicallayer::Ieee80211LayeredOfdmReceiver::createDataFieldSymbolModel ( const IReceptionSymbolModel symbolModel) const
protected
225 {
226  const Ieee80211OfdmReceptionSymbolModel *dataFieldSymbolModel = nullptr;
228  throw cRuntimeError("This level of detail is unimplemented!");
229  else if (levelOfDetail == SYMBOL_DOMAIN) { // Create from symbol model (made by the error model)
230  const std::vector<const ISymbol *> *symbols = receptionSymbolModel->getSymbols();
231  std::vector<const ISymbol *> *dataSymbols = new std::vector<const ISymbol *>();
232  const Ieee80211OfdmSymbol *ofdmSymbol = nullptr;
233  for (unsigned int i = 1; i < symbols->size(); i++) {
234  ofdmSymbol = check_and_cast<const Ieee80211OfdmSymbol *>(symbols->at(i));
235  dataSymbols->push_back(new Ieee80211OfdmSymbol(*ofdmSymbol));
236  }
237  dataFieldSymbolModel = new Ieee80211OfdmReceptionSymbolModel(-1, NaN, symbols->size() - 1, receptionSymbolModel->getPayloadSymbolRate(), dataSymbols);
238  }
239  return dataFieldSymbolModel;
240 }

Referenced by computeReceptionResult().

◆ createListening()

const IListening * inet::physicallayer::Ieee80211LayeredOfdmReceiver::createListening ( const IRadio radio,
const simtime_t  startTime,
const simtime_t  endTime,
const Coord startPosition,
const Coord endPosition 
) const
overridevirtual

Returns a description of how the receiver is listening on the medium.

Implements inet::physicallayer::IReceiver.

429 {
430  // We assume that in compliant mode the bandwidth is always 20MHz.
431  return new BandListening(radio, startTime, endTime, startPosition, endPosition, centerFrequency, isCompliant ? Hz(20000000) : bandwidth);
432 }

◆ createPacketModel()

const IReceptionPacketModel * inet::physicallayer::Ieee80211LayeredOfdmReceiver::createPacketModel ( const LayeredTransmission transmission,
const ISnir snir 
) const
protected
126 {
128  return errorModel->computePacketModel(transmission, snir);
129  return nullptr;
130 }

Referenced by computeReceptionResult().

◆ createSampleModel()

const IReceptionSampleModel * inet::physicallayer::Ieee80211LayeredOfdmReceiver::createSampleModel ( const LayeredTransmission transmission,
const ISnir snir 
) const
protected
112 {
114  return errorModel->computeSampleModel(transmission, snir);
115  return nullptr;
116 }

Referenced by computeReceptionResult().

◆ createSignalFieldBitModel()

const IReceptionBitModel * inet::physicallayer::Ieee80211LayeredOfdmReceiver::createSignalFieldBitModel ( const IReceptionBitModel bitModel,
const IReceptionSymbolModel symbolModel 
) const
protected
243 {
244  const IReceptionBitModel *signalFieldBitModel = nullptr;
245  if (levelOfDetail > BIT_DOMAIN) { // Create from symbol model
246  if (signalDemodulator) // non-compliant
247  signalFieldBitModel = signalDemodulator->demodulate(signalFieldSymbolModel);
248  else { // compliant
249  // In compliant mode, the signal field modulation is always BPSK
250  const Ieee80211OfdmModulation *signalModulation = new Ieee80211OfdmModulation(&BpskModulation::singleton);
251  const Ieee80211OfdmDemodulator demodulator(signalModulation);
252  signalFieldBitModel = demodulator.demodulate(signalFieldSymbolModel);
253  delete signalModulation;
254  }
255  }
256  else if (levelOfDetail == BIT_DOMAIN) { // Create from bit model (made by the error model)
257  unsigned int signalFieldLength = 0;
258  if (isCompliant)
259  signalFieldLength = ENCODED_SIGNAL_FIELD_LENGTH;
260  else {
261  double codeRate = getCodeRateFromDecoderModule(signalDecoder);
262  signalFieldLength = DECODED_SIGNAL_FIELD_LENGTH * codeRate;
263  }
264  BitVector *signalFieldBits = new BitVector();
265  const BitVector *bits = bitModel->getBits();
266  for (unsigned int i = 0; i < signalFieldLength; i++)
267  signalFieldBits->appendBit(bits->getBit(i));
268  signalFieldBitModel = new ReceptionBitModel(b(signalFieldLength), bitModel->getHeaderBitRate(), b(-1), bps(NaN), signalFieldBits, NaN);
269  }
270  return signalFieldBitModel;
271 }

Referenced by computeReceptionResult().

◆ createSignalFieldPacketModel()

const IReceptionPacketModel * inet::physicallayer::Ieee80211LayeredOfdmReceiver::createSignalFieldPacketModel ( const IReceptionBitModel signalFieldBitModel) const
protected
179 {
180  const IReceptionPacketModel *signalFieldPacketModel = nullptr;
181  if (levelOfDetail > PACKET_DOMAIN) { // Create from the bit model
182  if (signalDecoder) // non-complaint
183  signalFieldPacketModel = signalDecoder->decode(signalFieldBitModel);
184  else { // complaint
185  // In compliant mode the code for the signal field is always the following:
187  signalFieldPacketModel = decoder.decode(signalFieldBitModel);
188  }
189  }
190  return signalFieldPacketModel;
191 }

Referenced by computeReceptionResult().

◆ createSignalFieldSymbolModel()

const IReceptionSymbolModel * inet::physicallayer::Ieee80211LayeredOfdmReceiver::createSignalFieldSymbolModel ( const IReceptionSymbolModel symbolModel) const
protected
210 {
211  const Ieee80211OfdmReceptionSymbolModel *signalFieldSymbolModel = nullptr;
213  throw cRuntimeError("This level of detail is unimplemented!");
214  else if (levelOfDetail == SYMBOL_DOMAIN) { // Create from symbol model (made by the error model)
215  const std::vector<const ISymbol *> *symbols = receptionSymbolModel->getSymbols();
216  std::vector<const ISymbol *> *signalSymbols = new std::vector<const ISymbol *>();
217  const Ieee80211OfdmSymbol *signalSymbol = check_and_cast<const Ieee80211OfdmSymbol *>(symbols->at(0));
218  signalSymbols->push_back(new Ieee80211OfdmSymbol(*signalSymbol)); // The first symbol is the signal field symbol
219  signalFieldSymbolModel = new Ieee80211OfdmReceptionSymbolModel(1, receptionSymbolModel->getHeaderSymbolRate(), -1, NaN, signalSymbols);
220  }
221  return signalFieldSymbolModel;
222 }

Referenced by computeReceptionResult().

◆ createSymbolModel()

const IReceptionSymbolModel * inet::physicallayer::Ieee80211LayeredOfdmReceiver::createSymbolModel ( const LayeredTransmission transmission,
const ISnir snir 
) const
protected
133 {
135  return errorModel->computeSymbolModel(transmission, snir);
136  return nullptr;
137 }

Referenced by computeReceptionResult().

◆ getCodeRateFromDecoderModule()

double inet::physicallayer::Ieee80211LayeredOfdmReceiver::getCodeRateFromDecoderModule ( const IDecoder decoder) const
protected
140 {
141  const Ieee80211OfdmDecoderModule *decoderModule = check_and_cast<const Ieee80211OfdmDecoderModule *>(decoder);
142  const Ieee80211OfdmCode *code = decoderModule->getCode();
143  const ConvolutionalCode *convolutionalCode = code->getConvolutionalCode();
144  return convolutionalCode ? 1.0 * convolutionalCode->getCodeRatePuncturingN() / convolutionalCode->getCodeRatePuncturingK() : 1;
145 }

Referenced by createDataFieldBitModel(), and createSignalFieldBitModel().

◆ getMode()

const Ieee80211OfdmMode * inet::physicallayer::Ieee80211LayeredOfdmReceiver::getMode ( const Packet packet) const
virtual
75 {
76  const auto& modeInd = const_cast<Packet *>(packet)->findTag<Ieee80211ModeInd>();
77  if (isCompliant)
78  return modeInd != nullptr ? check_and_cast<const Ieee80211OfdmMode *>(modeInd->getMode()) : &Ieee80211OfdmCompliantModes::getCompliantMode(11, MHz(20));
79  else
80  return mode;
81 }

◆ getSignalFieldLength()

unsigned int inet::physicallayer::Ieee80211LayeredOfdmReceiver::getSignalFieldLength ( const BitVector signalField) const
protected
202 {
203  ShortBitVector length;
204  for (int i = SIGNAL_LENGTH_FIELD_START; i <= SIGNAL_LENGTH_FIELD_END; i++)
205  length.appendBit(signalField->getBit(i));
206  return length.toDecimal();
207 }

Referenced by createDataFieldBitModel().

◆ initialize()

void inet::physicallayer::Ieee80211LayeredOfdmReceiver::initialize ( int  stage)
overrideprotectedvirtual

Reimplemented from inet::physicallayer::SnirReceiverBase.

40 {
42  if (stage == INITSTAGE_LOCAL) {
43  errorModel = dynamic_cast<ILayeredErrorModel *>(getSubmodule("errorModel"));
44  dataDecoder = dynamic_cast<IDecoder *>(getSubmodule("dataDecoder"));
45  signalDecoder = dynamic_cast<IDecoder *>(getSubmodule("signalDecoder"));
46  dataDemodulator = dynamic_cast<IDemodulator *>(getSubmodule("dataDemodulator"));
47  signalDemodulator = dynamic_cast<IDemodulator *>(getSubmodule("signalDemodulator"));
48  pulseFilter = dynamic_cast<IPulseFilter *>(getSubmodule("pulseFilter"));
49  analogDigitalConverter = dynamic_cast<IAnalogDigitalConverter *>(getSubmodule("analogDigitalConverter"));
50 
51  energyDetection = mW(math::dBmW2mW(par("energyDetection")));
52  sensitivity = mW(math::dBmW2mW(par("sensitivity")));
53  centerFrequency = Hz(par("centerFrequency"));
54  bandwidth = Hz(par("bandwidth"));
55  channelSpacing = Hz(par("channelSpacing"));
56  isCompliant = par("isCompliant");
58  throw cRuntimeError("In compliant mode it is forbidden to the following parameters: dataDecoder, signalDecoder, dataDemodulator, signalDemodulator, pulseFilter, analogDigitalConverter.");
59  }
60  const char *levelOfDetailStr = par("levelOfDetail");
61  if (strcmp("bit", levelOfDetailStr) == 0)
63  else if (strcmp("symbol", levelOfDetailStr) == 0)
65  else if (strcmp("sample", levelOfDetailStr) == 0)
67  else if (strcmp("packet", levelOfDetailStr) == 0)
69  else
70  throw cRuntimeError("Unknown level of detail='%s'", levelOfDetailStr);
71  }
72 }

◆ printToStream()

std::ostream & inet::physicallayer::Ieee80211LayeredOfdmReceiver::printToStream ( std::ostream &  stream,
int  level,
int  evFlags = 0 
) const
overridevirtual

Prints this object to the provided output stream.

Reimplemented from inet::physicallayer::SnirReceiverBase.

Member Data Documentation

◆ analogDigitalConverter

const IAnalogDigitalConverter* inet::physicallayer::Ieee80211LayeredOfdmReceiver::analogDigitalConverter = nullptr
protected

Referenced by initialize(), and printToStream().

◆ bandwidth

Hz inet::physicallayer::Ieee80211LayeredOfdmReceiver::bandwidth
protected

◆ centerFrequency

Hz inet::physicallayer::Ieee80211LayeredOfdmReceiver::centerFrequency
protected

◆ channelSpacing

Hz inet::physicallayer::Ieee80211LayeredOfdmReceiver::channelSpacing
protected

◆ dataDecoder

const IDecoder* inet::physicallayer::Ieee80211LayeredOfdmReceiver::dataDecoder = nullptr
protected

◆ dataDemodulator

const IDemodulator* inet::physicallayer::Ieee80211LayeredOfdmReceiver::dataDemodulator = nullptr
protected

◆ energyDetection

W inet::physicallayer::Ieee80211LayeredOfdmReceiver::energyDetection
protected

◆ errorModel

const ILayeredErrorModel* inet::physicallayer::Ieee80211LayeredOfdmReceiver::errorModel = nullptr
protected

◆ isCompliant

bool inet::physicallayer::Ieee80211LayeredOfdmReceiver::isCompliant
protected

◆ levelOfDetail

◆ mode

const Ieee80211OfdmMode* inet::physicallayer::Ieee80211LayeredOfdmReceiver::mode = nullptr
mutableprotected

◆ pulseFilter

const IPulseFilter* inet::physicallayer::Ieee80211LayeredOfdmReceiver::pulseFilter = nullptr
protected

Referenced by initialize(), and printToStream().

◆ sensitivity

W inet::physicallayer::Ieee80211LayeredOfdmReceiver::sensitivity
protected

◆ signalDecoder

const IDecoder* inet::physicallayer::Ieee80211LayeredOfdmReceiver::signalDecoder = nullptr
protected

◆ signalDemodulator

const IDemodulator* inet::physicallayer::Ieee80211LayeredOfdmReceiver::signalDemodulator = nullptr
protected

◆ snirThreshold

double inet::physicallayer::Ieee80211LayeredOfdmReceiver::snirThreshold
protected

Referenced by printToStream().


The documentation for this class was generated from the following files:
inet::physicallayer::Ieee80211LayeredOfdmReceiver::SAMPLE_DOMAIN
@ SAMPLE_DOMAIN
Definition: Ieee80211LayeredOfdmReceiver.h:34
inet::physicallayer::Ieee80211LayeredOfdmReceiver::createDataFieldBitModel
const IReceptionBitModel * createDataFieldBitModel(const IReceptionBitModel *bitModel, const IReceptionSymbolModel *symbolModel, const IReceptionPacketModel *signalFieldPacketModel, const IReceptionBitModel *signalFieldBitModel) const
Definition: Ieee80211LayeredOfdmReceiver.cc:273
inet::physicallayer::ILayeredErrorModel::computeSymbolModel
virtual const IReceptionSymbolModel * computeSymbolModel(const LayeredTransmission *transmission, const ISnir *snir) const =0
Computes the symbol domain representation at the receiver using a simplified model for the underlying...
inet::physicallayer::Ieee80211LayeredOfdmReceiver::snirThreshold
double snirThreshold
Definition: Ieee80211LayeredOfdmReceiver.h:53
inet::units::units::Hz
pow< s, -1 > Hz
Definition: Units.h:935
inet::physicallayer::Ieee80211LayeredOfdmReceiver::createSignalFieldPacketModel
const IReceptionPacketModel * createSignalFieldPacketModel(const IReceptionBitModel *signalFieldBitModel) const
Definition: Ieee80211LayeredOfdmReceiver.cc:178
PPDU_TAIL_BITS_LENGTH
#define PPDU_TAIL_BITS_LENGTH
Definition: Ieee80211OfdmDefs.h:24
inet::math::dBmW2mW
double dBmW2mW(double dBm)
Converts a dBmW value to mW.
Definition: INETMath.h:163
inet::units::units::bps
compose< b, pow< s, -1 > > bps
Definition: Units.h:1169
inet::physicallayer::Ieee80211LayeredOfdmReceiver::bandwidth
Hz bandwidth
Definition: Ieee80211LayeredOfdmReceiver.h:51
inet::physicallayer::Ieee80211LayeredOfdmReceiver::createSignalFieldSymbolModel
const IReceptionSymbolModel * createSignalFieldSymbolModel(const IReceptionSymbolModel *symbolModel) const
Definition: Ieee80211LayeredOfdmReceiver.cc:209
inet::physicallayer::Ieee80211LayeredOfdmReceiver::pulseFilter
const IPulseFilter * pulseFilter
Definition: Ieee80211LayeredOfdmReceiver.h:45
inet::physicallayer::Ieee80211LayeredOfdmReceiver::analogDigitalConverter
const IAnalogDigitalConverter * analogDigitalConverter
Definition: Ieee80211LayeredOfdmReceiver.h:46
inet::physicallayer::Ieee80211LayeredOfdmReceiver::createCompleteSymbolModel
const IReceptionSymbolModel * createCompleteSymbolModel(const IReceptionSymbolModel *signalFieldSymbolModel, const IReceptionSymbolModel *dataFieldSymbolModel) const
Definition: Ieee80211LayeredOfdmReceiver.cc:321
inet::physicallayer::Ieee80211LayeredOfdmReceiver::getCodeRateFromDecoderModule
double getCodeRateFromDecoderModule(const IDecoder *decoder) const
Definition: Ieee80211LayeredOfdmReceiver.cc:139
inet::units::units::W
compose< J, pow< s, -1 > > W
Definition: Units.h:939
inet::physicallayer::Ieee80211LayeredOfdmReceiver::PACKET_DOMAIN
@ PACKET_DOMAIN
Definition: Ieee80211LayeredOfdmReceiver.h:31
SIGNAL_LENGTH_FIELD_END
#define SIGNAL_LENGTH_FIELD_END
Definition: Ieee80211OfdmDefs.h:21
NUMBER_OF_OFDM_DATA_SUBCARRIERS
#define NUMBER_OF_OFDM_DATA_SUBCARRIERS
Definition: Ieee80211OfdmDefs.h:15
inet::physicallayer::Ieee80211LayeredOfdmReceiver::createCompletePacketModel
const IReceptionPacketModel * createCompletePacketModel(const char *name, const IReceptionPacketModel *signalFieldPacketModel, const IReceptionPacketModel *dataFieldPacketModel) const
Definition: Ieee80211LayeredOfdmReceiver.cc:334
PPDU_SERVICE_FIELD_BITS_LENGTH
#define PPDU_SERVICE_FIELD_BITS_LENGTH
Definition: Ieee80211OfdmDefs.h:23
DECODED_SIGNAL_FIELD_LENGTH
#define DECODED_SIGNAL_FIELD_LENGTH
Definition: Ieee80211OfdmDefs.h:16
inet::physicallayer::Ieee80211OfdmDataMode::getCode
const Ieee80211OfdmCode * getCode() const
Definition: Ieee80211OfdmMode.h:123
inet::units::units::mW
milli< W >::type mW
Definition: Units.h:1080
inet::physicallayer::Ieee80211LayeredOfdmReceiver::levelOfDetail
LevelOfDetail levelOfDetail
Definition: Ieee80211LayeredOfdmReceiver.h:38
inet::physicallayer::Ieee80211LayeredOfdmReceiver::centerFrequency
Hz centerFrequency
Definition: Ieee80211LayeredOfdmReceiver.h:50
inet::physicallayer::Ieee80211LayeredOfdmReceiver::mode
const Ieee80211OfdmMode * mode
Definition: Ieee80211LayeredOfdmReceiver.h:39
inet::physicallayer::Ieee80211LayeredOfdmReceiver::getSignalFieldLength
unsigned int getSignalFieldLength(const BitVector *signalField) const
Definition: Ieee80211LayeredOfdmReceiver.cc:201
inet::physicallayer::Ieee80211LayeredOfdmReceiver::createBitModel
const IReceptionBitModel * createBitModel(const LayeredTransmission *transmission, const ISnir *snir) const
Definition: Ieee80211LayeredOfdmReceiver.cc:118
inet::printFieldToString
std::string printFieldToString(const IPrintableObject *object, int level, int evFlags=0)
Definition: IPrintableObject.h:98
ENCODED_SIGNAL_FIELD_LENGTH
#define ENCODED_SIGNAL_FIELD_LENGTH
Definition: Ieee80211OfdmDefs.h:17
inet::physicallayer::Ieee80211LayeredOfdmReceiver::createSymbolModel
const IReceptionSymbolModel * createSymbolModel(const LayeredTransmission *transmission, const ISnir *snir) const
Definition: Ieee80211LayeredOfdmReceiver.cc:132
inet::physicallayer::Ieee80211LayeredOfdmReceiver::errorModel
const ILayeredErrorModel * errorModel
Definition: Ieee80211LayeredOfdmReceiver.h:40
inet::physicallayer::Ieee80211LayeredOfdmReceiver::signalDecoder
const IDecoder * signalDecoder
Definition: Ieee80211LayeredOfdmReceiver.h:42
inet::physicallayer::Ieee80211OfdmCompliantModes::findCompliantMode
static const Ieee80211OfdmMode * findCompliantMode(unsigned int signalRateField, Hz channelSpacing)
Definition: Ieee80211OfdmMode.cc:201
inet::physicallayer::BpskModulation::singleton
static const BpskModulation singleton
Definition: BpskModulation.h:25
inet::physicallayer::Ieee80211LayeredOfdmReceiver::BIT_DOMAIN
@ BIT_DOMAIN
Definition: Ieee80211LayeredOfdmReceiver.h:32
EV_FIELD
#define EV_FIELD(...)
Definition: INETDefs.h:112
inet::physicallayer::Ieee80211LayeredOfdmReceiver::signalDemodulator
const IDemodulator * signalDemodulator
Definition: Ieee80211LayeredOfdmReceiver.h:44
inet::physicallayer::Ieee80211LayeredOfdmReceiver::createSignalFieldBitModel
const IReceptionBitModel * createSignalFieldBitModel(const IReceptionBitModel *bitModel, const IReceptionSymbolModel *symbolModel) const
Definition: Ieee80211LayeredOfdmReceiver.cc:242
inet::physicallayer::IDecoder::decode
virtual const IReceptionPacketModel * decode(const IReceptionBitModel *bitModel) const =0
inet::physicallayer::SnirReceiverBase::initialize
virtual void initialize(int stage) override
Definition: SnirReceiverBase.cc:17
inet::physicallayer::Ieee80211OfdmMode::getPreambleMode
virtual const Ieee80211OfdmPreambleMode * getPreambleMode() const override
Definition: Ieee80211OfdmMode.h:146
inet::physicallayer::ILayeredErrorModel::computeSampleModel
virtual const IReceptionSampleModel * computeSampleModel(const LayeredTransmission *transmission, const ISnir *snir) const =0
Computes the sample domain representation at the receiver using a simplified model for the underlying...
inet::physicallayer::Ieee80211OfdmMode::getSignalMode
virtual const Ieee80211OfdmSignalMode * getSignalMode() const
Definition: Ieee80211OfdmMode.h:149
inet::physicallayer::Ieee80211LayeredOfdmReceiver::channelSpacing
Hz channelSpacing
Definition: Ieee80211LayeredOfdmReceiver.h:52
inet::physicallayer::Ieee80211LayeredOfdmReceiver::SYMBOL_DOMAIN
@ SYMBOL_DOMAIN
Definition: Ieee80211LayeredOfdmReceiver.h:33
NaN
#define NaN
Definition: INETMath.h:91
inet::INITSTAGE_LOCAL
INET_API InitStage INITSTAGE_LOCAL
Initialization of local state that don't use or affect other modules includes:
inet::physicallayer::ILayeredErrorModel::computePacketModel
virtual const IReceptionPacketModel * computePacketModel(const LayeredTransmission *transmission, const ISnir *snir) const =0
Computes the packet domain representation at the receiver using a simplified model for the underlying...
inet::physicallayer::Ieee80211OfdmModulation::getSubcarrierModulation
const ApskModulationBase * getSubcarrierModulation() const
Definition: Ieee80211OfdmModulation.h:24
inet::IPrintableObject::PRINT_LEVEL_TRACE
@ PRINT_LEVEL_TRACE
Definition: IPrintableObject.h:22
inet::units::values::b
value< int64_t, units::b > b
Definition: Units.h:1241
inet::physicallayer::ILayeredErrorModel::computeBitModel
virtual const IReceptionBitModel * computeBitModel(const LayeredTransmission *transmission, const ISnir *snir) const =0
Computes the bit domain representation at the receiver using a simplified model for the underlying do...
SIGNAL_LENGTH_FIELD_START
#define SIGNAL_LENGTH_FIELD_START
Definition: Ieee80211OfdmDefs.h:20
inet::physicallayer::Ieee80211LayeredOfdmReceiver::computeMode
const Ieee80211OfdmMode * computeMode(Hz bandwidth) const
Definition: Ieee80211LayeredOfdmReceiver.cc:347
inet::physicallayer::Ieee80211LayeredOfdmReceiver::createPacketModel
const IReceptionPacketModel * createPacketModel(const LayeredTransmission *transmission, const ISnir *snir) const
Definition: Ieee80211LayeredOfdmReceiver.cc:125
inet::physicallayer::Ieee80211LayeredOfdmReceiver::dataDemodulator
const IDemodulator * dataDemodulator
Definition: Ieee80211LayeredOfdmReceiver.h:43
inet::evFlags
int evFlags
Definition: INETDefs.cc:12
inet::physicallayer::Ieee80211LayeredOfdmReceiver::createAnalogModel
const IReceptionAnalogModel * createAnalogModel(const LayeredTransmission *transmission, const ISnir *snir) const
Definition: Ieee80211LayeredOfdmReceiver.cc:83
inet::physicallayer::Ieee80211LayeredOfdmReceiver::createDataFieldSymbolModel
const IReceptionSymbolModel * createDataFieldSymbolModel(const IReceptionSymbolModel *symbolModel) const
Definition: Ieee80211LayeredOfdmReceiver.cc:224
inet::physicallayer::Ieee80211LayeredOfdmReceiver::isCompliant
bool isCompliant
Definition: Ieee80211LayeredOfdmReceiver.h:54
inet::physicallayer::Ieee80211LayeredOfdmReceiver::calculatePadding
unsigned int calculatePadding(unsigned int dataFieldLengthInBits, const ApskModulationBase *modulation, double codeRate) const
Definition: Ieee80211LayeredOfdmReceiver.cc:193
inet::physicallayer::Ieee80211OfdmMode::getDataMode
virtual const Ieee80211OfdmDataMode * getDataMode() const override
Definition: Ieee80211OfdmMode.h:148
inet::physicallayer::Ieee80211LayeredOfdmReceiver::sensitivity
W sensitivity
Definition: Ieee80211LayeredOfdmReceiver.h:49
inet::physicallayer::Ieee80211LayeredOfdmReceiver::createSampleModel
const IReceptionSampleModel * createSampleModel(const LayeredTransmission *transmission, const ISnir *snir) const
Definition: Ieee80211LayeredOfdmReceiver.cc:111
inet::physicallayer::IDemodulator::demodulate
virtual const IReceptionBitModel * demodulate(const IReceptionSymbolModel *symbolModel) const =0
inet::units::units::MHz
mega< Hz >::type MHz
Definition: Units.h:1083
inet::physicallayer::Ieee80211OfdmDataMode::getModulation
const Ieee80211OfdmModulation * getModulation() const override
Definition: Ieee80211OfdmMode.h:124
inet::physicallayer::Ieee80211LayeredOfdmReceiver::createCompleteBitModel
const IReceptionBitModel * createCompleteBitModel(const IReceptionBitModel *signalFieldBitModel, const IReceptionBitModel *dataFieldBitModel) const
Definition: Ieee80211LayeredOfdmReceiver.cc:147
inet::physicallayer::Ieee80211LayeredOfdmReceiver::energyDetection
W energyDetection
Definition: Ieee80211LayeredOfdmReceiver.h:48
inet::physicallayer::Ieee80211LayeredOfdmReceiver::dataDecoder
const IDecoder * dataDecoder
Definition: Ieee80211LayeredOfdmReceiver.h:41
inet::physicallayer::Ieee80211LayeredOfdmReceiver::createDataFieldPacketModel
const IReceptionPacketModel * createDataFieldPacketModel(const IReceptionBitModel *signalFieldBitModel, const IReceptionBitModel *dataFieldBitModel, const IReceptionPacketModel *signalFieldPacketModel) const
Definition: Ieee80211LayeredOfdmReceiver.cc:163
inet::physicallayer::Ieee80211OfdmCompliantCodes::ofdmCC1_2BPSKInterleavingWithoutScrambling
static const Ieee80211OfdmCode ofdmCC1_2BPSKInterleavingWithoutScrambling
Definition: Ieee80211OfdmCode.h:58