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

#include <Ieee80211OfdmDecoder.h>

Inheritance diagram for inet::physicallayer::Ieee80211OfdmDecoder:
inet::physicallayer::IDecoder inet::IPrintableObject

Public Member Functions

 Ieee80211OfdmDecoder (const IScrambler *descrambler, const IFecCoder *fecDecoder, const IInterleaver *deinterleaver)
 
 Ieee80211OfdmDecoder (const Ieee80211OfdmCode *code)
 
virtual ~Ieee80211OfdmDecoder ()
 
virtual std::ostream & printToStream (std::ostream &stream, int level, int evFlags=0) const override
 Prints this object to the provided output stream. More...
 
const IReceptionPacketModeldecode (const IReceptionBitModel *bitModel) const override
 
const Ieee80211OfdmCodegetCode () const
 
- 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

const IReceptionPacketModelcreatePacketModel (const BitVector *decodedBits, bool hasBitError, const IScrambling *scrambling, const IForwardErrorCorrection *fec, const IInterleaving *interleaving) const
 
ShortBitVector getSignalFieldRate (const BitVector &signalField) const
 
unsigned int getSignalFieldLength (const BitVector &signalField) const
 
unsigned int calculatePadding (unsigned int dataFieldLengthInBits, const IModulation *modulationScheme, const Ieee80211ConvolutionalCode *fec) const
 

Protected Attributes

const Ieee80211OfdmCodecode = nullptr
 
const IScramblerdescrambler = nullptr
 
const IFecCoderfecDecoder = nullptr
 
const IInterleaverdeinterleaver = nullptr
 

Additional Inherited Members

- 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) }
 

Constructor & Destructor Documentation

◆ Ieee80211OfdmDecoder() [1/2]

inet::physicallayer::Ieee80211OfdmDecoder::Ieee80211OfdmDecoder ( const IScrambler descrambler,
const IFecCoder fecDecoder,
const IInterleaver deinterleaver 
)

◆ Ieee80211OfdmDecoder() [2/2]

inet::physicallayer::Ieee80211OfdmDecoder::Ieee80211OfdmDecoder ( const Ieee80211OfdmCode code)
22  :
23  code(code),
24  descrambler(nullptr),
25  fecDecoder(nullptr),
26  deinterleaver(nullptr)
27 {
28  if (code->getScrambling())
29  descrambler = new AdditiveScrambler(code->getScrambling());
31  fecDecoder = new ConvolutionalCoder(code->getConvolutionalCode());
32  if (code->getInterleaving())
33  deinterleaver = new Ieee80211OfdmInterleaver(code->getInterleaving());
34 }

◆ ~Ieee80211OfdmDecoder()

inet::physicallayer::Ieee80211OfdmDecoder::~Ieee80211OfdmDecoder ( )
virtual
116 {
117  delete deinterleaver;
118  delete descrambler;
119  delete fecDecoder;
120 }

Member Function Documentation

◆ calculatePadding()

unsigned int inet::physicallayer::Ieee80211OfdmDecoder::calculatePadding ( unsigned int  dataFieldLengthInBits,
const IModulation modulationScheme,
const Ieee80211ConvolutionalCode fec 
) const
protected
107 {
108  const IApskModulation *dataModulationScheme = dynamic_cast<const IApskModulation *>(modulationScheme);
109  ASSERT(dataModulationScheme != nullptr);
110  unsigned int codedBitsPerOFDMSymbol = dataModulationScheme->getCodeWordSize() * NUMBER_OF_OFDM_DATA_SUBCARRIERS;
111  unsigned int dataBitsPerOFDMSymbol = codedBitsPerOFDMSymbol * fec->getCodeRatePuncturingK() / fec->getCodeRatePuncturingN();
112  return dataBitsPerOFDMSymbol - dataFieldLengthInBits % dataBitsPerOFDMSymbol;
113 }

◆ createPacketModel()

const IReceptionPacketModel * inet::physicallayer::Ieee80211OfdmDecoder::createPacketModel ( const BitVector decodedBits,
bool  hasBitError,
const IScrambling scrambling,
const IForwardErrorCorrection fec,
const IInterleaving interleaving 
) const
protected
72 {
73  Packet *packet;
74  if (decodedBits->getSize() % 8 == 0) {
75  const auto& bytesChunk = makeShared<BytesChunk>(decodedBits->getBytes());
76  packet = new Packet(nullptr, bytesChunk);
77  }
78  else {
79  std::vector<bool> bits;
80  for (int i = 0; i < (int)decodedBits->getSize(); i++)
81  bits.push_back(decodedBits->getBit(i));
82  const auto& bitsChunk = makeShared<BitsChunk>(bits);
83  packet = new Packet(nullptr, bitsChunk);
84  }
85  delete decodedBits;
86  packet->setBitError(hasBitError);
87  return new ReceptionPacketModel(packet, bps(NaN), NaN);
88 }

Referenced by decode().

◆ decode()

const IReceptionPacketModel * inet::physicallayer::Ieee80211OfdmDecoder::decode ( const IReceptionBitModel bitModel) const
overridevirtual

Implements inet::physicallayer::IDecoder.

48 {
49  bool hasBitError = false;
50  BitVector *decodedBits = new BitVector(*bitModel->getBits());
51  const IInterleaving *interleaving = nullptr;
52  if (deinterleaver) {
53  *decodedBits = deinterleaver->deinterleave(*decodedBits);
54  interleaving = deinterleaver->getInterleaving();
55  }
56  const IForwardErrorCorrection *forwardErrorCorrection = nullptr;
57  if (fecDecoder) {
58  std::pair<BitVector, bool> fecDecodedDataField = fecDecoder->decode(*decodedBits);
59  hasBitError = !fecDecodedDataField.second;
60  *decodedBits = fecDecodedDataField.first;
61  forwardErrorCorrection = fecDecoder->getForwardErrorCorrection();
62  }
63  const IScrambling *scrambling = nullptr;
64  if (descrambler) {
65  scrambling = descrambler->getScrambling();
66  *decodedBits = descrambler->descramble(*decodedBits);
67  }
68  return createPacketModel(decodedBits, hasBitError, scrambling, forwardErrorCorrection, interleaving);
69 }

Referenced by inet::physicallayer::Ieee80211LayeredOfdmReceiver::createDataFieldPacketModel(), inet::physicallayer::Ieee80211LayeredOfdmReceiver::createSignalFieldPacketModel(), and inet::physicallayer::Ieee80211OfdmDecoderModule::decode().

◆ getCode()

const Ieee80211OfdmCode* inet::physicallayer::Ieee80211OfdmDecoder::getCode ( ) const
inline
46 { return code; }

◆ getSignalFieldLength()

unsigned int inet::physicallayer::Ieee80211OfdmDecoder::getSignalFieldLength ( const BitVector signalField) const
protected
99 {
100  ShortBitVector length;
101  for (int i = SIGNAL_LENGTH_FIELD_START; i <= SIGNAL_LENGTH_FIELD_END; i++)
102  length.appendBit(signalField.getBit(i));
103  return length.toDecimal();
104 }

◆ getSignalFieldRate()

ShortBitVector inet::physicallayer::Ieee80211OfdmDecoder::getSignalFieldRate ( const BitVector signalField) const
protected
91 {
92  ShortBitVector rate;
93  for (int i = SIGNAL_RATE_FIELD_START; i <= SIGNAL_RATE_FIELD_END; i++)
94  rate.appendBit(signalField.getBit(i));
95  return rate;
96 }

◆ printToStream()

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

Prints this object to the provided output stream.

Reimplemented from inet::IPrintableObject.

37 {
38  stream << "Ieee80211OfdmDecoder";
39  if (level <= PRINT_LEVEL_TRACE)
40  stream << EV_FIELD(code, printFieldToString(code, level + 1, evFlags))
44  return stream;
45 }

Referenced by inet::physicallayer::Ieee80211OfdmDecoderModule::printToStream().

Member Data Documentation

◆ code

const Ieee80211OfdmCode* inet::physicallayer::Ieee80211OfdmDecoder::code = nullptr
protected

◆ deinterleaver

const IInterleaver* inet::physicallayer::Ieee80211OfdmDecoder::deinterleaver = nullptr
protected

◆ descrambler

const IScrambler* inet::physicallayer::Ieee80211OfdmDecoder::descrambler = nullptr
protected

◆ fecDecoder

const IFecCoder* inet::physicallayer::Ieee80211OfdmDecoder::fecDecoder = nullptr
protected

The documentation for this class was generated from the following files:
inet::physicallayer::Ieee80211OfdmDecoder::createPacketModel
const IReceptionPacketModel * createPacketModel(const BitVector *decodedBits, bool hasBitError, const IScrambling *scrambling, const IForwardErrorCorrection *fec, const IInterleaving *interleaving) const
Definition: Ieee80211OfdmDecoder.cc:71
inet::physicallayer::IInterleaver::deinterleave
virtual BitVector deinterleave(const BitVector &bits) const =0
inet::units::units::bps
compose< b, pow< s, -1 > > bps
Definition: Units.h:1169
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
SIGNAL_RATE_FIELD_END
#define SIGNAL_RATE_FIELD_END
Definition: Ieee80211OfdmDefs.h:19
inet::printFieldToString
std::string printFieldToString(const IPrintableObject *object, int level, int evFlags=0)
Definition: IPrintableObject.h:98
EV_FIELD
#define EV_FIELD(...)
Definition: INETDefs.h:112
inet::physicallayer::Ieee80211OfdmCode::getScrambling
const AdditiveScrambling * getScrambling() const
Definition: Ieee80211OfdmCode.h:33
SIGNAL_RATE_FIELD_START
#define SIGNAL_RATE_FIELD_START
Definition: Ieee80211OfdmDefs.h:18
inet::physicallayer::IFecCoder::decode
virtual std::pair< BitVector, bool > decode(const BitVector &encodedBits) const =0
NaN
#define NaN
Definition: INETMath.h:91
inet::IPrintableObject::PRINT_LEVEL_TRACE
@ PRINT_LEVEL_TRACE
Definition: IPrintableObject.h:22
inet::physicallayer::Ieee80211OfdmCode::getInterleaving
const Ieee80211OfdmInterleaving * getInterleaving() const
Definition: Ieee80211OfdmCode.h:32
inet::physicallayer::IInterleaver::getInterleaving
virtual const IInterleaving * getInterleaving() const =0
inet::physicallayer::IScrambler::descramble
virtual BitVector descramble(const BitVector &bits) const =0
SIGNAL_LENGTH_FIELD_START
#define SIGNAL_LENGTH_FIELD_START
Definition: Ieee80211OfdmDefs.h:20
inet::evFlags
int evFlags
Definition: INETDefs.cc:12
inet::physicallayer::Ieee80211OfdmDecoder::descrambler
const IScrambler * descrambler
Definition: Ieee80211OfdmDecoder.h:29
inet::physicallayer::Ieee80211OfdmDecoder::fecDecoder
const IFecCoder * fecDecoder
Definition: Ieee80211OfdmDecoder.h:30
inet::physicallayer::IFecCoder::getForwardErrorCorrection
virtual const IForwardErrorCorrection * getForwardErrorCorrection() const =0
inet::physicallayer::Ieee80211OfdmDecoder::code
const Ieee80211OfdmCode * code
Definition: Ieee80211OfdmDecoder.h:28
inet::physicallayer::IScrambler::getScrambling
virtual const IScrambling * getScrambling() const =0
inet::physicallayer::Ieee80211OfdmCode::getConvolutionalCode
const ConvolutionalCode * getConvolutionalCode() const
Definition: Ieee80211OfdmCode.h:31
inet::physicallayer::Ieee80211OfdmDecoder::deinterleaver
const IInterleaver * deinterleaver
Definition: Ieee80211OfdmDecoder.h:31