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

#include <Ieee80211OfdmErrorModel.h>

Inheritance diagram for inet::physicallayer::Ieee80211OfdmErrorModel:
inet::physicallayer::Ieee80211NistErrorModel inet::physicallayer::ILayeredErrorModel inet::physicallayer::Ieee80211ErrorModelBase inet::IPrintableObject inet::physicallayer::ErrorModelBase inet::physicallayer::IErrorModel inet::IPrintableObject

Public Member Functions

virtual const IReceptionPacketModelcomputePacketModel (const LayeredTransmission *transmission, const ISnir *snir) const override
 Computes the packet domain representation at the receiver using a simplified model for the underlying domains. More...
 
virtual const IReceptionBitModelcomputeBitModel (const LayeredTransmission *transmission, const ISnir *snir) const override
 Computes the bit domain representation at the receiver using a simplified model for the underlying domains. More...
 
virtual const IReceptionSymbolModelcomputeSymbolModel (const LayeredTransmission *transmission, const ISnir *snir) const override
 Computes the symbol domain representation at the receiver using a simplified model for the underlying domains. More...
 
virtual const IReceptionSampleModelcomputeSampleModel (const LayeredTransmission *transmission, const ISnir *snir) const override
 Computes the sample domain representation at the receiver using a simplified model for the underlying domains. 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::Ieee80211ErrorModelBase
 Ieee80211ErrorModelBase ()
 
virtual double computePacketErrorRate (const ISnir *snir, IRadioSignal::SignalPart part) const override
 Returns the packet error rate based on SNIR, modulation, FEC encoding and any other physical layer characteristics. More...
 
virtual double computeBitErrorRate (const ISnir *snir, IRadioSignal::SignalPart part) const override
 Returns the bit error rate based on SNIR, modulation, FEC encoding and any other physical layer characteristics. More...
 
virtual double computeSymbolErrorRate (const ISnir *snir, IRadioSignal::SignalPart part) const override
 Returns the symbol error rate based on SNIR, modulation, and any other physical layer characteristics. 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 int numInitStages () const override
 
virtual void initialize (int stage) override
 
virtual Ieee80211OfdmSymbolcorruptOfdmSymbol (const Ieee80211OfdmSymbol *symbol, const MqamModulationBase *modulation, double snir) const
 
virtual void corruptBits (BitVector *bits, double ber, int begin, int end) const
 
- Protected Member Functions inherited from inet::physicallayer::Ieee80211NistErrorModel
double calculatePe (double p, uint32_t bValue) const
 
double getBpskBer (double snr) const
 
double getQpskBer (double snr) const
 
double get16QamBer (double snr) const
 
double get64QamBer (double snr) const
 
double get256QamBer (double snr) const
 
double get1024QamBer (double snr) const
 
double getFecBpskBer (double snr, double nbits, uint32_t bValue) const
 
double getFecQpskBer (double snr, double nbits, uint32_t bValue) const
 
double getFec16QamBer (double snr, uint32_t nbits, uint32_t bValue) const
 
double getFec64QamBer (double snr, uint32_t nbits, uint32_t bValue) const
 
double getFec256QamBer (double snr, uint64_t nbits, uint32_t bValue) const
 
double getFec1024QamBer (double snr, uint64_t nbits, uint32_t bValue) const
 
virtual double getOFDMAndERPOFDMChunkSuccessRate (const ApskModulationBase *subcarrierModulation, const ConvolutionalCode *convolutionalCode, unsigned int bitLength, double snr) const
 
virtual double getDSSSAndHrDSSSChunkSuccessRate (bps bitrate, unsigned int bitLength, double snr) const
 
virtual double getHeaderSuccessRate (const IIeee80211Mode *mode, unsigned int headerBitLength, double snr) const override
 
virtual double getDataSuccessRate (const IIeee80211Mode *mode, unsigned int bitLength, double snr) const override
 
- Protected Member Functions inherited from inet::physicallayer::Ieee80211ErrorModelBase
virtual PacketcomputeCorruptedPacket (const Packet *packet, double ber) const override
 
virtual double getDsssDbpskSuccessRate (unsigned int bitLength, double snir) const
 
virtual double getDsssDqpskSuccessRate (unsigned int bitLength, double snir) const
 
virtual double getDsssDqpskCck5_5SuccessRate (unsigned int bitLength, double snir) const
 
virtual double getDsssDqpskCck11SuccessRate (unsigned int bitLength, double snir) const
 
- Protected Member Functions inherited from inet::physicallayer::ErrorModelBase
virtual double getScalarSnir (const ISnir *snir) const
 
virtual bool hasProbabilisticError (b length, double ber) const
 
virtual PacketcorruptBits (const Packet *packet, double ber, bool &isCorrupted) const
 
virtual PacketcorruptBytes (const Packet *packet, double ber, bool &isCorrupted) const
 
virtual PacketcorruptChunks (const Packet *packet, double ber, bool &isCorrupted) const
 
virtual PacketcorruptPacket (const Packet *packet, bool &isCorrupted) const
 
virtual PacketcomputeCorruptedPacket (const ISnir *snir) const override
 

Protected Attributes

double signalSymbolErrorRate
 
double dataSymbolErrorRate
 
double signalBitErrorRate
 
double dataBitErrorRate
 
- Protected Attributes inherited from inet::physicallayer::Ieee80211ErrorModelBase
double spectralEfficiency1bit = 2000000.0 / 1000000.0
 
double spectralEfficiency2bit = 2000000.0 / 1000000.0 / 2.0
 
double sirPerfect = 10.0
 
double sirImpossible = 0.1
 
- Protected Attributes inherited from inet::physicallayer::ErrorModelBase
CorruptionMode corruptionMode = CorruptionMode::CM_UNDEFINED
 
SnirMode snirMode = SnirMode::SM_UNDEFINED
 
double snirOffset = NaN
 

Additional Inherited Members

- Public Types inherited from inet::physicallayer::ErrorModelBase
enum  CorruptionMode {
  CorruptionMode::CM_UNDEFINED = -1, CorruptionMode::CM_PACKET, CorruptionMode::CM_CHUNK, CorruptionMode::CM_BYTE,
  CorruptionMode::CM_BIT
}
 
enum  SnirMode { SnirMode::SM_UNDEFINED = -1, SnirMode::SM_MIN, SnirMode::SM_MEAN }
 
- 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) }
 

Member Function Documentation

◆ computeBitModel()

const IReceptionBitModel * inet::physicallayer::Ieee80211OfdmErrorModel::computeBitModel ( const LayeredTransmission transmission,
const ISnir snir 
) const
overridevirtual

Computes the bit domain representation at the receiver using a simplified model for the underlying domains.

This result includes all potential errors that were not corrected by the underlying domains.

Implements inet::physicallayer::ILayeredErrorModel.

63 {
64  const ITransmissionBitModel *transmissionBitModel = transmission->getBitModel();
65  int signalBitLength = b(transmissionBitModel->getHeaderLength()).get();
66  bps signalBitRate = transmissionBitModel->getHeaderBitRate();
67  int dataBitLength = b(transmissionBitModel->getDataLength()).get();
68  bps dataBitRate = transmissionBitModel->getDataBitRate();
69  ASSERT(transmission->getSymbolModel() != nullptr);
70  const IModulation *signalModulation = transmission->getSymbolModel()->getHeaderModulation();
71  const IModulation *dataModulation = transmission->getSymbolModel()->getPayloadModulation();
72  const BitVector *bits = transmissionBitModel->getBits();
73  BitVector *corruptedBits = new BitVector(*bits);
74  const ScalarTransmissionSignalAnalogModel *analogModel = check_and_cast<const ScalarTransmissionSignalAnalogModel *>(transmission->getAnalogModel());
75  if (auto apskSignalModulation = dynamic_cast<const IApskModulation *>(signalModulation)) {
76  double signalFieldBer = std::isnan(signalBitErrorRate) ? apskSignalModulation->calculateBER(getScalarSnir(snir), analogModel->getBandwidth(), signalBitRate) : signalBitErrorRate;
77  corruptBits(corruptedBits, signalFieldBer, 0, signalBitLength);
78  }
79  else
80  throw cRuntimeError("Unknown signal modulation");
81  if (auto apskDataModulation = dynamic_cast<const IApskModulation *>(dataModulation)) {
82  double dataFieldBer = std::isnan(dataBitErrorRate) ? apskDataModulation->calculateBER(getScalarSnir(snir), analogModel->getBandwidth(), dataBitRate) : dataBitErrorRate;
83  corruptBits(corruptedBits, dataFieldBer, signalBitLength, corruptedBits->getSize());
84  }
85  else
86  throw cRuntimeError("Unknown data modulation");
87  return new ReceptionBitModel(b(signalBitLength), signalBitRate, b(dataBitLength), dataBitRate, corruptedBits, NaN);
88 }

◆ computePacketModel()

const IReceptionPacketModel * inet::physicallayer::Ieee80211OfdmErrorModel::computePacketModel ( const LayeredTransmission transmission,
const ISnir snir 
) const
overridevirtual

Computes the packet domain representation at the receiver using a simplified model for the underlying domains.

This result includes all potential errors that were not corrected by the underlying domains.

Implements inet::physicallayer::ILayeredErrorModel.

51 {
52  double packetErrorRate = computePacketErrorRate(snir, IRadioSignal::SIGNAL_PART_WHOLE);
53  auto transmissionPacketModel = check_and_cast<const TransmissionPacketModel *>(transmission->getPacketModel());
54  auto transmittedPacket = transmissionPacketModel->getPacket();
55  auto receivedPacket = transmittedPacket->dup();
56  if (packetErrorRate != 0 && uniform(0, 1) < packetErrorRate)
57  receivedPacket->setBitError(true);
58  receivedPacket->addTagIfAbsent<ErrorRateInd>()->setPacketErrorRate(packetErrorRate);
59  return new ReceptionPacketModel(receivedPacket, transmissionPacketModel->getBitrate(), NaN);
60 }

◆ computeSampleModel()

const IReceptionSampleModel * inet::physicallayer::Ieee80211OfdmErrorModel::computeSampleModel ( const LayeredTransmission transmission,
const ISnir snir 
) const
overridevirtual

Computes the sample domain representation at the receiver using a simplified model for the underlying domains.

This result includes all potential errors that were not corrected by the underlying domains.

Implements inet::physicallayer::ILayeredErrorModel.

144 {
145  throw cRuntimeError("Unimplemented!");
146  // TODO implement sample error model
147  const ITransmissionSampleModel *transmissionSampleModel = transmission->getSampleModel();
148  int sampleLength = transmissionSampleModel->getSampleLength();
149  double sampleRate = transmissionSampleModel->getSampleRate();
150  const std::vector<W> *samples = transmissionSampleModel->getSamples();
151  W rssi = W(0); // TODO error model
152  return new ReceptionSampleModel(sampleLength, sampleRate, samples, rssi);
153 }

◆ computeSymbolModel()

const IReceptionSymbolModel * inet::physicallayer::Ieee80211OfdmErrorModel::computeSymbolModel ( const LayeredTransmission transmission,
const ISnir snir 
) const
overridevirtual

Computes the symbol domain representation at the receiver using a simplified model for the underlying domains.

This result includes all potential errors that were not corrected by the underlying domains.

Implements inet::physicallayer::ILayeredErrorModel.

91 {
92  auto transmissionSymbolModel = check_and_cast<const Ieee80211OfdmTransmissionSymbolModel *>(transmission->getSymbolModel());
93  auto symbols = transmissionSymbolModel->getSymbols();
94  auto receivedSymbols = new std::vector<const ISymbol *>();
95  // Only the first symbol is signal field symbol
96  double scalarSnir = getScalarSnir(snir);
97  receivedSymbols->push_back(corruptOfdmSymbol(check_and_cast<const Ieee80211OfdmSymbol *>(symbols->at(0)), &BpskModulation::singleton, scalarSnir));
98  // The remaining are all data field symbols
99  auto dataModulation = check_and_cast<const MqamModulationBase *>(transmissionSymbolModel->getPayloadModulation());
100  for (unsigned int i = 1; i < symbols->size(); i++) {
101  Ieee80211OfdmSymbol *corruptedOFDMSymbol = corruptOfdmSymbol(check_and_cast<const Ieee80211OfdmSymbol *>(symbols->at(i)), dataModulation, scalarSnir);
102  receivedSymbols->push_back(corruptedOFDMSymbol);
103  }
104  return new Ieee80211OfdmReceptionSymbolModel(transmissionSymbolModel->getHeaderSymbolLength(), transmissionSymbolModel->getHeaderSymbolRate(), transmissionSymbolModel->getPayloadSymbolLength(), transmissionSymbolModel->getPayloadSymbolRate(), receivedSymbols);
105 }

◆ corruptBits()

void inet::physicallayer::Ieee80211OfdmErrorModel::corruptBits ( BitVector bits,
double  ber,
int  begin,
int  end 
) const
protectedvirtual
108 {
109  for (int i = begin; i != end; i++) {
110  double p = uniform(0, 1);
111  if (p <= ber)
112  bits->toggleBit(i);
113  }
114 }

Referenced by computeBitModel().

◆ corruptOfdmSymbol()

Ieee80211OfdmSymbol * inet::physicallayer::Ieee80211OfdmErrorModel::corruptOfdmSymbol ( const Ieee80211OfdmSymbol symbol,
const MqamModulationBase modulation,
double  snir 
) const
protectedvirtual
117 {
118  std::vector<const ApskSymbol *> subcarrierSymbols = ofdmSymbol->getSubCarrierSymbols();
119  for (auto& subcarrierSymbol : subcarrierSymbols) {
120  if (subcarrierSymbol != nullptr) {
121  double transmittedI = subcarrierSymbol->real();
122  double transmittedQ = subcarrierSymbol->imag();
123  double sigma = std::sqrt(0.5 / snir);
124  double receivedI = normal(transmittedI, sigma);
125  double receivedQ = normal(transmittedQ, sigma);
126  double bestDistanceSquare = DBL_MAX;
127  const ApskSymbol *receivedSubcarrierSymbol = subcarrierSymbol;
128  for (auto& symbol : *modulation->getConstellation()) {
129  double i = symbol.real();
130  double q = symbol.imag();
131  double distanceSquare = std::pow((i - receivedI), 2) + std::pow((q - receivedQ), 2);
132  if (distanceSquare < bestDistanceSquare) {
133  bestDistanceSquare = distanceSquare;
134  receivedSubcarrierSymbol = &symbol;
135  }
136  }
137  subcarrierSymbol = receivedSubcarrierSymbol;
138  }
139  }
140  return new Ieee80211OfdmSymbol(subcarrierSymbols);
141 }

Referenced by computeSymbolModel().

◆ initialize()

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

Reimplemented from inet::physicallayer::ErrorModelBase.

29 {
31  if (stage == INITSTAGE_LOCAL) {
32  dataSymbolErrorRate = par("dataSymbolErrorRate");
33  dataBitErrorRate = par("dataBitErrorRate");
34  signalSymbolErrorRate = par("signalSymbolErrorRate");
35  signalBitErrorRate = par("signalBitErrorRate");
36  }
37 }

◆ numInitStages()

virtual int inet::physicallayer::Ieee80211OfdmErrorModel::numInitStages ( ) const
inlineoverrideprotectedvirtual
29 { return NUM_INIT_STAGES; }

◆ printToStream()

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

Prints this object to the provided output stream.

Reimplemented from inet::physicallayer::Ieee80211NistErrorModel.

40 {
41  stream << "Ieee80211OfdmErrorModel";
42  if (level <= PRINT_LEVEL_TRACE)
47  return stream;
48 }

Member Data Documentation

◆ dataBitErrorRate

double inet::physicallayer::Ieee80211OfdmErrorModel::dataBitErrorRate
protected

◆ dataSymbolErrorRate

double inet::physicallayer::Ieee80211OfdmErrorModel::dataSymbolErrorRate
protected

Referenced by initialize(), and printToStream().

◆ signalBitErrorRate

double inet::physicallayer::Ieee80211OfdmErrorModel::signalBitErrorRate
protected

◆ signalSymbolErrorRate

double inet::physicallayer::Ieee80211OfdmErrorModel::signalSymbolErrorRate
protected

Referenced by initialize(), and printToStream().


The documentation for this class was generated from the following files:
inet::physicallayer::IRadioSignal::SIGNAL_PART_WHOLE
@ SIGNAL_PART_WHOLE
Definition: IRadioSignal.h:26
inet::physicallayer::Ieee80211OfdmErrorModel::corruptOfdmSymbol
virtual Ieee80211OfdmSymbol * corruptOfdmSymbol(const Ieee80211OfdmSymbol *symbol, const MqamModulationBase *modulation, double snir) const
Definition: Ieee80211OfdmErrorModel.cc:116
inet::units::units::bps
compose< b, pow< s, -1 > > bps
Definition: Units.h:1169
inet::units::units::W
compose< J, pow< s, -1 > > W
Definition: Units.h:939
inet::physicallayer::Ieee80211OfdmErrorModel::dataBitErrorRate
double dataBitErrorRate
Definition: Ieee80211OfdmErrorModel.h:26
inet::units::sqrt
value< Value, pow< Unit, 1, 2 > > sqrt(const value< Value, Unit > &a)
Definition: Units.h:272
inet::physicallayer::BpskModulation::singleton
static const BpskModulation singleton
Definition: BpskModulation.h:25
inet::physicallayer::Ieee80211OfdmErrorModel::corruptBits
virtual void corruptBits(BitVector *bits, double ber, int begin, int end) const
Definition: Ieee80211OfdmErrorModel.cc:107
EV_FIELD
#define EV_FIELD(...)
Definition: INETDefs.h:112
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::Ieee80211OfdmErrorModel::signalSymbolErrorRate
double signalSymbolErrorRate
Definition: Ieee80211OfdmErrorModel.h:23
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
NUM_INIT_STAGES
#define NUM_INIT_STAGES
Definition: InitStageRegistry.h:73
inet::physicallayer::Ieee80211ErrorModelBase::computePacketErrorRate
virtual double computePacketErrorRate(const ISnir *snir, IRadioSignal::SignalPart part) const override
Returns the packet error rate based on SNIR, modulation, FEC encoding and any other physical layer ch...
Definition: Ieee80211ErrorModelBase.cc:21
inet::physicallayer::Ieee80211OfdmErrorModel::dataSymbolErrorRate
double dataSymbolErrorRate
Definition: Ieee80211OfdmErrorModel.h:24
inet::physicallayer::ErrorModelBase::getScalarSnir
virtual double getScalarSnir(const ISnir *snir) const
Definition: ErrorModelBase.cc:41
inet::physicallayer::ErrorModelBase::initialize
virtual void initialize(int stage) override
Definition: ErrorModelBase.cc:16
inet::physicallayer::Ieee80211OfdmErrorModel::signalBitErrorRate
double signalBitErrorRate
Definition: Ieee80211OfdmErrorModel.h:25