IT++ Logo

itpp::Modulator_NRD Class Reference
[Digital Modulation]

#include <itpp/comm/modulator_nd.h>

Inheritance diagram for itpp::Modulator_NRD:

itpp::Modulator_ND itpp::ND_UPAM

List of all members.


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

\[ y = Hx+e \]

, where H is the channel matrix of dimension $n_r\times n_t$, $y$ is a received vector of length $n_r$, $x$ is a transmitted vector of length $n_t$ and $e$ 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

\[ G = \left[ \begin{array}{cc} H_r & -H_i \\ H_i & H_r \end{array} \right] \]

See ND_UPAM for examples.

Definition at line 182 of file modulator_nd.h.


Public Types

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

Public Member Functions

 Modulator_NRD ()
 Constructor.
 ~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 demodulate_soft_bits (const vec &y, const mat &H, double sigma2, const QLLRvec &LLR_apriori, QLLRvec &LLR_aposteriori, Soft_Demod_Method method)
 Soft demodulation wrapper function for various methods.
QLLRvec demodulate_soft_bits (const vec &y, const mat &H, double sigma2, const QLLRvec &LLR_apriori, Soft_Demod_Method method)
 Soft demodulation wrapper function for various methods.
void demodulate_soft_bits (const vec &y, const mat &H, double sigma2, const QLLRvec &LLR_apriori, QLLRvec &LLR_aposteriori)
 Soft MAP demodulation for multidimensional channel, by "brute-force" enumeration of all constellation points.
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.
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 get_M () const
 Get number of modulation symbols per dimension.

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).
QLLRvec probabilities (QLLR l)
 Convert LLR to log-probabilities.
Array< QLLRvec > probabilities (const QLLRvec &l)
 Convert LLR to log-probabilities, vector version.
void update_LLR (const Array< QLLRvec > &logP_apriori, const ivec &s, QLLR scaled_norm, QLLRvec &num, QLLRvec &denom)
 Update LLR (for internal use).
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).

Protected Attributes

Array< vec > symbols
 Vectors of modulation symbols (along each dimension).
int nt
 Number of dimensions.
LLR_calc_unit llrcalc
 LLR calculation unit.
ivec k
 Number of bits per modulation symbol.
ivec M
 Number of modulation symbols along each dimension.
Array< bmatbitmap
 Bit mapping table (one table per dimension).
Array< ivec > bits2symbols
 Bit pattern in decimal form ordered and the corresponding symbols (one pattern per dimension).

Friends

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

Member Enumeration Documentation

Soft demodulation method.

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

Definition at line 61 of file modulator_nd.h.


Member Function Documentation

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 
)

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 $N_0/2$)
[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 147 of file modulator_nd.cpp.

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

Referenced by demodulate_soft_bits().

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

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 $N_0/2$)
[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 181 of file modulator_nd.cpp.

References demodulate_soft_bits().

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

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

This function computes the LLR values

\[ LLR(k) = \log \left( \frac {\sum_{s:b_k=0} \exp \left( -\frac{|y - Hs|^2}{2\sigma^2} \right) P(s)} {\sum_{s:b_k=1} \exp \left( -\frac{|y - Hs|^2}{2\sigma^2} \right) P(s)} \right) \]

without approximations. It is assumed that H, y and s are real-valued. Complex-valued channels can be handled using the Modulator_NCD class.

Parameters:
[in] y Received vector
[in] H Channel matrix
[in] sigma2 Noise variance per real dimension (typically $N_0/2$)
[in] LLR_apriori Vector of a priori LLR values per bit
[out] LLR_aposteriori Vector of a posteriori LLR values
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.

Definition at line 222 of file modulator_nd.cpp.

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

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 $H = \mbox{diag}(h)$. Its complexity is linear in the number of subchannels.

Definition at line 191 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(), symbols, itpp::LLR_calc_unit::to_qllr(), and itpp::Modulator_ND::update_LLR().

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 $|y-Hs|$ 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

Definition at line 309 of file modulator_nd.cpp.

References itpp::length(), itpp::sqr(), and symbols.

Referenced by demodulate_soft_bits().

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

\[ \log \left( \frac {\sum_{s:b_k=0} \exp(-x^2) P(s)} {\sum_{s:b_k=1} \exp(-x^2) P(s)} \right) \]

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 91 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().

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

\[ \log \left( \frac {\sum_{s:b_k=0} \exp (-x^2) P(s)} {\sum_{s:b_k=1} \exp (-x^2) P(s)} \right) \]

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 66 of file modulator_nd.cpp.

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


Friends And Related Function Documentation

std::ostream & operator<< ( std::ostream &  os,
const Modulator_NRD m 
) [friend]

Output some properties of the MIMO modulator (mainly to aid debugging).

Print some properties of the MIMO modulator (mainly to aid debugging).

Definition at line 326 of file modulator_nd.cpp.


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

Generated on Sat May 3 16:10:49 2008 for IT++ by Doxygen 1.5.5