itpp::Modulator_NRD Class Reference
Communications Module » Digital Modulation

Base class for N-dimensional vector (MIMO) channel modulators/demodulators with real-valued components. More...

`#include <itpp/comm/modulator_nd.h>`

Inheritance diagram for itpp::Modulator_NRD:

## Public Types

enum | Soft_Demod_Method { FULL_ENUM_LOGMAP , FULL_ENUM_MAXLOG , ZF_LOGMAP }
| Soft demodulation method. More...

## Public Member Functions

| Modulator_NRD ()
| Constructor.
virtual | ~Modulator_NRD ()
| Destructor.
Array< vec > | get_symbols () const
| Get modulation symbols per dimension.
void | modulate_bits (const bvec &bits, vec &symbols) const
| Modulate `bits` into `symbols`.
vec | modulate_bits (const bvec &bits) const
| Modulate `bits` vector. Symbols are returned.
void | init_soft_demodulator (const itpp::mat &H, const double &sigma2)
| Soft MAP demodulation for multidimensional channel, by "brute-force" enumeration of all constellation points. More...
void | demodulate_soft_bits (const vec &y, const QLLRvec &LLR_apriori, QLLRvec &LLR_aposteriori, Soft_Demod_Method method=FULL_ENUM_LOGMAP)
| Soft MAP demodulation for multidimensional channel, by "brute-force" enumeration of all constellation points. More...
void | demodulate_soft_bits (const vec &y, const mat &H, double sigma2, const QLLRvec &LLR_apriori, QLLRvec &LLR_aposteriori, Soft_Demod_Method method=FULL_ENUM_LOGMAP)
| Soft demodulation wrapper function for various methods. More...
QLLRvec | demodulate_soft_bits (const vec &y, const mat &H, double sigma2, const QLLRvec &LLR_apriori, Soft_Demod_Method method=FULL_ENUM_LOGMAP)
| Soft demodulation wrapper function for various methods. More...
void | demodulate_soft_bits (const vec &y, const vec &h, double sigma2, const QLLRvec &LLR_apriori, QLLRvec &LLR_aposteriori)
| Soft MAP demodulation for parallelchannels without crosstalk. More...
void | set_llrcalc (LLR_calc_unit llrcalc_in)
| Set LLR calculation unit.
LLR_calc_unit | get_llrcalc () const
| Get LLR calculation unit.
int | get_dim () const
| Get number of dimensions.
ivec | get_k () const
| Get number of bits per modulation symbol per dimension.
ivec | bits_per_symbol () const
| Get number of bits per modulation symbol per dimension.
ivec | get_M () const
| Get number of modulation symbols per dimension.
Array< ivec > | get_bits2symbols () const
| Get bit pattern in decimal.
Array< bmat > | get_bitmap () const
| Get Bit mapping table.

## Protected Member Functions

void | update_norm (double &norm, int k, int sold, int snew, const vec &ytH, const mat &HtH, const ivec &s)
| Update residual norm (for internal use). More...
void | hxnormupdate (itpp::vec &Hx, unsigned &bitstring, unsigned &ind, unsigned bit)
| Calculation of the part of the norms that depends on H.
void | yxnormupdate (double &yx, itpp::QLLR &lapr, unsigned &bitstring, unsigned &ind, unsigned bit)
| Calculation of the remaining part of the norms that depends both on H and y.
QLLRvec | probabilities (QLLR l)
| Convert LLR to log-probabilities.
Array< QLLRvec > | probabilities (const QLLRvec &l)
| Convert LLR to log-probabilities, vector version.
void | marginalize_bits (itpp::QLLRvec &llr, Soft_Demod_Method method) const
| Marginalize (sum) over the bits.
void | demodllrbit0 (itpp::QLLR &llr) const
| Hardcoded implementation of 1:st bit demodulation.
void | demodllrbit1 (itpp::QLLR &llr) const
| Hardcoded implementation of 2:nd bit demodulation.
void | demodllrbit2 (itpp::QLLR &llr) const
| Hardcoded implementation of 3:rd bit demodulation.
void | demodmaxbit0 (itpp::QLLR &maxllr) const
| Hardcoded implementation of 1:st bit demodulation.
void | demodmaxbit1 (itpp::QLLR &maxllr) const
| Hardcoded implementation of 2:nd bit demodulation.
void | demodmaxbit2 (itpp::QLLR &maxllr) const
| Hardcoded implementation of 3:rd bit demodulation.
void | update_LLR (const Array< QLLRvec > &logP_apriori, const ivec &s, QLLR scaled_norm, QLLRvec &num, QLLRvec &denom)
| Update LLR (for internal use) More...
void | update_LLR (const Array< QLLRvec > &logP_apriori, int s, QLLR scaled_norm, int j, QLLRvec &num, QLLRvec &denom)
| Update LLR, for scalar channel (for internal use) More...

## Protected Attributes

Array< vec > | symbols
| Vectors of modulation symbols (along each dimension)
itpp::mat | H
| Real channel matrix.
itpp::Array< itpp::Array< itpp::vec > > | hspacings
| The spacing between different constellation points multiplied by the different H columns.
itpp::Array< itpp::vec > | yspacings
| The spacing between different constellation points scaled by different y elements.
int | nt
| Number of dimensions.
int | nb
| Number of bits in the symbol vector.
LLR_calc_unit | llrcalc
| LLR calculation unit.
ivec | k
| Number of bits per modulation symbol.
ivec | M
| Number of modulation symbols along each dimension.
bool | demod_initialized
| Flag indicating whether the demodulator has been initialized.
Array< bmat > | bitmap
| Bit mapping table (one table per dimension)
Array< ivec > | bits2symbols
| Bit pattern in decimal form ordered and the corresponding symbols (one pattern per dimension)
double | gaussnorm
| The normalization factor in the exponent (in front of the square norm) in the Gaussian distribution.
itpp::vec | hnorms
| Norms part dependent on H.
itpp::QLLRvec | Qnorms
| Norms part depending on both H and y.
itpp::QLLRvec | llrapr
| A prioi information.
itpp::ivec | bpos2cpos
| The bit to column mapping.
itpp::ivec | bitcumsum
| The cumulative sum of bits in the symbol vector.
itpp::Array< itpp::Vec< unsigned > > | gray2dec
| The Gray to decimal mapping.

## Friends

ITPP_EXPORT std::ostream & | operator<< (std::ostream &os, const Modulator_NRD &m)
| Output some properties of the MIMO modulator (mainly to aid debugging)

## Related Functions

(Note that these are not member functions.)
ITPP_EXPORT std::ostream & | operator<< (std::ostream &os, const Modulator_NRD &m)
| Print some properties of the MIMO modulator (mainly to aid debugging)

## Detailed Description

Base class for N-dimensional vector (MIMO) channel modulators/demodulators with real-valued components.

This class can be used to perform modulation and demodulation for a matrix (MIMO) channel of the form

, where H is the channel matrix of dimension , is a received vector of length , is a transmitted vector of length and is a noise vector.

The class supports soft-input soft-output demodulation. It can also be used for scalar modulation to take advantage of this feature.

Complex MIMO channels can be handled by using the `Modulator_NCD` class. Alternatively, if the signal constellation is separable in I/Q then the complex channel can be first transformed to a real channel

See `ND_UPAM` for examples.

Note
  For issues relating to the accuracy of LLR computations, please see the documentation of `LLR_calc_unit`

Definition at line 248 of file modulator_nd.h.

## Member Enumeration Documentation

## Soft_Demod_Method

enum itpp::Modulator_ND::Soft_Demod_Method

inherited

Soft demodulation method.

Enumerator
FULL_ENUM_LOGMAP | Log-MAP demodulation by "brute-force" enumeration of all points.
FULL_ENUM_MAXLOG | Max-Log demodulation by "brute-force" enumeration of all points.
ZF_LOGMAP | Zero-Forcing Log-MAP approximated demodulation.

Definition at line 67 of file modulator_nd.h.

## Member Function Documentation

## init_soft_demodulator()

void itpp::Modulator_NRD::init_soft_demodulator | ( | const itpp::mat & | H,
|  | const double & | sigma2
| ) |  |

Soft MAP demodulation for multidimensional channel, by "brute-force" enumeration of all constellation points.

This function precomputes the norms

used to compute the LLR values

without approximations. It is assumed that H is real-valued. Complex-valued channels can be handled using the `Modulator_NCD` class.

Definition at line 486 of file modulator_nd.cpp.

References itpp::Modulator_ND::bitcumsum, itpp::Modulator_ND::bits2symbols, itpp::Modulator_ND::bpos2cpos, itpp::cumsum(), itpp::Modulator_ND::demod_initialized, itpp::Modulator_ND::gaussnorm, itpp::Modulator_ND::gray2dec, itpp::Modulator_ND::hnorms, it_assert, itpp::Modulator_ND::k, itpp::Modulator_ND::M, itpp::Modulator_ND::nb, itpp::Modulator_ND::nt, itpp::pow2i(), itpp::prod(), itpp::Modulator_ND::Qnorms, itpp::reverse(), itpp::Array< T >::set_size(), and itpp::sum().

## demodulate_soft_bits() [1/4]

void itpp::Modulator_NRD::demodulate_soft_bits | ( | const vec & | y,
|  | const QLLRvec & | LLR_apriori,
|  | QLLRvec & | LLR_aposteriori,
|  | Soft_Demod_Method | method = `FULL_ENUM_LOGMAP`
| ) |  |

Soft MAP demodulation for multidimensional channel, by "brute-force" enumeration of all constellation points.

This function computes the LLR values

without approximations. It is assumed that H, y and s are real-valued. Complex-valued channels can be handled using the `Modulator_NCD` class. Currently the following two demodulation methods are supported:

- FULL_ENUM_LOGMAP - exact demodulation, which use "brute-force" enumeration of all constellation points
- FULL_ENUM_MAXLOG - max-log approximate demodulation, which use "brute-force" enumeration to find the constellation points that give the smallest euclidian distances

Parameters

  [in] | y | Received vector (typically )
  [in] | LLR_apriori | Vector of a priori LLR values per bit
  [out] | LLR_aposteriori | Vector of a posteriori LLR values
  [in] | method | Soft demodulation method

The function performs an exhaustive search over all possible points `s` in the n-dimensional constellation. This is only feasible for relatively small constellations. The Jacobian logarithm is used to compute the sum-exp expression.

## demodulate_soft_bits() [2/4]

void itpp::Modulator_NRD::demodulate_soft_bits | ( | const vec & | y,
|  | const mat & | H,
|  | double | sigma2,
|  | const QLLRvec & | LLR_apriori,
|  | QLLRvec & | LLR_aposteriori,
|  | Soft_Demod_Method | method = `FULL_ENUM_LOGMAP`
| ) |  |

Soft demodulation wrapper function for various methods.

Currently the following three demodulation methods are supported:

- FULL_ENUM_LOGMAP - exact demodulation, which use "brute-force" enumeration of all constellation points
- FULL_ENUM_MAXLOG - max-log approximate demodulation, which use "brute-force" enumeration to find the constellation points that give the smallest euclidian distances
- ZF_LOGMAP - approximated methods with Zero-Forcing preprocessing, which sometimes tends to perform poorly, especially for poorly conditioned H

Parameters

  [in] | y | Received vector
  [in] | H | Channel matrix
  [in] | sigma2 | Noise variance per real dimension (typically )
  [in] | LLR_apriori | Vector of a priori LLR values per bit
  [out] | LLR_aposteriori | Vector of a posteriori LLR values
  [in] | method | Soft demodulation method

Definition at line 560 of file modulator_nd.cpp.

References itpp::inv(), it_assert, itpp::Modulator_ND::k, itpp::ones(), itpp::sqrt(), itpp::sum(), itpp::zeros_i(), and itpp::Modulator_ND::ZF_LOGMAP.

## demodulate_soft_bits() [3/4]

QLLRvec itpp::Modulator_NRD::demodulate_soft_bits | ( | const vec & | y,
|  | const mat & | H,
|  | double | sigma2,
|  | const QLLRvec & | LLR_apriori,
|  | Soft_Demod_Method | method = `FULL_ENUM_LOGMAP`
| ) |  |

Soft demodulation wrapper function for various methods.

Currently the following two demodulation methods are supported:

- FULL_ENUM_LOGMAP - exact demodulation, which use "brute-force" enumeration of all constellation points
- ZF_LOGMAP - approximated methods with Zero-Forcing preprocessing, which sometimes tends to perform poorly, especially for poorly conditioned H

Parameters

  [in] | y | Received vector
  [in] | H | Channel matrix
  [in] | sigma2 | Noise variance per real dimension (typically )
  [in] | LLR_apriori | Vector of a priori LLR values per bit
  [in] | method | Soft demodulation method

Returns
  Vector of a posteriori LLR values

Definition at line 591 of file modulator_nd.cpp.

## demodulate_soft_bits() [4/4]

void itpp::Modulator_NRD::demodulate_soft_bits | ( | const vec & | y,
|  | const vec & | h,
|  | double | sigma2,
|  | const QLLRvec & | LLR_apriori,
|  | QLLRvec & | LLR_aposteriori
| ) |  |

Soft MAP demodulation for parallelchannels without crosstalk.

This function is a much faster equivalent to `demodulate_soft_bits` with . Its complexity is linear in the number of subchannels.

Definition at line 601 of file modulator_nd.cpp.

References it_assert, itpp::Modulator_ND::k, itpp::length(), itpp::Modulator_ND::llrcalc, itpp::Modulator_ND::M, itpp::Modulator_ND::nt, itpp::ones_i(), itpp::Modulator_ND::probabilities(), itpp::sqr(), itpp::sum(), itpp::LLR_calc_unit::to_qllr(), and itpp::Modulator_ND::update_LLR().

## update_norm()

void itpp::Modulator_NRD::update_norm | ( | double & | norm,
|  | int | k,
|  | int | sold,
|  | int | snew,
|  | const vec & | ytH,
|  | const mat & | HtH,
|  | const ivec & | s
| ) |  |

protected

Update residual norm (for internal use).

Update the residual norm when moving from one constellation point to an adjacent point.

Parameters

  [in,out] | norm | Norm to be updated
  [in] | k | Position where s changed
  [in] | sold | Old value of s[k]
  [in] | snew | New value of s[k]
  [in] | ytH | y'H vector
  [in] | HtH | Grammian matrix H'H
  [in] | s | Symbol vector

## update_LLR() [1/2]

void itpp::Modulator_ND::update_LLR | ( | const Array< QLLRvec > & | logP_apriori,
|  | const ivec & | s,
|  | QLLR | scaled_norm,
|  | QLLRvec & | num,
|  | QLLRvec & | denom
| ) |  |

protected inherited

Update LLR (for internal use)

This function updates the numerator and denominator in the expression

Parameters

  [in] | logP_apriori | Vector of a priori probabilities per bit
  [in] | s | Symbol vector
  [in] | scaled_norm | Argument of the exponents in the above equation
  [out] | num | Logarithm of the numerator in the above expression
  [out] | denom | Logarithm of the denominator in the above expression

Definition at line 94 of file modulator_nd.cpp.

References itpp::Modulator_ND::bitmap, itpp::LLR_calc_unit::jaclog(), itpp::Modulator_ND::k, itpp::Modulator_ND::llrcalc, and itpp::Modulator_ND::nt.

Referenced by itpp::Modulator_NCD::demodulate_soft_bits(), and demodulate_soft_bits().

## update_LLR() [2/2]

void itpp::Modulator_ND::update_LLR | ( | const Array< QLLRvec > & | logP_apriori,
|  | int | s,
|  | QLLR | scaled_norm,
|  | int | j,
|  | QLLRvec & | num,
|  | QLLRvec & | denom
| ) |  |

protected inherited

Update LLR, for scalar channel (for internal use)

This function updates the numerator and denominator in the expression

Parameters

  [in] | logP_apriori | Vector of a priori probabilities per bit
  [in] | s | Symbol
  [in] | scaled_norm | Argument of the exponents in the above equation
  [in] | j | Channel index (dimension)
  [out] | num | Logarithm of the numerator in the above expression
  [out] | denom | Logarithm of the denominator in the above expression

Definition at line 68 of file modulator_nd.cpp.

References itpp::Modulator_ND::bitmap, itpp::LLR_calc_unit::jaclog(), itpp::Modulator_ND::k, and itpp::Modulator_ND::llrcalc.

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

- itpp/comm/modulator_nd.h
- itpp/comm/modulator_nd.cpp

Generated on Tue Aug 17 2021 10:59:15 for IT++ by Doxygen 1.9.1