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

#include <Ieee80211OFDMModulator.h>

Inheritance diagram for inet::physicallayer::Ieee80211OFDMModulator:
inet::physicallayer::IModulator inet::physicallayer::IPrintableObject

Public Member Functions

 Ieee80211OFDMModulator (const Ieee80211OFDMModulation *subcarrierModulation, unsigned int polarityVectorOffset)
 
virtual const ITransmissionSymbolModelmodulate (const ITransmissionBitModel *bitModel) const override
 
const Ieee80211OFDMModulationgetModulation () const override
 
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
 

Static Public Attributes

static const APSKSymbol negativePilotSubcarrier
 
static const APSKSymbol positivePilotSubcarrier
 

Protected Member Functions

int getSubcarrierIndex (int ofdmSymbolIndex) const
 
void insertPilotSubcarriers (Ieee80211OFDMSymbol *ofdmSymbol, int symbolID) const
 

Protected Attributes

const Ieee80211OFDMModulationsubcarrierModulation
 
unsigned int pilotSubcarrierPolarityVectorOffset
 

Static Protected Attributes

static const double pilotSubcarrierPolarityVector [127]
 

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
}
 

Constructor & Destructor Documentation

inet::physicallayer::Ieee80211OFDMModulator::Ieee80211OFDMModulator ( const Ieee80211OFDMModulation subcarrierModulation,
unsigned int  polarityVectorOffset 
)
44  :
46  pilotSubcarrierPolarityVectorOffset(polarityVectorOffset)
47 {
48 }
unsigned int pilotSubcarrierPolarityVectorOffset
Definition: Ieee80211OFDMModulator.h:41
const Ieee80211OFDMModulation * subcarrierModulation
Definition: Ieee80211OFDMModulator.h:39

Member Function Documentation

const Ieee80211OFDMModulation* inet::physicallayer::Ieee80211OFDMModulator::getModulation ( ) const
inlineoverridevirtual

Implements inet::physicallayer::IModulator.

Referenced by inet::physicallayer::Ieee80211OFDMModulatorModule::getModulation().

51 { return subcarrierModulation; }
const Ieee80211OFDMModulation * subcarrierModulation
Definition: Ieee80211OFDMModulator.h:39
int inet::physicallayer::Ieee80211OFDMModulator::getSubcarrierIndex ( int  ofdmSymbolIndex) const
protected

Referenced by modulate().

59 {
60  // This is the translated version of the M(k) function defined in 18.3.5.10 OFDM modulation: (18-23) equation.
61  // We translate it by 26 since its range is [-26,26] and we use subcarrier indices as array indices.
62  if (ofdmSymbolIndex >= 0 && ofdmSymbolIndex <= 4)
63  return ofdmSymbolIndex;
64  else if (ofdmSymbolIndex >= 5 && ofdmSymbolIndex <= 17)
65  return ofdmSymbolIndex + 1;
66  else if (ofdmSymbolIndex >= 18 && ofdmSymbolIndex <= 23)
67  return ofdmSymbolIndex + 2;
68  else if (ofdmSymbolIndex >= 24 && ofdmSymbolIndex <= 29)
69  return ofdmSymbolIndex + 3;
70  else if (ofdmSymbolIndex >= 30 && ofdmSymbolIndex <= 42)
71  return ofdmSymbolIndex + 4;
72  else if (ofdmSymbolIndex >= 43 && ofdmSymbolIndex <= 47)
73  return ofdmSymbolIndex + 5;
74  else
75  throw cRuntimeError("The domain of the M(k) (k = %d) function is [0,47]", ofdmSymbolIndex);
76 }
void inet::physicallayer::Ieee80211OFDMModulator::insertPilotSubcarriers ( Ieee80211OFDMSymbol ofdmSymbol,
int  symbolID 
) const
protected

Referenced by modulate().

79 {
80  ofdmSymbol->pushAPSKSymbol(pilotSubcarrierPolarityVector[symbolID % 127] == 1 ? &positivePilotSubcarrier : &negativePilotSubcarrier, 5);
81  ofdmSymbol->pushAPSKSymbol(pilotSubcarrierPolarityVector[symbolID % 127] == 1 ? &positivePilotSubcarrier : &negativePilotSubcarrier, 19);
82  ofdmSymbol->pushAPSKSymbol(pilotSubcarrierPolarityVector[symbolID % 127] == 1 ? &positivePilotSubcarrier : &negativePilotSubcarrier, 33);
83  ofdmSymbol->pushAPSKSymbol(pilotSubcarrierPolarityVector[symbolID % 127] == 1 ? &negativePilotSubcarrier : &positivePilotSubcarrier, 47);
84 }
static const APSKSymbol negativePilotSubcarrier
Definition: Ieee80211OFDMModulator.h:35
static const APSKSymbol positivePilotSubcarrier
Definition: Ieee80211OFDMModulator.h:36
static const double pilotSubcarrierPolarityVector[127]
Definition: Ieee80211OFDMModulator.h:40
const ITransmissionSymbolModel * inet::physicallayer::Ieee80211OFDMModulator::modulate ( const ITransmissionBitModel bitModel) const
overridevirtual

Implements inet::physicallayer::IModulator.

Referenced by inet::physicallayer::Ieee80211LayeredOFDMTransmitter::encodeAndModulate(), and inet::physicallayer::Ieee80211OFDMModulatorModule::modulate().

87 {
88  std::vector<const ISymbol *> *ofdmSymbols = new std::vector<const ISymbol *>();
89  const APSKModulationBase *modulationScheme = subcarrierModulation->getSubcarrierModulation();
90  const BitVector *bits = bitModel->getBits();
91  // Divide the resulting coded and interleaved data string into groups of N_BPSC bits.
92  unsigned int nBPSC = modulationScheme->getCodeWordSize();
93  ShortBitVector bitGroup;
94  std::vector<const APSKSymbol *> apskSymbols;
95  for (unsigned int i = 0; i < bits->getSize(); i++) {
96  // For each of the bit groups, convert the bit group into a complex number according
97  // to the modulation encoding tables
98  bitGroup.setBit(i % nBPSC, bits->getBit(i));
99  if (i % nBPSC == nBPSC - 1) {
100  const APSKSymbol *apskSymbol = modulationScheme->mapToConstellationDiagram(bitGroup);
101  apskSymbols.push_back(apskSymbol);
102  }
103  }
104  // Divide the complex number string into groups of 48 complex numbers.
105  // Each such group is associated with one OFDM symbol.
106  for (unsigned int i = 0; i < apskSymbols.size(); i += NUMBER_OF_OFDM_DATA_SUBCARRIERS) {
107  Ieee80211OFDMSymbol *ofdmSymbol = new Ieee80211OFDMSymbol();
108  // In each group, the complex numbers are numbered 0 to 47 and mapped hereafter into OFDM
109  // subcarriers numbered -26 to -22, -20 to -8, -6 to -1, 1 to 6, 8 to 20, and 22 to 26.
110  // The 0 subcarrier, associated with center frequency, is omitted and filled with the value 0.
111  for (unsigned int j = 0; j < NUMBER_OF_OFDM_DATA_SUBCARRIERS; j++) {
112  int subcarrierIndex = getSubcarrierIndex(j);
113  ofdmSymbol->pushAPSKSymbol(apskSymbols.at(j + i), subcarrierIndex);
114  }
115  insertPilotSubcarriers(ofdmSymbol, i / NUMBER_OF_OFDM_DATA_SUBCARRIERS + pilotSubcarrierPolarityVectorOffset);
116  EV_DEBUG << "Modulated OFDM symbol: " << *ofdmSymbol << endl;
117  ofdmSymbols->push_back(ofdmSymbol);
118  }
119  return new Ieee80211OFDMTransmissionSymbolModel(1, NaN, ofdmSymbols->size() - 1, NaN, ofdmSymbols, modulationScheme, modulationScheme);
120 }
#define NUMBER_OF_OFDM_DATA_SUBCARRIERS
Definition: Ieee80211OFDMDefs.h:25
void insertPilotSubcarriers(Ieee80211OFDMSymbol *ofdmSymbol, int symbolID) const
Definition: Ieee80211OFDMModulator.cc:78
const APSKModulationBase * getSubcarrierModulation() const
Definition: Ieee80211OFDMModulation.h:34
#define NaN
Definition: INETMath.h:103
unsigned int pilotSubcarrierPolarityVectorOffset
Definition: Ieee80211OFDMModulator.h:41
int getSubcarrierIndex(int ofdmSymbolIndex) const
Definition: Ieee80211OFDMModulator.cc:58
const Ieee80211OFDMModulation * subcarrierModulation
Definition: Ieee80211OFDMModulator.h:39
virtual unsigned int getCodeWordSize() const override
Definition: APSKModulationBase.h:47
std::ostream & inet::physicallayer::Ieee80211OFDMModulator::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.

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

51 {
52  stream << "Ieee80211OFDMModulator";
53  if (level <= PRINT_LEVEL_TRACE)
54  stream << ", subcarrierModulation = " << printObjectToString(subcarrierModulation, level + 1);
55  return stream;
56 }
std::string printObjectToString(const IPrintableObject *object, int level)
Definition: IPrintableObject.h:73
const Ieee80211OFDMModulation * subcarrierModulation
Definition: Ieee80211OFDMModulator.h:39

Member Data Documentation

const APSKSymbol inet::physicallayer::Ieee80211OFDMModulator::negativePilotSubcarrier
static

Referenced by insertPilotSubcarriers().

const double inet::physicallayer::Ieee80211OFDMModulator::pilotSubcarrierPolarityVector
staticprotected
Initial value:
= {
1, 1, 1, 1, -1, -1, -1, 1, -1, -1, -1, -1, 1, 1, -1, 1, -1, -1, 1, 1, -1, 1, 1, -1, 1, 1, 1, 1, 1, 1, -1, 1,
1, 1, -1, 1, 1, -1, -1, 1, 1, 1, -1, 1, -1, -1, -1, 1, -1, 1, -1, -1, 1, -1, -1, 1, 1, 1, 1, 1, -1, -1, 1, 1,
-1, -1, 1, -1, 1, -1, 1, 1, -1, -1, -1, 1, 1, -1, -1, -1, -1, 1, -1, -1, 1, -1, 1, 1, 1, 1, -1, 1, -1, 1, -1, 1,
-1, -1, -1, -1, -1, 1, -1, 1, 1, -1, 1, -1, 1, 1, 1, -1, -1, 1, -1, -1, -1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1
}

Referenced by insertPilotSubcarriers().

unsigned int inet::physicallayer::Ieee80211OFDMModulator::pilotSubcarrierPolarityVectorOffset
protected

Referenced by modulate().

const APSKSymbol inet::physicallayer::Ieee80211OFDMModulator::positivePilotSubcarrier
static

Referenced by insertPilotSubcarriers().

const Ieee80211OFDMModulation* inet::physicallayer::Ieee80211OFDMModulator::subcarrierModulation
protected

Referenced by modulate(), and printToStream().


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