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

#include <Ieee80211OfdmInterleaver.h>

Inheritance diagram for inet::physicallayer::Ieee80211OfdmInterleaver:
inet::physicallayer::IInterleaver inet::IPrintableObject

Public Member Functions

 Ieee80211OfdmInterleaver (const Ieee80211OfdmInterleaving *interleaving)
 
virtual std::ostream & printToStream (std::ostream &stream, int level, int evFlags=0) const override
 Prints this object to the provided output stream. More...
 
BitVector interleave (const BitVector &bits) const override
 
BitVector deinterleave (const BitVector &bits) const override
 
int getNumberOfCodedBitsPerSymbol () const
 
int getNumberOfCodedBitsPerSubcarrier () const
 
const Ieee80211OfdmInterleavinggetInterleaving () const override
 
- 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 Attributes

int numberOfCodedBitsPerSymbol
 
int numberOfCodedBitsPerSubcarrier
 
int s
 
const Ieee80211OfdmInterleavinginterleaving = 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

◆ Ieee80211OfdmInterleaver()

inet::physicallayer::Ieee80211OfdmInterleaver::Ieee80211OfdmInterleaver ( const Ieee80211OfdmInterleaving interleaving)

Member Function Documentation

◆ deinterleave()

BitVector inet::physicallayer::Ieee80211OfdmInterleaver::deinterleave ( const BitVector bits) const
overridevirtual

Implements inet::physicallayer::IInterleaver.

46 {
47  if (interleavedBits.getSize() % numberOfCodedBitsPerSymbol)
48  throw cRuntimeError("interleavedBits length must be a multiple of numberOfCodedBitsPerSymbol = %d", numberOfCodedBitsPerSymbol);
49  EV_DEBUG << "Deinterleaving the following bits: " << interleavedBits << endl;
50  int numberOfSymbols = interleavedBits.getSize() / numberOfCodedBitsPerSymbol;
51  BitVector deinterleavedBits;
52  for (int i = 0; i < numberOfSymbols; i++) {
53  for (int j = 0; j < numberOfCodedBitsPerSymbol; j++) {
54  // i = s × Floor(j/s) + (j + Floor(16 × j/N_CBPS )) mod s, j = 0,1,... N CBPS - 1,
55  // where s = max(N_BPSC / 2, 1).
56  int firstPerm = s * floor(j / s) + (j + (int)floor(16 * j / numberOfCodedBitsPerSymbol)) % s;
57  // k = 16 × i - (N_CBPS - 1)Floor(16 × i/N_CBPS ), i = 0,1,... N_CBPS - 1
58  int secondPerm = 16 * firstPerm - (numberOfCodedBitsPerSymbol - 1) * floor(16 * firstPerm / numberOfCodedBitsPerSymbol);
59  int shiftedSecondPerm = secondPerm + i * numberOfCodedBitsPerSymbol;
60  deinterleavedBits.setBit(shiftedSecondPerm, interleavedBits.getBit(i * numberOfCodedBitsPerSymbol + j));
61  }
62  }
63  EV_DEBUG << "The deinterleaved bits are: " << deinterleavedBits << endl;
64  return deinterleavedBits;
65 }

Referenced by inet::physicallayer::Ieee80211OfdmInterleaverModule::deinterleave().

◆ getInterleaving()

const Ieee80211OfdmInterleaving* inet::physicallayer::Ieee80211OfdmInterleaver::getInterleaving ( ) const
inlineoverridevirtual

◆ getNumberOfCodedBitsPerSubcarrier()

int inet::physicallayer::Ieee80211OfdmInterleaver::getNumberOfCodedBitsPerSubcarrier ( ) const
inline

◆ getNumberOfCodedBitsPerSymbol()

int inet::physicallayer::Ieee80211OfdmInterleaver::getNumberOfCodedBitsPerSymbol ( ) const
inline

◆ interleave()

BitVector inet::physicallayer::Ieee80211OfdmInterleaver::interleave ( const BitVector bits) const
overridevirtual

Implements inet::physicallayer::IInterleaver.

23 {
24  if (deinterleavedBits.getSize() % numberOfCodedBitsPerSymbol)
25  throw cRuntimeError("deinterleavedBits length = %d must be a multiple of numberOfCodedBitsPerSymbol = %d", deinterleavedBits.getSize(), numberOfCodedBitsPerSymbol);
26  int numberOfSymbols = deinterleavedBits.getSize() / numberOfCodedBitsPerSymbol;
27  EV_DEBUG << "Interleaving the following bits: " << deinterleavedBits << endl;
28  BitVector interleavedBits;
29  for (int i = 0; i < numberOfSymbols; i++) {
30  for (int j = 0; j < numberOfCodedBitsPerSymbol; j++) {
31  // First permutation: (N_CBPS /16) (k mod 16) + Floor(k/16), k = 0,1,...,N_CBPS - 1.
32  int firstPerm = (numberOfCodedBitsPerSymbol / 16) * (j % 16) + floor(j / 16);
33  // Second permutation: j = s × Floor(i/s) + (i + N_CBPS - Floor(16 × i/N_CBPS )) mod s, i = 0,1,... N_CBPS – 1,
34  // where s = max(N_BPSC / 2, 1).
35  int secondPerm = s * floor(firstPerm / s)
36  + (firstPerm + numberOfCodedBitsPerSymbol - (int)floor(16 * firstPerm / numberOfCodedBitsPerSymbol)) % s;
37  int shiftedSecondPerm = secondPerm + i * numberOfCodedBitsPerSymbol;
38  interleavedBits.setBit(shiftedSecondPerm, deinterleavedBits.getBit(i * numberOfCodedBitsPerSymbol + j));
39  }
40  }
41  EV_DEBUG << "The interleaved bits are: " << interleavedBits << endl;
42  return interleavedBits;
43 }

Referenced by inet::physicallayer::Ieee80211OfdmInterleaverModule::interleave().

◆ printToStream()

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

Prints this object to the provided output stream.

Reimplemented from inet::IPrintableObject.

15 {
16  stream << "Ieee80211Interleaver";
17  if (level <= PRINT_LEVEL_TRACE)
19  return stream;
20 }

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

Member Data Documentation

◆ interleaving

const Ieee80211OfdmInterleaving* inet::physicallayer::Ieee80211OfdmInterleaver::interleaving = nullptr
protected

◆ numberOfCodedBitsPerSubcarrier

int inet::physicallayer::Ieee80211OfdmInterleaver::numberOfCodedBitsPerSubcarrier
protected

◆ numberOfCodedBitsPerSymbol

int inet::physicallayer::Ieee80211OfdmInterleaver::numberOfCodedBitsPerSymbol
protected

◆ s

int inet::physicallayer::Ieee80211OfdmInterleaver::s
protected

The documentation for this class was generated from the following files:
inet::physicallayer::Ieee80211OfdmInterleaving::getNumberOfCodedBitsPerSymbol
int getNumberOfCodedBitsPerSymbol() const
Definition: Ieee80211OfdmInterleaving.h:29
inet::physicallayer::Ieee80211OfdmInterleaving::getNumberOfCodedBitsPerSubcarrier
int getNumberOfCodedBitsPerSubcarrier() const
Definition: Ieee80211OfdmInterleaving.h:28
inet::physicallayer::Ieee80211OfdmInterleaver::numberOfCodedBitsPerSymbol
int numberOfCodedBitsPerSymbol
Definition: Ieee80211OfdmInterleaver.h:27
inet::printFieldToString
std::string printFieldToString(const IPrintableObject *object, int level, int evFlags=0)
Definition: IPrintableObject.h:98
inet::physicallayer::Ieee80211OfdmInterleaver::numberOfCodedBitsPerSubcarrier
int numberOfCodedBitsPerSubcarrier
Definition: Ieee80211OfdmInterleaver.h:28
EV_FIELD
#define EV_FIELD(...)
Definition: INETDefs.h:112
inet::IPrintableObject::PRINT_LEVEL_TRACE
@ PRINT_LEVEL_TRACE
Definition: IPrintableObject.h:22
inet::sctp::max
double max(const double a, const double b)
Returns the maximum of a and b.
Definition: SctpAssociation.h:266
inet::evFlags
int evFlags
Definition: INETDefs.cc:12
inet::physicallayer::Ieee80211OfdmInterleaver::interleaving
const Ieee80211OfdmInterleaving * interleaving
Definition: Ieee80211OfdmInterleaver.h:30
inet::physicallayer::Ieee80211OfdmInterleaver::s
int s
Definition: Ieee80211OfdmInterleaver.h:29