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

#include <Ieee80211OFDMErrorModel.h>

Inheritance diagram for inet::physicallayer::Ieee80211OFDMErrorModel:
inet::physicallayer::ILayeredErrorModel inet::physicallayer::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) const override
 Prints this object to the provided output stream. More...
 
- Public Member Functions inherited from inet::physicallayer::IPrintableObject
virtual ~IPrintableObject ()
 
virtual std::string getInfoStringRepresentation () const
 
virtual std::string getDetailStringRepresentation () const
 
virtual std::string getDebugStringRepresentation () const
 
virtual std::string getTraceStringRepresentation () const
 
virtual std::string getCompleteStringRepresentation () const
 

Protected Member Functions

virtual int numInitStages () const override
 
virtual void initialize (int stage) override
 
virtual void handleMessage (cMessage *msg) override
 
Ieee80211OFDMSymbolcorruptOFDMSymbol (const Ieee80211OFDMSymbol *symbol, double ser, int constellationSize, const std::vector< APSKSymbol > *constellation) const
 
void corruptBits (BitVector *bits, double ber, int begin, int end) const
 

Protected Attributes

double signalSymbolErrorRate
 
double dataSymbolErrorRate
 
double signalBitErrorRate
 
double dataBitErrorRate
 

Additional Inherited Members

- Public Types inherited from inet::physicallayer::IPrintableObject
enum  PrintLevel {
  PRINT_LEVEL_TRACE, PRINT_LEVEL_DEBUG, PRINT_LEVEL_DETAIL, PRINT_LEVEL_INFO,
  PRINT_LEVEL_COMPLETE = INT_MIN
}
 

Member Function Documentation

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.

57 {
58  const ITransmissionBitModel *transmissionBitModel = transmission->getBitModel();
59  int signalBitLength = transmissionBitModel->getHeaderBitLength();
60  bps signalBitRate = transmissionBitModel->getHeaderBitRate();
61  int dataBitLength = transmissionBitModel->getPayloadBitLength();
62  bps dataBitRate = transmissionBitModel->getPayloadBitRate();
63  ASSERT(transmission->getSymbolModel() != nullptr);
64  const IModulation *signalModulation = transmission->getSymbolModel()->getHeaderModulation();
65  const IModulation *dataModulation = transmission->getSymbolModel()->getPayloadModulation();
66  const BitVector *bits = transmissionBitModel->getBits();
67  BitVector *corruptedBits = new BitVector(*bits);
68  const ScalarTransmissionSignalAnalogModel *analogModel = check_and_cast<const ScalarTransmissionSignalAnalogModel *>(transmission->getAnalogModel());
69  if (dynamic_cast<const IAPSKModulation *>(signalModulation)) {
70  const IAPSKModulation *apskSignalModulation = (const IAPSKModulation *)signalModulation;
71  double signalFieldBer = std::isnan(signalBitErrorRate) ? apskSignalModulation->calculateBER(snir->getMin(), analogModel->getBandwidth(), signalBitRate) : signalBitErrorRate;
72  corruptBits(corruptedBits, signalFieldBer, 0, signalBitLength);
73  }
74  else
75  throw cRuntimeError("Unknown signal modulation");
76  if (dynamic_cast<const IAPSKModulation *>(dataModulation)) {
77  const IAPSKModulation *apskDataModulation = (const IAPSKModulation *)signalModulation;
78  double dataFieldBer = std::isnan(dataBitErrorRate) ? apskDataModulation->calculateBER(snir->getMin(), analogModel->getBandwidth(), dataBitRate) : dataBitErrorRate;
79  corruptBits(corruptedBits, dataFieldBer, signalBitLength, corruptedBits->getSize());
80  }
81  else
82  throw cRuntimeError("Unknown data modulation");
83  return new const ReceptionBitModel(signalBitLength, signalBitRate, dataBitLength, dataBitRate, corruptedBits);
84 }
void corruptBits(BitVector *bits, double ber, int begin, int end) const
Definition: Ieee80211OFDMErrorModel.cc:112
compose< b, pow< s,-1 > > bps
Definition: Units.h:985
double dataBitErrorRate
Definition: Ieee80211OFDMErrorModel.h:34
double signalBitErrorRate
Definition: Ieee80211OFDMErrorModel.h:33
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.

148 {
149  throw cRuntimeError("Unimplemented!");
150  // TODO: implement error model
151  const ITransmissionPacketModel *transmissionPacketModel = transmission->getPacketModel();
152  const cPacket *packet = transmissionPacketModel->getPacket();
153  double per = 0.0;
154  bool packetErrorless = per == 0.0;
155  return new const ReceptionPacketModel(packet, nullptr, bps(NaN), per, packetErrorless);
156 }
compose< b, pow< s,-1 > > bps
Definition: Units.h:985
#define NaN
Definition: INETMath.h:103
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.

136 {
137  throw cRuntimeError("Unimplemented!");
138  // TODO: implement sample error model
139  const ITransmissionSampleModel *transmissionSampleModel = transmission->getSampleModel();
140  int sampleLength = transmissionSampleModel->getSampleLength();
141  double sampleRate = transmissionSampleModel->getSampleRate();
142  const std::vector<W> *samples = transmissionSampleModel->getSamples();
143  W rssi = W(0); // TODO: error model
144  return new const ReceptionSampleModel(sampleLength, sampleRate, samples, rssi);
145 }
compose< J, pow< s,-1 > > W
Definition: Units.h:770
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.

87 {
88  const ITransmissionBitModel *transmissionBitModel = transmission->getBitModel();
89  const TransmissionSymbolModel *transmissionSymbolModel = check_and_cast<const Ieee80211OFDMTransmissionSymbolModel *>(transmission->getSymbolModel());
90  const IModulation *modulation = transmissionSymbolModel->getPayloadModulation();
91  const APSKModulationBase *dataModulation = check_and_cast<const APSKModulationBase *>(modulation);
92  unsigned int dataFieldConstellationSize = dataModulation->getConstellationSize();
93  unsigned int signalFieldConstellationSize = BPSKModulation::singleton.getConstellationSize();
94  const std::vector<APSKSymbol> *constellationForDataField = dataModulation->getConstellation();
95  const std::vector<APSKSymbol> *constellationForSignalField = BPSKModulation::singleton.getConstellation();
96  const ScalarTransmissionSignalAnalogModel *analogModel = check_and_cast<const ScalarTransmissionSignalAnalogModel *>(transmission->getAnalogModel());
97  double signalSER = std::isnan(signalSymbolErrorRate) ? BPSKModulation::singleton.calculateSER(snir->getMin(), analogModel->getBandwidth(), transmissionBitModel->getHeaderBitRate()) : signalSymbolErrorRate;
98  double dataSER = std::isnan(dataSymbolErrorRate) ? dataModulation->calculateSER(snir->getMin(), analogModel->getBandwidth(), transmissionBitModel->getPayloadBitRate()) : dataSymbolErrorRate;
99  const std::vector<const ISymbol *> *symbols = transmissionSymbolModel->getSymbols();
100  std::vector<const ISymbol *> *corruptedSymbols = new std::vector<const ISymbol *>();
101  // Only the first symbol is signal field symbol
102  corruptedSymbols->push_back(corruptOFDMSymbol(check_and_cast<const Ieee80211OFDMSymbol *>(symbols->at(0)), signalSER, signalFieldConstellationSize, constellationForSignalField));
103  // The remaining are all data field symbols
104  for (unsigned int i = 1; i < symbols->size(); i++) {
105  Ieee80211OFDMSymbol *corruptedOFDMSymbol = corruptOFDMSymbol(check_and_cast<const Ieee80211OFDMSymbol *>(symbols->at(i)), dataSER,
106  dataFieldConstellationSize, constellationForDataField);
107  corruptedSymbols->push_back(corruptedOFDMSymbol);
108  }
109  return new Ieee80211OFDMReceptionSymbolModel(transmissionSymbolModel->getHeaderSymbolLength(), transmissionSymbolModel->getHeaderSymbolRate(), transmissionSymbolModel->getPayloadSymbolLength(), transmissionSymbolModel->getPayloadSymbolRate(), corruptedSymbols);
110 }
virtual double calculateSER(double snir, Hz bandwidth, bps bitrate) const override
Returns the symbol error rate as a function of the signal to noise and interference ratio...
Definition: BPSKModulation.cc:34
Ieee80211OFDMSymbol * corruptOFDMSymbol(const Ieee80211OFDMSymbol *symbol, double ser, int constellationSize, const std::vector< APSKSymbol > *constellation) const
Definition: Ieee80211OFDMErrorModel.cc:121
double signalSymbolErrorRate
Definition: Ieee80211OFDMErrorModel.h:31
virtual const std::vector< APSKSymbol > * getConstellation() const
Definition: APSKModulationBase.h:45
virtual unsigned int getConstellationSize() const override
Definition: APSKModulationBase.h:46
static const BPSKModulation singleton
Definition: BPSKModulation.h:35
double dataSymbolErrorRate
Definition: Ieee80211OFDMErrorModel.h:32
void inet::physicallayer::Ieee80211OFDMErrorModel::corruptBits ( BitVector bits,
double  ber,
int  begin,
int  end 
) const
protected

Referenced by computeBitModel().

113 {
114  for (int i = begin; i != end; i++) {
115  double p = uniform(0, 1);
116  if (p <= ber)
117  bits->toggleBit(i);
118  }
119 }
Ieee80211OFDMSymbol * inet::physicallayer::Ieee80211OFDMErrorModel::corruptOFDMSymbol ( const Ieee80211OFDMSymbol symbol,
double  ser,
int  constellationSize,
const std::vector< APSKSymbol > *  constellation 
) const
protected

Referenced by computeSymbolModel().

122 {
123  std::vector<const APSKSymbol *> subcarrierSymbols = symbol->getSubCarrierSymbols();
124  for (int j = 0; j < symbol->symbolSize(); j++) {
125  double p = uniform(0, 1);
126  if (p <= ser) {
127  int corruptedSubcarrierSymbolIndex = intuniform(0, constellationSize - 1); // TODO: it can be equal to the current symbol
128  const APSKSymbol *corruptedSubcarrierSymbol = &constellation->at(corruptedSubcarrierSymbolIndex);
129  subcarrierSymbols[j] = corruptedSubcarrierSymbol;
130  }
131  }
132  return new Ieee80211OFDMSymbol(subcarrierSymbols);
133 }
virtual void inet::physicallayer::Ieee80211OFDMErrorModel::handleMessage ( cMessage *  msg)
inlineoverrideprotectedvirtual
39 { throw cRuntimeError("The module doesn't handle self messages"); }
void inet::physicallayer::Ieee80211OFDMErrorModel::initialize ( int  stage)
overrideprotectedvirtual
36 {
37  if (stage == INITSTAGE_LOCAL) {
38  dataSymbolErrorRate = par("dataSymbolErrorRate");
39  dataBitErrorRate = par("dataBitErrorRate");
40  signalSymbolErrorRate = par("signalSymbolErrorRate");
41  signalBitErrorRate = par("signalBitErrorRate");
42  }
43 }
double signalSymbolErrorRate
Definition: Ieee80211OFDMErrorModel.h:31
double dataSymbolErrorRate
Definition: Ieee80211OFDMErrorModel.h:32
Local initializations.
Definition: InitStages.h:35
double dataBitErrorRate
Definition: Ieee80211OFDMErrorModel.h:34
double signalBitErrorRate
Definition: Ieee80211OFDMErrorModel.h:33
virtual int inet::physicallayer::Ieee80211OFDMErrorModel::numInitStages ( ) const
inlineoverrideprotectedvirtual
37 { return NUM_INIT_STAGES; }
The number of initialization stages.
Definition: InitStages.h:116
std::ostream & inet::physicallayer::Ieee80211OFDMErrorModel::printToStream ( std::ostream &  stream,
int  level 
) const
overridevirtual

Prints this object to the provided output stream.

Function calls to operator<< with pointers or references either const or not are all forwarded to this function.

Reimplemented from inet::physicallayer::IPrintableObject.

46 {
47  stream << "Ieee80211OFDMErrorModel";
48  if (level <= PRINT_LEVEL_TRACE)
49  stream << ", signalSymbolErrorRate = " << signalSymbolErrorRate
50  << ", dataSymbolErrorRate = " << dataSymbolErrorRate
51  << ", signalBitErrorRate = " << signalBitErrorRate
52  << ", dataBitErrorRate = " << dataBitErrorRate;
53  return stream;
54 }
double signalSymbolErrorRate
Definition: Ieee80211OFDMErrorModel.h:31
double dataSymbolErrorRate
Definition: Ieee80211OFDMErrorModel.h:32
double dataBitErrorRate
Definition: Ieee80211OFDMErrorModel.h:34
double signalBitErrorRate
Definition: Ieee80211OFDMErrorModel.h:33

Member Data Documentation

double inet::physicallayer::Ieee80211OFDMErrorModel::dataBitErrorRate
protected
double inet::physicallayer::Ieee80211OFDMErrorModel::dataSymbolErrorRate
protected
double inet::physicallayer::Ieee80211OFDMErrorModel::signalBitErrorRate
protected
double inet::physicallayer::Ieee80211OFDMErrorModel::signalSymbolErrorRate
protected

The documentation for this class was generated from the following files: