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

#include <ConvolutionalCoder.h>

Inheritance diagram for inet::physicallayer::ConvolutionalCoder:
inet::physicallayer::IFECCoder inet::physicallayer::IPrintableObject

Classes

class  TrellisGraphNode
 

Public Types

typedef std::vector< std::vector< ShortBitVector > > ShortBitVectorMatrix
 
- 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
}
 

Public Member Functions

 ConvolutionalCoder (const ConvolutionalCode *convolutionalCode)
 
 ~ConvolutionalCoder ()
 
BitVector encode (const BitVector &informationBits) const override
 
std::pair< BitVector, bool > decode (const BitVector &encodedBits) const override
 
const ConvolutionalCodegetForwardErrorCorrection () const override
 
unsigned int getMemorySizeSum () const
 
const std::vector< int > & getConstraintLengthVector () const
 
const ShortBitVectorMatrixgetTransferFunctionMatrix () const
 
const std::vector< ShortBitVector > & getPuncturingMatrix () const
 
int getNumberOfStates () const
 
int getNumberOfOutputSymbols () const
 
int getNumberOfInputSymbols () const
 
const int ** getStateTransitionTable () const
 
const int ** getOutputTable () const
 
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

bool eXOR (bool alpha, bool beta) const
 
void setTransferFunctionMatrix (std::vector< std::vector< int > > &transferFMatrix)
 
ShortBitVector inputSymbolToOutputSymbol (const ShortBitVector &state, const ShortBitVector &inputSymbol) const
 
bool modulo2Adder (const ShortBitVector &shiftRegisters, const ShortBitVector &generatorPolynomial) const
 
ShortBitVector giveNextOutputSymbol (const BitVector &encodedBits, int decodedLength, const BitVector &isPunctured, ShortBitVector &excludedFromHammingDistance) const
 
BitVector puncturing (const BitVector &informationBits) const
 
BitVector depuncturing (const BitVector &decodedBits, BitVector &isPunctured) const
 
BitVector getPuncturedIndices (unsigned int length) const
 
unsigned int computeHammingDistance (const ShortBitVector &u, const ShortBitVector &excludedBits, const ShortBitVector &w) const
 
void updateTrellisGraph (TrellisGraphNode **trellisGraph, unsigned int time, const ShortBitVector &outputSymbol, const ShortBitVector &excludedFromHammingDistance) const
 
bool isCompletelyDecoded (unsigned int encodedLength, unsigned int decodedLength) const
 
void initParameters ()
 
void memoryAllocations ()
 
void computeHammingDistanceLookupTable ()
 
void computeMemorySizes ()
 
void computeMemorySizeSum ()
 
void computeNumberOfStates ()
 
void computeNumberOfInputAndOutputSymbols ()
 
void computeStateTransitions ()
 
void computeOutputAndInputSymbols ()
 
void computeDecimalToOutputSymbolVector ()
 
void printStateTransitions () const
 
void printOutputs () const
 
void printTransferFunctionMatrix () const
 
void parseMatrix (const char *strMatrix, std::vector< std::vector< int > > &matrix) const
 
void parseVector (const char *strVector, std::vector< int > &vector) const
 
void convertToShortBitVectorMatrix (std::vector< std::vector< int > > &matrix, std::vector< ShortBitVector > &boolMatrix) const
 
ShortBitVector octalToBinary (int octalNum, int fixedSize) const
 
int octalToDec (int octalNum) const
 
std::pair< BitVector, bool > traversePath (const TrellisGraphNode &bestNode, TrellisGraphNode **bestPaths, bool isTruncatedMode) const
 

Protected Attributes

const char * mode
 
unsigned int codeRateParamaterK
 
unsigned int codeRateParamaterN
 
unsigned int codeRatePuncturingK
 
unsigned int codeRatePuncturingN
 
int memorySizeSum
 
std::vector< int > memorySizes
 
std::vector< int > constraintLengths
 
int numberOfStates
 
int numberOfInputSymbols
 
int numberOfOutputSymbols
 
ShortBitVectorMatrix transferFunctionMatrix
 
std::vector< ShortBitVectorpuncturingMatrix
 
int ** inputSymbols
 
ShortBitVector ** outputSymbols
 
ShortBitVectordecimalToInputSymbol
 
ShortBitVectordecimalToOutputSymbol
 
int ** stateTransitions
 
unsigned char *** hammingDistanceLookupTable
 
std::vector< std::vector< TrellisGraphNode > > trellisGraph
 
const ConvolutionalCodeconvolutionalCode
 

Member Typedef Documentation

Constructor & Destructor Documentation

inet::physicallayer::ConvolutionalCoder::ConvolutionalCoder ( const ConvolutionalCode convolutionalCode)
500 {
501  const char *strTransferFunctionMatrix = convolutionalCode->getTransferFunctionMatrix();
502  const char *strPuncturingMatrix = convolutionalCode->getPuncturingMatrix();
503  const char *strConstraintLengthVector = convolutionalCode->getConstraintLengthVector();
505  if (strcmp(mode, "terminated") && strcmp(mode, "truncated"))
506  throw cRuntimeError("Unknown (= %s ) coding mode", mode);
509  parseVector(strConstraintLengthVector, constraintLengths);
510  std::vector<std::vector<int> > pMatrix;
511  parseMatrix(strPuncturingMatrix, pMatrix);
513  std::vector<std::vector<int> > transferFMatrix;
514  parseMatrix(strTransferFunctionMatrix, transferFMatrix);
515  codeRateParamaterK = transferFMatrix.size();
516  codeRateParamaterN = transferFMatrix.at(0).size();
517  for (unsigned int i = 0; i < transferFMatrix.size(); i++) {
518  for (unsigned int j = 0; j < transferFMatrix.at(i).size(); j++) {
519  int decPolynom = octalToDec(transferFMatrix.at(i).at(j));
520  int constraintLength = constraintLengths[i];
521  if (decPolynom >= pow(2, constraintLength))
522  throw cRuntimeError("Code size is greater then constraint length");
523  }
524  }
525  // TODO: check whether it is less than..
526  for (unsigned int i = 0; i < codeRateParamaterK; i++)
527  if (transferFMatrix.at(i).size() != codeRateParamaterN)
528  throw cRuntimeError("Transfer function matrix must be a k-by-n matrix of octal numbers");
529  if (transferFMatrix.size() != constraintLengths.size())
530  throw cRuntimeError("Constraint length vector must be a 1-by-k vector of integers");
531  if (puncturingMatrix.size() != codeRateParamaterN)
532  throw cRuntimeError("Puncturing matrix must be a n-by-arbitrary bool matrix");
533  setTransferFunctionMatrix(transferFMatrix);
534  initParameters();
535 }
unsigned int codeRateParamaterN
Definition: ConvolutionalCoder.h:69
std::vector< int > constraintLengths
Definition: ConvolutionalCoder.h:73
unsigned int codeRateParamaterK
Definition: ConvolutionalCoder.h:69
std::vector< ShortBitVector > puncturingMatrix
Definition: ConvolutionalCoder.h:78
void parseVector(const char *strVector, std::vector< int > &vector) const
Definition: ConvolutionalCoder.cc:305
const char * getMode() const
Definition: ConvolutionalCode.h:44
const char * getPuncturingMatrix() const
Definition: ConvolutionalCode.h:45
void convertToShortBitVectorMatrix(std::vector< std::vector< int > > &matrix, std::vector< ShortBitVector > &boolMatrix) const
Definition: ConvolutionalCoder.cc:312
void setTransferFunctionMatrix(std::vector< std::vector< int > > &transferFMatrix)
Definition: ConvolutionalCoder.cc:342
const char * getTransferFunctionMatrix() const
Definition: ConvolutionalCode.h:46
int getCodeRatePuncturingN() const
Definition: ConvolutionalCode.h:42
const char * mode
Definition: ConvolutionalCoder.h:68
const ConvolutionalCode * convolutionalCode
Definition: ConvolutionalCoder.h:86
unsigned int codeRatePuncturingN
Definition: ConvolutionalCoder.h:70
void initParameters()
Definition: ConvolutionalCoder.cc:194
int getCodeRatePuncturingK() const
Definition: ConvolutionalCode.h:41
void parseMatrix(const char *strMatrix, std::vector< std::vector< int > > &matrix) const
Definition: ConvolutionalCoder.cc:295
int octalToDec(int octalNum) const
Definition: ConvolutionalCoder.cc:537
const char * getConstraintLengthVector() const
Definition: ConvolutionalCode.h:43
unsigned int codeRatePuncturingK
Definition: ConvolutionalCoder.h:70
inet::physicallayer::ConvolutionalCoder::~ConvolutionalCoder ( )
551 {
552  for (int i = 0; i < numberOfOutputSymbols; i++) {
553  for (int j = 0; j < numberOfOutputSymbols; j++)
554  delete[] hammingDistanceLookupTable[i][j];
555  delete[] hammingDistanceLookupTable[i];
556  }
558  for (int i = 0; i < numberOfStates; i++) {
559  delete[] stateTransitions[i];
560  delete[] outputSymbols[i];
561  delete[] inputSymbols[i];
562  }
563  delete[] stateTransitions;
564  delete[] outputSymbols;
565  delete[] inputSymbols;
566  delete[] decimalToOutputSymbol;
567  delete[] decimalToInputSymbol;
568 }
ShortBitVector * decimalToOutputSymbol
Definition: ConvolutionalCoder.h:82
int numberOfOutputSymbols
Definition: ConvolutionalCoder.h:76
int ** stateTransitions
Definition: ConvolutionalCoder.h:83
unsigned char *** hammingDistanceLookupTable
Definition: ConvolutionalCoder.h:84
ShortBitVector ** outputSymbols
Definition: ConvolutionalCoder.h:80
ShortBitVector * decimalToInputSymbol
Definition: ConvolutionalCoder.h:81
int ** inputSymbols
Definition: ConvolutionalCoder.h:79
int numberOfStates
Definition: ConvolutionalCoder.h:74

Member Function Documentation

void inet::physicallayer::ConvolutionalCoder::computeDecimalToOutputSymbolVector ( )
protected

Referenced by initParameters().

370 {
371  for (int i = 0; i != numberOfOutputSymbols; i++) {
372  ShortBitVector outputSymbol(i, codeRateParamaterN);
373  decimalToOutputSymbol[outputSymbol.reverseToDecimal()] = outputSymbol;
374  }
375 }
ShortBitVector * decimalToOutputSymbol
Definition: ConvolutionalCoder.h:82
int numberOfOutputSymbols
Definition: ConvolutionalCoder.h:76
unsigned int codeRateParamaterN
Definition: ConvolutionalCoder.h:69
unsigned int inet::physicallayer::ConvolutionalCoder::computeHammingDistance ( const ShortBitVector u,
const ShortBitVector excludedBits,
const ShortBitVector w 
) const
inlineprotected

Referenced by updateTrellisGraph().

98  {
99 #ifndef NDEBUG
100  if (u.isEmpty() || w.isEmpty())
101  throw cRuntimeError("You can't compute the Hamming distance between undefined BitVectors");
102  if (u.getSize() != w.getSize())
103  throw cRuntimeError("You can't compute Hamming distance between two vectors with different sizes");
104 #endif // ifndef NDEBUG
105  return hammingDistanceLookupTable[u.toDecimal()][w.toDecimal()][excludedBits.toDecimal()];
106  }
unsigned char *** hammingDistanceLookupTable
Definition: ConvolutionalCoder.h:84
void inet::physicallayer::ConvolutionalCoder::computeHammingDistanceLookupTable ( )
protected

Referenced by initParameters().

180 {
181  for (int i = 0; i < numberOfOutputSymbols; i++) {
182  for (int j = 0; j < numberOfOutputSymbols; j++) {
183  for (int k = 0; k < numberOfOutputSymbols; k++) {
184  unsigned int hammingDistance = i ^ j;
185  hammingDistance = hammingDistance & k;
186  hammingDistance = hammingDistance - ((hammingDistance >> 1) & 0x55555555);
187  hammingDistance = (hammingDistance & 0x33333333) + ((hammingDistance >> 2) & 0x33333333);
188  hammingDistanceLookupTable[i][j][k] = (((hammingDistance + (hammingDistance >> 4)) & 0x0F0F0F0F) * 0x01010101) >> 24;
189  }
190  }
191  }
192 }
int numberOfOutputSymbols
Definition: ConvolutionalCoder.h:76
unsigned char *** hammingDistanceLookupTable
Definition: ConvolutionalCoder.h:84
const double k
Definition: QAM16Modulation.cc:24
void inet::physicallayer::ConvolutionalCoder::computeMemorySizes ( )
protected

Referenced by initParameters().

156 {
157  for (auto& elem : constraintLengths)
158  memorySizes.push_back(elem - 1);
159 }
std::vector< int > constraintLengths
Definition: ConvolutionalCoder.h:73
std::vector< int > memorySizes
Definition: ConvolutionalCoder.h:72
void inet::physicallayer::ConvolutionalCoder::computeMemorySizeSum ( )
protected

Referenced by initParameters().

173 {
174  memorySizeSum = 0;
175  for (auto& elem : memorySizes)
176  memorySizeSum += elem;
177 }
std::vector< int > memorySizes
Definition: ConvolutionalCoder.h:72
int memorySizeSum
Definition: ConvolutionalCoder.h:71
void inet::physicallayer::ConvolutionalCoder::computeNumberOfInputAndOutputSymbols ( )
protected

Referenced by initParameters().

167 {
170 }
int numberOfOutputSymbols
Definition: ConvolutionalCoder.h:76
unsigned int codeRateParamaterN
Definition: ConvolutionalCoder.h:69
unsigned int codeRateParamaterK
Definition: ConvolutionalCoder.h:69
int numberOfInputSymbols
Definition: ConvolutionalCoder.h:75
void inet::physicallayer::ConvolutionalCoder::computeNumberOfStates ( )
protected

Referenced by initParameters().

162 {
163  numberOfStates = (int)pow(2, memorySizeSum);
164 }
int memorySizeSum
Definition: ConvolutionalCoder.h:71
int numberOfStates
Definition: ConvolutionalCoder.h:74
void inet::physicallayer::ConvolutionalCoder::computeOutputAndInputSymbols ( )
protected

Referenced by initParameters().

111 {
112  for (int i = 0; i != numberOfInputSymbols; i++) {
113  ShortBitVector inputSymbol(i, codeRateParamaterK);
114  decimalToInputSymbol[inputSymbol.reverseToDecimal()] = inputSymbol;
115  }
116  for (int decState = 0; decState != numberOfStates; decState++) {
117  ShortBitVector state(decState, memorySizeSum);
118  for (int decInputSymbol = 0; decInputSymbol != numberOfInputSymbols; decInputSymbol++) {
119  const ShortBitVector& inputSymbol = decimalToInputSymbol[decInputSymbol];
120  ShortBitVector outputSymbol = inputSymbolToOutputSymbol(state, inputSymbol);
121  int decOutputSymbol = outputSymbol.reverseToDecimal();
122  int reverseDec = state.reverseToDecimal();
123  outputSymbols[reverseDec][decInputSymbol] = outputSymbol;
124  inputSymbols[reverseDec][decOutputSymbol] = decInputSymbol;
125  }
126  }
127 }
unsigned int codeRateParamaterK
Definition: ConvolutionalCoder.h:69
int numberOfInputSymbols
Definition: ConvolutionalCoder.h:75
ShortBitVector ** outputSymbols
Definition: ConvolutionalCoder.h:80
ShortBitVector * decimalToInputSymbol
Definition: ConvolutionalCoder.h:81
int ** inputSymbols
Definition: ConvolutionalCoder.h:79
ShortBitVector inputSymbolToOutputSymbol(const ShortBitVector &state, const ShortBitVector &inputSymbol) const
Definition: ConvolutionalCoder.cc:80
int memorySizeSum
Definition: ConvolutionalCoder.h:71
int numberOfStates
Definition: ConvolutionalCoder.h:74
void inet::physicallayer::ConvolutionalCoder::computeStateTransitions ( )
protected

Referenced by initParameters().

254 {
255  for (int decState = 0; decState != numberOfStates; decState++) {
256  ShortBitVector state(decState, memorySizeSum);
257  ShortBitVector shiftedState = state;
258  shiftedState.leftShift(1);
259  for (int is = 0; is != numberOfInputSymbols; is++) {
260  ShortBitVector nextState = shiftedState;
261  ShortBitVector inputSymbol(is, codeRateParamaterK);
262  int shift = 0;
263  for (int m = inputSymbol.getSize() - 1; m >= 0; m--) {
264  nextState.setBit(shift, inputSymbol.getBit(m));
265  shift += memorySizes.at(m);
266  }
267  stateTransitions[state.reverseToDecimal()][inputSymbol.reverseToDecimal()] = nextState.reverseToDecimal();
268  }
269  }
270 }
unsigned int codeRateParamaterK
Definition: ConvolutionalCoder.h:69
int ** stateTransitions
Definition: ConvolutionalCoder.h:83
int numberOfInputSymbols
Definition: ConvolutionalCoder.h:75
std::vector< int > memorySizes
Definition: ConvolutionalCoder.h:72
int memorySizeSum
Definition: ConvolutionalCoder.h:71
int numberOfStates
Definition: ConvolutionalCoder.h:74
value< double, units::m > m
Definition: Units.h:1047
void inet::physicallayer::ConvolutionalCoder::convertToShortBitVectorMatrix ( std::vector< std::vector< int > > &  matrix,
std::vector< ShortBitVector > &  boolMatrix 
) const
protected

Referenced by ConvolutionalCoder().

313 {
314  for (auto& elem : matrix) {
315  std::vector<int> matrixRow = elem;
316  ShortBitVector row;
317  for (auto& matrixRow_j : matrixRow) {
318  if (matrixRow_j == 1)
319  row.appendBit(true);
320  else if (matrixRow_j == 0)
321  row.appendBit(false);
322  else
323  throw cRuntimeError("A bool matrix only contains 0-1 values");
324  }
325  boolMatrix.push_back(row);
326  }
327 }
std::pair< BitVector, bool > inet::physicallayer::ConvolutionalCoder::decode ( const BitVector encodedBits) const
overridevirtual

Implements inet::physicallayer::IFECCoder.

Referenced by inet::physicallayer::ConvolutionalCoderModule::decode().

438 {
439  BitVector isPunctured;
440  BitVector depuncturedEncodedBits = depuncturing(encodedBits, isPunctured);
441  unsigned int encodedBitsSize = depuncturedEncodedBits.getSize();
442  if (encodedBitsSize % codeRateParamaterN != 0)
443  throw cRuntimeError("Length of encodedBits must be a multiple of codeRateParamaterN = %d", codeRateParamaterN);
444  bool isTruncatedMode = false;
445  if (!strcmp(mode, "truncated"))
446  isTruncatedMode = true;
447  else if (!strcmp(mode, "terminated"))
448  isTruncatedMode = false;
449  else
450  throw cRuntimeError("Unknown decodingMode = %s decodingMode", mode);
451  TrellisGraphNode **trellisGraph;
452  trellisGraph = new TrellisGraphNode *[numberOfStates];
453  for (int i = 0; i != numberOfStates; i++) {
454  int length = depuncturedEncodedBits.getSize() / codeRateParamaterN + 1;
455  trellisGraph[i] = new TrellisGraphNode[length];
456  for (int j = 0; j < length; j++)
457  trellisGraph[i][j] = TrellisGraphNode(-1, -1, -1, INT32_MAX, 0, 0);
458  }
459  trellisGraph[0][0].state = 0;
460  EV_DEBUG << "Decoding the following bits: " << depuncturedEncodedBits << endl;
461  ShortBitVector countsOnHammingDistance;
462  countsOnHammingDistance.appendBit(true, codeRateParamaterN);
463  ShortBitVector nextOutputSymbol = giveNextOutputSymbol(depuncturedEncodedBits, 0, isPunctured, countsOnHammingDistance);
464  unsigned int time = 0;
465  while (!nextOutputSymbol.isEmpty()) {
466  updateTrellisGraph(trellisGraph, time, nextOutputSymbol, countsOnHammingDistance);
467  time++;
468  countsOnHammingDistance = ShortBitVector();
469  countsOnHammingDistance.appendBit(true, codeRateParamaterN);
470  nextOutputSymbol = giveNextOutputSymbol(depuncturedEncodedBits, time * codeRateParamaterK, isPunctured, countsOnHammingDistance);
471  }
472  TrellisGraphNode bestNode;
473  if (!isTruncatedMode)
474  bestNode = trellisGraph[0][time];
475  else {
476  bestNode = trellisGraph[0][time];
477  for (int i = 1; i != numberOfStates; i++) {
478  TrellisGraphNode currentNode = trellisGraph[i][time];
479  if (currentNode.symbol != -1 && currentNode.comulativeHammingDistance < bestNode.comulativeHammingDistance)
480  bestNode = currentNode;
481  }
482  }
483  std::pair<BitVector, bool> result = traversePath(bestNode, trellisGraph, isTruncatedMode);
484  if (result.second)
485  {
486  EV_DEBUG << "Recovered message: " << result.first << endl;
487  EV_DEBUG << "Number of errors: " << bestNode.numberOfErrors
488  << " Cumulative error (Hamming distance): " << bestNode.comulativeHammingDistance
489  << " End state: " << bestNode.state << endl;
490  }
491  else
492  EV_DEBUG << "None of the paths in the trellis graph lead to the all-zeros state" << endl;
493  for (int i = 0; i < numberOfStates; i++)
494  delete[] trellisGraph[i];
495  delete[] trellisGraph;
496  return result;
497 }
unsigned int codeRateParamaterN
Definition: ConvolutionalCoder.h:69
ShortBitVector giveNextOutputSymbol(const BitVector &encodedBits, int decodedLength, const BitVector &isPunctured, ShortBitVector &excludedFromHammingDistance) const
Definition: ConvolutionalCoder.cc:272
std::vector< std::vector< TrellisGraphNode > > trellisGraph
Definition: ConvolutionalCoder.h:85
unsigned int codeRateParamaterK
Definition: ConvolutionalCoder.h:69
std::pair< BitVector, bool > traversePath(const TrellisGraphNode &bestNode, TrellisGraphNode **bestPaths, bool isTruncatedMode) const
Definition: ConvolutionalCoder.cc:418
#define INT32_MAX
Definition: lexer.cc:75
const char * mode
Definition: ConvolutionalCoder.h:68
int numberOfStates
Definition: ConvolutionalCoder.h:74
void updateTrellisGraph(TrellisGraphNode **trellisGraph, unsigned int time, const ShortBitVector &outputSymbol, const ShortBitVector &excludedFromHammingDistance) const
Definition: ConvolutionalCoder.cc:377
BitVector depuncturing(const BitVector &decodedBits, BitVector &isPunctured) const
Definition: ConvolutionalCoder.cc:61
BitVector inet::physicallayer::ConvolutionalCoder::depuncturing ( const BitVector decodedBits,
BitVector isPunctured 
) const
protected

Referenced by decode().

62 {
63  ASSERT(decodedBits.getSize() % codeRatePuncturingN == 0);
64  int encodedLength = (decodedBits.getSize() / codeRatePuncturingN) * codeRatePuncturingK;
65  int depuncturedLength = (encodedLength / codeRateParamaterK) * codeRateParamaterN;
66  isPunctured = getPuncturedIndices(depuncturedLength);
67  BitVector depuncturedDecodedBits;
68  int idx = 0;
69  for (int i = 0; i < depuncturedLength; i++) {
70  if (isPunctured.getBit(i))
71  depuncturedDecodedBits.appendBit(false);
72  else {
73  depuncturedDecodedBits.appendBit(decodedBits.getBit(idx));
74  idx++;
75  }
76  }
77  return depuncturedDecodedBits;
78 }
unsigned int codeRateParamaterN
Definition: ConvolutionalCoder.h:69
unsigned int codeRateParamaterK
Definition: ConvolutionalCoder.h:69
BitVector getPuncturedIndices(unsigned int length) const
Definition: ConvolutionalCoder.cc:34
unsigned int codeRatePuncturingN
Definition: ConvolutionalCoder.h:70
unsigned int codeRatePuncturingK
Definition: ConvolutionalCoder.h:70
BitVector inet::physicallayer::ConvolutionalCoder::encode ( const BitVector informationBits) const
overridevirtual

Implements inet::physicallayer::IFECCoder.

Referenced by inet::physicallayer::ConvolutionalCoderModule::encode().

208 {
209  EV_DEBUG << "Encoding the following bits: " << informationBits << endl;
210  if (informationBits.getSize() % codeRateParamaterK)
211  throw cRuntimeError("Length of informationBits must be a multiple of codeRateParamaterK = %d", codeRateParamaterK);
212  BitVector encodedInformationBits;
213  int state = 0;
214  for (unsigned int i = 0; i < informationBits.getSize(); i += codeRateParamaterK) {
215  ShortBitVector inputSymbol;
216  for (unsigned int j = i; j < i + codeRateParamaterK; j++)
217  inputSymbol.appendBit(informationBits.getBit(j));
218  int inputSymbolDec = inputSymbol.reverseToDecimal();
219  const ShortBitVector& encodedSymbol = outputSymbols[state][inputSymbolDec];
220  state = stateTransitions[state][inputSymbolDec];
221  for (unsigned int j = 0; j < encodedSymbol.getSize(); j++)
222  encodedInformationBits.appendBit(encodedSymbol.getBit(j));
223  }
224  BitVector puncturedEncodedInformationBits = puncturing(encodedInformationBits);
225  EV_DEBUG << "The encoded bits are: " << puncturedEncodedInformationBits << endl;
226  return puncturedEncodedInformationBits;
227 }
unsigned int codeRateParamaterK
Definition: ConvolutionalCoder.h:69
int ** stateTransitions
Definition: ConvolutionalCoder.h:83
BitVector puncturing(const BitVector &informationBits) const
Definition: ConvolutionalCoder.cc:51
ShortBitVector ** outputSymbols
Definition: ConvolutionalCoder.h:80
bool inet::physicallayer::ConvolutionalCoder::eXOR ( bool  alpha,
bool  beta 
) const
inlineprotected

Referenced by inputSymbolToOutputSymbol(), and modulo2Adder().

89 { return alpha != beta; }
const value< double, units::unit > alpha(7.2973525376e-3)
const std::vector<int>& inet::physicallayer::ConvolutionalCoder::getConstraintLengthVector ( ) const
inline
142 { return constraintLengths; }
std::vector< int > constraintLengths
Definition: ConvolutionalCoder.h:73
const ConvolutionalCode* inet::physicallayer::ConvolutionalCoder::getForwardErrorCorrection ( ) const
inlineoverridevirtual

Implements inet::physicallayer::IFECCoder.

Referenced by inet::physicallayer::ConvolutionalCoderModule::getForwardErrorCorrection().

136 { return convolutionalCode; }
const ConvolutionalCode * convolutionalCode
Definition: ConvolutionalCoder.h:86
unsigned int inet::physicallayer::ConvolutionalCoder::getMemorySizeSum ( ) const
inline
141 { return memorySizeSum; }
int memorySizeSum
Definition: ConvolutionalCoder.h:71
int inet::physicallayer::ConvolutionalCoder::getNumberOfInputSymbols ( ) const
inline
147 { return numberOfInputSymbols; }
int numberOfInputSymbols
Definition: ConvolutionalCoder.h:75
int inet::physicallayer::ConvolutionalCoder::getNumberOfOutputSymbols ( ) const
inline
146 { return numberOfOutputSymbols; }
int numberOfOutputSymbols
Definition: ConvolutionalCoder.h:76
int inet::physicallayer::ConvolutionalCoder::getNumberOfStates ( ) const
inline
145 { return numberOfStates; }
int numberOfStates
Definition: ConvolutionalCoder.h:74
const int** inet::physicallayer::ConvolutionalCoder::getOutputTable ( ) const
inline
153 { return (const int **)inputSymbols; }
int ** inputSymbols
Definition: ConvolutionalCoder.h:79
BitVector inet::physicallayer::ConvolutionalCoder::getPuncturedIndices ( unsigned int  length) const
protected

Referenced by depuncturing(), and puncturing().

35 {
36  BitVector isPunctured;
37  isPunctured.appendBit(false, length);
38  int puncturingMatrixSize = puncturingMatrix.at(0).getSize();
39  for (unsigned int i = 0; i < codeRateParamaterN; i++) {
40  int idx = 0;
41  for (unsigned int j = 0; codeRateParamaterN *j + i < length; j++) {
42  int place = idx % puncturingMatrixSize;
43  bool stolen = !puncturingMatrix.at(i).getBit(place);
44  isPunctured.setBit(codeRateParamaterN * j + i, stolen);
45  idx++;
46  }
47  }
48  return isPunctured;
49 }
unsigned int codeRateParamaterN
Definition: ConvolutionalCoder.h:69
std::vector< ShortBitVector > puncturingMatrix
Definition: ConvolutionalCoder.h:78
const std::vector<ShortBitVector>& inet::physicallayer::ConvolutionalCoder::getPuncturingMatrix ( ) const
inline
144 { return puncturingMatrix; }
std::vector< ShortBitVector > puncturingMatrix
Definition: ConvolutionalCoder.h:78
const int** inet::physicallayer::ConvolutionalCoder::getStateTransitionTable ( ) const
inline
152 { return (const int **)stateTransitions; }
int ** stateTransitions
Definition: ConvolutionalCoder.h:83
const ShortBitVectorMatrix& inet::physicallayer::ConvolutionalCoder::getTransferFunctionMatrix ( ) const
inline
143 { return transferFunctionMatrix; }
ShortBitVectorMatrix transferFunctionMatrix
Definition: ConvolutionalCoder.h:77
ShortBitVector inet::physicallayer::ConvolutionalCoder::giveNextOutputSymbol ( const BitVector encodedBits,
int  decodedLength,
const BitVector isPunctured,
ShortBitVector excludedFromHammingDistance 
) const
protected

Referenced by decode().

273 {
274  if (isCompletelyDecoded(encodedBits.getSize(), decodedLength))
275  return ShortBitVector();
276  int pos = decodedLength / codeRateParamaterK;
277  ShortBitVector nextSymbol;
278  int idx = 0;
279  for (unsigned int i = pos * codeRateParamaterN; i < (pos + 1) * codeRateParamaterN; i++) {
280  if (isPunctured.getBit(i))
281  countsOnHammingDistance.setBit(idx, false);
282  nextSymbol.appendBit(encodedBits.getBit(i));
283  idx++;
284  }
285  return nextSymbol;
286 }
unsigned int codeRateParamaterN
Definition: ConvolutionalCoder.h:69
unsigned int codeRateParamaterK
Definition: ConvolutionalCoder.h:69
bool isCompletelyDecoded(unsigned int encodedLength, unsigned int decodedLength) const
Definition: ConvolutionalCoder.cc:288
void inet::physicallayer::ConvolutionalCoder::initParameters ( )
protected

Referenced by ConvolutionalCoder().

195 {
205 }
void computeHammingDistanceLookupTable()
Definition: ConvolutionalCoder.cc:179
void computeMemorySizeSum()
Definition: ConvolutionalCoder.cc:172
void memoryAllocations()
Definition: ConvolutionalCoder.cc:129
void computeDecimalToOutputSymbolVector()
Definition: ConvolutionalCoder.cc:369
void computeStateTransitions()
Definition: ConvolutionalCoder.cc:253
void computeMemorySizes()
Definition: ConvolutionalCoder.cc:155
void computeNumberOfInputAndOutputSymbols()
Definition: ConvolutionalCoder.cc:166
void computeNumberOfStates()
Definition: ConvolutionalCoder.cc:161
void computeOutputAndInputSymbols()
Definition: ConvolutionalCoder.cc:110
ShortBitVector inet::physicallayer::ConvolutionalCoder::inputSymbolToOutputSymbol ( const ShortBitVector state,
const ShortBitVector inputSymbol 
) const
protected

Referenced by computeOutputAndInputSymbols().

81 {
82  ShortBitVector outputSymbol;
83  outputSymbol.appendBit(false, codeRateParamaterN);
84  int shift = 0;
85  for (int i = inputSymbol.getSize() - 1; i >= 0; i--) {
86  ShortBitVector shiftRegisters;
87  shiftRegisters.appendBit(inputSymbol.getBit(i));
88  for (int k = shift; k < shift + memorySizes[i]; k++)
89  shiftRegisters.appendBit((unsigned int)k >= state.getSize() ? false : state.getBit(k));
90  const std::vector<ShortBitVector>& row = transferFunctionMatrix.at(i);
91  for (unsigned int j = 0; j < row.size(); j++) {
92  const ShortBitVector& generatorPolynomial = row.at(j);
93  outputSymbol.setBit(j, eXOR(outputSymbol.getBit(j), modulo2Adder(shiftRegisters, generatorPolynomial)));
94  }
95  shift += memorySizes[i];
96  }
97  return outputSymbol;
98 }
unsigned int codeRateParamaterN
Definition: ConvolutionalCoder.h:69
std::vector< int > memorySizes
Definition: ConvolutionalCoder.h:72
ShortBitVectorMatrix transferFunctionMatrix
Definition: ConvolutionalCoder.h:77
bool modulo2Adder(const ShortBitVector &shiftRegisters, const ShortBitVector &generatorPolynomial) const
Definition: ConvolutionalCoder.cc:100
const double k
Definition: QAM16Modulation.cc:24
bool eXOR(bool alpha, bool beta) const
Definition: ConvolutionalCoder.h:89
bool inet::physicallayer::ConvolutionalCoder::isCompletelyDecoded ( unsigned int  encodedLength,
unsigned int  decodedLength 
) const
protected

Referenced by giveNextOutputSymbol().

289 {
290  ASSERT(decodedLength % codeRateParamaterK == 0);
291  unsigned int pos = decodedLength / codeRateParamaterK;
292  return (pos + 1) * codeRateParamaterN > encodedLength;
293 }
unsigned int codeRateParamaterN
Definition: ConvolutionalCoder.h:69
unsigned int codeRateParamaterK
Definition: ConvolutionalCoder.h:69
void inet::physicallayer::ConvolutionalCoder::memoryAllocations ( )
protected

Referenced by initParameters().

130 {
131  decimalToOutputSymbol = new ShortBitVector[numberOfOutputSymbols];
132  outputSymbols = new ShortBitVector *[numberOfStates];
133  decimalToInputSymbol = new ShortBitVector[numberOfInputSymbols];
134  stateTransitions = new int *[numberOfStates];
135  inputSymbols = new int *[numberOfStates];
136  hammingDistanceLookupTable = new unsigned char **[numberOfOutputSymbols];
137  for (int i = 0; i < numberOfOutputSymbols; i++) {
138  hammingDistanceLookupTable[i] = new unsigned char *[numberOfOutputSymbols];
139  for (int j = 0; j < numberOfOutputSymbols; j++)
140  hammingDistanceLookupTable[i][j] = new unsigned char[numberOfOutputSymbols];
141  }
142  for (int i = 0; i < numberOfStates; i++) {
144  inputSymbols[i] = new int[numberOfOutputSymbols];
145  outputSymbols[i] = new ShortBitVector[numberOfInputSymbols];
146  for (int j = 0; j < numberOfInputSymbols; j++) {
147  stateTransitions[i][j] = -1;
148  outputSymbols[i][j] = ShortBitVector();
149  }
150  for (int j = 0; j < numberOfOutputSymbols; j++)
151  inputSymbols[i][j] = -1;
152  }
153 }
ShortBitVector * decimalToOutputSymbol
Definition: ConvolutionalCoder.h:82
int numberOfOutputSymbols
Definition: ConvolutionalCoder.h:76
int ** stateTransitions
Definition: ConvolutionalCoder.h:83
unsigned char *** hammingDistanceLookupTable
Definition: ConvolutionalCoder.h:84
int numberOfInputSymbols
Definition: ConvolutionalCoder.h:75
ShortBitVector ** outputSymbols
Definition: ConvolutionalCoder.h:80
ShortBitVector * decimalToInputSymbol
Definition: ConvolutionalCoder.h:81
int ** inputSymbols
Definition: ConvolutionalCoder.h:79
int numberOfStates
Definition: ConvolutionalCoder.h:74
bool inet::physicallayer::ConvolutionalCoder::modulo2Adder ( const ShortBitVector shiftRegisters,
const ShortBitVector generatorPolynomial 
) const
protected

Referenced by inputSymbolToOutputSymbol().

101 {
102  bool sum = false;
103  for (unsigned int i = 0; i < generatorPolynomial.getSize(); i++) {
104  if (generatorPolynomial.getBit(i))
105  sum = eXOR(sum, shiftRegisters.getBit(i));
106  }
107  return sum;
108 }
bool eXOR(bool alpha, bool beta) const
Definition: ConvolutionalCoder.h:89
ShortBitVector inet::physicallayer::ConvolutionalCoder::octalToBinary ( int  octalNum,
int  fixedSize 
) const
protected

Referenced by setTransferFunctionMatrix().

330 {
331  unsigned int powerOfEight = 1;
332  unsigned int decimal = 0;
333  while (octalNum > 0) {
334  unsigned int octalDigit = octalNum % 10;
335  octalNum /= 10;
336  decimal += octalDigit * powerOfEight;
337  powerOfEight *= 8;
338  }
339  return ShortBitVector(decimal, fixedSize);
340 }
int inet::physicallayer::ConvolutionalCoder::octalToDec ( int  octalNum) const
protected

Referenced by ConvolutionalCoder().

538 {
539  int powersOfEight = 1;
540  int decVal = 0;
541  while (octalNum != 0) {
542  int octDigit = octalNum % 10;
543  decVal += octDigit * powersOfEight;
544  octalNum /= 10;
545  powersOfEight *= 8;
546  }
547  return decVal;
548 }
void inet::physicallayer::ConvolutionalCoder::parseMatrix ( const char *  strMatrix,
std::vector< std::vector< int > > &  matrix 
) const
protected

Referenced by ConvolutionalCoder().

296 {
297  cStringTokenizer tokenizer(strMatrix, ";");
298  while (tokenizer.hasMoreTokens()) {
299  std::vector<int> row;
300  parseVector(tokenizer.nextToken(), row);
301  matrix.push_back(row);
302  }
303 }
void parseVector(const char *strVector, std::vector< int > &vector) const
Definition: ConvolutionalCoder.cc:305
void inet::physicallayer::ConvolutionalCoder::parseVector ( const char *  strVector,
std::vector< int > &  vector 
) const
protected

Referenced by ConvolutionalCoder(), and parseMatrix().

306 {
307  cStringTokenizer tokenizer(strVector);
308  while (tokenizer.hasMoreTokens())
309  vector.push_back(atoi(tokenizer.nextToken()));
310 }
void inet::physicallayer::ConvolutionalCoder::printOutputs ( ) const
protected
230 {
231  std::cout << "Outputs" << endl;
232  for (int i = 0; i != numberOfStates; i++) {
233  std::cout << outputSymbols[i][0].reverseToDecimal();
234  for (int j = 1; j != numberOfInputSymbols; j++)
235  std::cout << " " << outputSymbols[i][j].reverseToDecimal();
236  std::cout << endl;
237  }
238  std::cout << "End Outputs" << endl;
239 }
int numberOfInputSymbols
Definition: ConvolutionalCoder.h:75
unsigned int reverseToDecimal() const
Definition: ShortBitVector.h:50
ShortBitVector ** outputSymbols
Definition: ConvolutionalCoder.h:80
int numberOfStates
Definition: ConvolutionalCoder.h:74
void inet::physicallayer::ConvolutionalCoder::printStateTransitions ( ) const
protected
242 {
243  std::cout << "State transitions" << endl;
244  for (int i = 0; i != numberOfStates; i++) {
245  std::cout << stateTransitions[i][0];
246  for (int j = 1; j != numberOfInputSymbols; j++)
247  std::cout << " " << stateTransitions[i][j];
248  std::cout << endl;
249  }
250  std::cout << "End State transitions" << endl;
251 }
int ** stateTransitions
Definition: ConvolutionalCoder.h:83
int numberOfInputSymbols
Definition: ConvolutionalCoder.h:75
int numberOfStates
Definition: ConvolutionalCoder.h:74
std::ostream & inet::physicallayer::ConvolutionalCoder::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::ConvolutionalCoderModule::printToStream().

27 {
28  stream << "ConvolutionalCoder";
29  if (level <= PRINT_LEVEL_TRACE)
30  stream << ", convolutionalCode = " << printObjectToString(convolutionalCode, level + 1);
31  return stream;
32 }
std::string printObjectToString(const IPrintableObject *object, int level)
Definition: IPrintableObject.h:73
const ConvolutionalCode * convolutionalCode
Definition: ConvolutionalCoder.h:86
void inet::physicallayer::ConvolutionalCoder::printTransferFunctionMatrix ( ) const
protected
359 {
360  std::cout << "Transfer function matrix" << endl;
361  for (auto & elem : transferFunctionMatrix) {
362  std::cout << elem.at(0);
363  for (unsigned int j = 1; j < elem.size(); j++)
364  std::cout << "," << elem.at(j);
365  std::cout << endl;
366  }
367 }
ShortBitVectorMatrix transferFunctionMatrix
Definition: ConvolutionalCoder.h:77
BitVector inet::physicallayer::ConvolutionalCoder::puncturing ( const BitVector informationBits) const
protected

Referenced by encode().

52 {
53  BitVector puncturedInformationBits;
54  BitVector isPunctured = getPuncturedIndices(informationBits.getSize());
55  for (unsigned int i = 0; i < informationBits.getSize(); i++)
56  if (!isPunctured.getBit(i))
57  puncturedInformationBits.appendBit(informationBits.getBit(i));
58  return puncturedInformationBits;
59 }
void appendBit(bool value)
Definition: BitVector.cc:106
BitVector getPuncturedIndices(unsigned int length) const
Definition: ConvolutionalCoder.cc:34
void inet::physicallayer::ConvolutionalCoder::setTransferFunctionMatrix ( std::vector< std::vector< int > > &  transferFMatrix)
protected

Referenced by ConvolutionalCoder().

343 {
344  for (unsigned int i = 0; i < transferFMatrix.size(); i++) {
345  const std::vector<int>& row = transferFMatrix.at(i);
346  std::vector<ShortBitVector> bitRow;
347  for (auto& elem : row) {
348  ShortBitVector bin = octalToBinary(elem, constraintLengths.at(i));
349  ShortBitVector reverseBin;
350  for (int k = bin.getSize() - 1; k >= 0; k--)
351  reverseBin.appendBit(bin.getBit(k));
352  bitRow.push_back(reverseBin);
353  }
354  transferFunctionMatrix.push_back(bitRow);
355  }
356 }
std::vector< int > constraintLengths
Definition: ConvolutionalCoder.h:73
ShortBitVector octalToBinary(int octalNum, int fixedSize) const
Definition: ConvolutionalCoder.cc:329
void appendBit(bool value)
Definition: ShortBitVector.h:66
ShortBitVectorMatrix transferFunctionMatrix
Definition: ConvolutionalCoder.h:77
const double k
Definition: QAM16Modulation.cc:24
std::pair< BitVector, bool > inet::physicallayer::ConvolutionalCoder::traversePath ( const TrellisGraphNode bestNode,
TrellisGraphNode **  bestPaths,
bool  isTruncatedMode 
) const
protected

Referenced by decode().

419 {
420  if (!isTruncatedMode && bestNode.symbol == -1)
421  return std::pair<BitVector, bool>(BitVector(), false);
422  TrellisGraphNode path = bestNode;
423  BitVector reverseDecodedBits;
424  int depth = bestNode.depth;
425  while (depth--) {
426  const ShortBitVector& inputSymbol = decimalToInputSymbol[path.symbol];
427  for (int i = inputSymbol.getSize() - 1; i >= 0; i--)
428  reverseDecodedBits.appendBit(inputSymbol.getBit(i));
429  path = trellisGraph[path.prevState][depth];
430  }
431  BitVector decodedBits;
432  for (int i = reverseDecodedBits.getSize() - 1; i >= 0; i--)
433  decodedBits.appendBit(reverseDecodedBits.getBit(i));
434  return std::pair<BitVector, bool>(decodedBits, true);
435 }
std::vector< std::vector< TrellisGraphNode > > trellisGraph
Definition: ConvolutionalCoder.h:85
void appendBit(bool value)
Definition: ShortBitVector.h:66
ShortBitVector * decimalToInputSymbol
Definition: ConvolutionalCoder.h:81
void inet::physicallayer::ConvolutionalCoder::updateTrellisGraph ( TrellisGraphNode **  trellisGraph,
unsigned int  time,
const ShortBitVector outputSymbol,
const ShortBitVector excludedFromHammingDistance 
) const
protected

Referenced by decode().

378 {
379  int tieBreakingCounter = 0;
380  for (int prevState = 0; prevState != numberOfStates; prevState++) {
381  const TrellisGraphNode& node = trellisGraph[prevState][time];
382  for (int j = 0; j != numberOfOutputSymbols && node.state != -1; j++) {
383  int feasibleDecodedSymbol = inputSymbols[prevState][j];
384  if (feasibleDecodedSymbol != -1) {
385  const ShortBitVector& otherOutputSymbol = decimalToOutputSymbol[j];
386  int hammingDistance = computeHammingDistance(outputSymbol, excludedFromHammingDistance, otherOutputSymbol);
387  int newState = stateTransitions[prevState][feasibleDecodedSymbol];
388  int cumulativeHammingDistance = hammingDistance;
389  if (node.comulativeHammingDistance != INT32_MAX)
390  cumulativeHammingDistance += node.comulativeHammingDistance;
391  TrellisGraphNode& best = trellisGraph[newState][time + 1];
392  bool replace = false;
393  if (cumulativeHammingDistance == best.comulativeHammingDistance) {
394  tieBreakingCounter++;
395  if (RNGCONTEXT dblrand() < 1.0 / tieBreakingCounter)
396  replace = true;
397  }
398  else if (cumulativeHammingDistance < best.comulativeHammingDistance) {
399  tieBreakingCounter = 0;
400  replace = true;
401  }
402  if (replace) {
403  best.state = newState;
404  best.prevState = prevState;
405  best.depth = node.depth + 1;
406  best.comulativeHammingDistance = cumulativeHammingDistance;
407  if (hammingDistance > 0)
408  best.numberOfErrors = node.numberOfErrors + 1;
409  else
410  best.numberOfErrors = node.numberOfErrors;
411  best.symbol = feasibleDecodedSymbol;
412  }
413  }
414  }
415  }
416 }
ShortBitVector * decimalToOutputSymbol
Definition: ConvolutionalCoder.h:82
int numberOfOutputSymbols
Definition: ConvolutionalCoder.h:76
std::vector< std::vector< TrellisGraphNode > > trellisGraph
Definition: ConvolutionalCoder.h:85
int ** stateTransitions
Definition: ConvolutionalCoder.h:83
#define RNGCONTEXT
Definition: INETDefs.h:85
unsigned int computeHammingDistance(const ShortBitVector &u, const ShortBitVector &excludedBits, const ShortBitVector &w) const
Definition: ConvolutionalCoder.h:97
int ** inputSymbols
Definition: ConvolutionalCoder.h:79
#define INT32_MAX
Definition: lexer.cc:75
int numberOfStates
Definition: ConvolutionalCoder.h:74

Member Data Documentation

unsigned int inet::physicallayer::ConvolutionalCoder::codeRatePuncturingK
protected

Referenced by ConvolutionalCoder(), and depuncturing().

unsigned int inet::physicallayer::ConvolutionalCoder::codeRatePuncturingN
protected

Referenced by ConvolutionalCoder(), and depuncturing().

std::vector<int> inet::physicallayer::ConvolutionalCoder::constraintLengths
protected
const ConvolutionalCode* inet::physicallayer::ConvolutionalCoder::convolutionalCode
protected

Referenced by printToStream().

ShortBitVector* inet::physicallayer::ConvolutionalCoder::decimalToInputSymbol
protected
ShortBitVector* inet::physicallayer::ConvolutionalCoder::decimalToOutputSymbol
protected
unsigned char*** inet::physicallayer::ConvolutionalCoder::hammingDistanceLookupTable
protected
int** inet::physicallayer::ConvolutionalCoder::inputSymbols
protected
std::vector<int> inet::physicallayer::ConvolutionalCoder::memorySizes
protected
int inet::physicallayer::ConvolutionalCoder::memorySizeSum
protected
const char* inet::physicallayer::ConvolutionalCoder::mode
protected

Referenced by ConvolutionalCoder(), and decode().

int inet::physicallayer::ConvolutionalCoder::numberOfInputSymbols
protected
ShortBitVector** inet::physicallayer::ConvolutionalCoder::outputSymbols
protected
std::vector<ShortBitVector> inet::physicallayer::ConvolutionalCoder::puncturingMatrix
protected
int** inet::physicallayer::ConvolutionalCoder::stateTransitions
protected
ShortBitVectorMatrix inet::physicallayer::ConvolutionalCoder::transferFunctionMatrix
protected
std::vector<std::vector<TrellisGraphNode> > inet::physicallayer::ConvolutionalCoder::trellisGraph
protected

Referenced by decode().


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