Base class for N-dimensional vector (MIMO) channel modulators/demodulators with real-valued components. More...
#include <itpp/comm/modulator_nd.h>
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. | |
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. | |
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. | |
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. | |
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 | 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). | |
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) | |
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) | |
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) | |
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.
LLR_calc_unit
Definition at line 248 of file modulator_nd.h.
|
inherited |
Soft demodulation method.
Definition at line 67 of file modulator_nd.h.
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().
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:
[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.
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:
[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.
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:
[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 |
Definition at line 591 of file modulator_nd.cpp.
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().
|
protected |
Update residual norm (for internal use).
Update the residual norm when moving from one constellation point to an adjacent point.
[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 |
|
protectedinherited |
Update LLR (for internal use)
This function updates the numerator and denominator in the expression
[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 demodulate_soft_bits(), and itpp::Modulator_NCD::demodulate_soft_bits().
|
protectedinherited |
Update LLR, for scalar channel (for internal use)
This function updates the numerator and denominator in the expression
[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.
Generated on Sat Jul 6 2013 10:54:33 for IT++ by Doxygen 1.8.2