IT++ Logo
Public Member Functions | Protected Member Functions | Protected Attributes | Related Symbols | List of all members
itpp::QPSK Class Reference

QPSK modulator. More...

#include <itpp/comm/modulator.h>

Inheritance diagram for itpp::QPSK:
itpp::PSK itpp::Modulator< std::complex< double > >

Public Member Functions

 QPSK ()
 Class Constructor.
 
virtual ~QPSK ()
 Destructor.
 
virtual void demodulate_soft_bits (const cvec &rx_symbols, double N0, vec &soft_bits, Soft_Method method=LOGMAP) const
 Soft demodulator for AWGN channel.
 
vec demodulate_soft_bits (const cvec &rx_symbols, double N0, Soft_Method method=LOGMAP) const
 Soft demodulator for AWGN channel.
 
virtual void demodulate_soft_bits (const cvec &rx_symbols, const cvec &channel, double N0, vec &soft_bits, Soft_Method method=LOGMAP) const
 Soft demodulator for a known channel in AWGN.
 
vec demodulate_soft_bits (const cvec &rx_symbols, const cvec &channel, double N0, Soft_Method method=LOGMAP) const
 Soft demodulator for a known channel in AWGN.
 
void set_M (int M)
 Change the size of the signal constellation.
 
void demodulate_bits (const cvec &signal, bvec &bits) const
 Hard demodulation of bits.
 
bvec demodulate_bits (const cvec &signal) const
 Hard demodulation of bits.
 
virtual void demodulate_bits (const Vec< std::complex< double > > &signal, bvec &bits) const
 Hard demodulation of bits.
 
virtual bvec demodulate_bits (const Vec< std::complex< double > > &signal) const
 Hard demodulation of bits.
 
virtual void set (const Vec< std::complex< double > > &symbols, const ivec &bits2symbols)
 Set the constellation to use in the modulator.
 
virtual int bits_per_symbol () const
 Returns number of bits per symbol.
 
virtual int get_k () const
 Returns number of bits per symbol.
 
virtual int get_M () const
 Returns number of modulation symbols.
 
virtual Vec< std::complex< double > > get_symbols () const
 Get the symbol values used in the modulator.
 
virtual ivec get_bits2symbols () const
 Get the bitmap, which maps input bits into symbols.
 
virtual void modulate (const ivec &symbolnumbers, Vec< std::complex< double > > &output) const
 Modulation of symbols.
 
virtual Vec< std::complex< double > > modulate (const ivec &symbolnumbers) const
 Modulation of symbols.
 
virtual void demodulate (const Vec< std::complex< double > > &signal, ivec &output) const
 Demodulation of symbols.
 
virtual ivec demodulate (const Vec< std::complex< double > > &signal) const
 Demodulation of symbols.
 
virtual void modulate_bits (const bvec &bits, Vec< std::complex< double > > &output) const
 Modulation of bits.
 
virtual Vec< std::complex< double > > modulate_bits (const bvec &bits) const
 Modulation of bits.
 
virtual void demodulate_soft_bits (const Vec< std::complex< double > > &rx_symbols, double N0, vec &soft_bits, Soft_Method method=LOGMAP) const
 Soft demodulator for AWGN channels.
 
virtual vec demodulate_soft_bits (const Vec< std::complex< double > > &rx_symbols, double N0, Soft_Method method=LOGMAP) const
 Soft demodulator for AWGN channels.
 
virtual void demodulate_soft_bits (const Vec< std::complex< double > > &rx_symbols, const Vec< std::complex< double > > &channel, double N0, vec &soft_bits, Soft_Method method=LOGMAP) const
 Soft demodulator for fading channels.
 
virtual vec demodulate_soft_bits (const Vec< std::complex< double > > &rx_symbols, const Vec< std::complex< double > > &channel, double N0, Soft_Method method=LOGMAP) const
 Soft demodulator for fading channels.
 

Protected Member Functions

void calculate_softbit_matrices ()
 This function calculates the soft bit mapping matrices S0 and S1.
 

Protected Attributes

bool setup_done
 Setup indicator.
 
int k
 Number of bits per modulation symbol.
 
int M
 Number of modulation symbols.
 
bmat bitmap
 Bit to symbol mapping table (size: M x k)
 
ivec bits2symbols
 Bit to symbol mapping in decimal form (size: M)
 
Vec< std::complex< double > > symbols
 Corresponding modulation symbols (size: M)
 
imat S0
 Matrix where row k contains the constellation points with '0' in bit position k.
 
imat S1
 Matrix where row k contains the constellation points with '1' in bit position k.
 

Related Symbols

(Note that these are not member symbols.)

typedef Modulator< doubleModulator_1D
 Definition of 1D Modulator (with real symbols)
 
typedef Modulator< std::complex< double > > Modulator_2D
 Definition of 2D Modulator (with complex symbols)
 

Detailed Description

QPSK modulator.

This is a special version of the PSK modulator with $M = 4$ constellation points. Symbol numbering is counter clockwise starting from the real axis. Bits are Gray coded onto symbols. Symbol energy is normalized to 1.

Beside hard demapping, this class can also perform soft demodulation, calculating the log-MAP estimate of the individual bits. To use it properly the received symbols should be equal to:

\[r_k = c_k s_k +
n_k,\]

where $c_k$ is the real or complex channel gain, $s_k$ is the transmitted constellation symbol, and $n_k$ is the AWGN of the channel (with variance $N_0$).

It is also assumed that the channel estimates are perfect when calculating the soft bits.

Definition at line 677 of file modulator.h.

Constructor & Destructor Documentation

◆ QPSK()

itpp::QPSK::QPSK ( )
inline

Class Constructor.

Definition at line 681 of file modulator.h.

◆ ~QPSK()

virtual itpp::QPSK::~QPSK ( )
inlinevirtual

Destructor.

Definition at line 683 of file modulator.h.

Member Function Documentation

◆ demodulate_soft_bits() [1/8]

void itpp::QPSK::demodulate_soft_bits ( const cvec &  rx_symbols,
double  N0,
vec &  soft_bits,
Soft_Method  method = LOGMAP 
) const
virtual

Soft demodulator for AWGN channel.

This function calculates the log-MAP estimate assuming equally likely bits transmitted:

\[\log \left( \frac{P(b=0|r)}{P(b=1|r)} \right) =
\frac{2 \sqrt{2}}{N_0} \Im\{r_k \exp \left(j \frac{\Pi}{4} \right)
\}\]

and

\[\log \left( \frac{P(b=0|r)}{P(b=1|r)} \right) = \frac{2
\sqrt{2}}{N_0} \Re\{r_k \exp \left(j \frac{\Pi}{4} \right) \}\]

depending on the bit positon in the QPSK symbol.

Parameters
rx_symbolsThe received noisy constellation symbols, $r$
N0The spectral density of the AWGN noise, $n$
soft_bitsThe soft bits calculated using the expression above
methodThe method used for demodulation (LOGMAP or APPROX)
Note
For soft demodulation it is suggested to use the N-dimensional modulator (Modulator_ND) instead, which is based on the QLLR (quantized) arithmetic and therefore is faster. Please note, however, that mixed use of Modulator_1D/Modulator_2D and Modulator_ND is not advised.

Definition at line 179 of file modulator.cpp.

References itpp::Modulator< std::complex< double > >::k, itpp::pi, itpp::Array< T >::set_size(), and itpp::Array< T >::size().

Referenced by demodulate_soft_bits(), and demodulate_soft_bits().

◆ demodulate_soft_bits() [2/8]

vec itpp::QPSK::demodulate_soft_bits ( const cvec &  rx_symbols,
double  N0,
Soft_Method  method = LOGMAP 
) const

Soft demodulator for AWGN channel.

Definition at line 194 of file modulator.cpp.

References demodulate_soft_bits().

◆ demodulate_soft_bits() [3/8]

void itpp::QPSK::demodulate_soft_bits ( const cvec &  rx_symbols,
const cvec &  channel,
double  N0,
vec &  soft_bits,
Soft_Method  method = LOGMAP 
) const
virtual

Soft demodulator for a known channel in AWGN.

This function calculates the log-MAP estimate assuming equally likely bits transmitted:

\[\log \left( \frac{P(b=0|r)}{P(b=1|r)} \right) =
\frac{2 \sqrt{2}}{N_0} \Im\{r_k c_k \exp \left(j \frac{\Pi}{4} \right)
\}\]

and

\[\log \left( \frac{P(b=0|r)}{P(b=1|r)} \right) = \frac{2
\sqrt{2}}{N_0} \Re\{r_k c_k \exp \left(j \frac{\Pi}{4} \right) \}\]

depending on the bit positon in the QPSK symbol.

Parameters
rx_symbolsThe received noisy constellation symbols, $r$
channelThe channel coefficients, $c$
N0The spectral density of the AWGN noise, $n$
soft_bitsThe soft bits calculated using the expression above
methodThe method used for demodulation (LOGMAP or APPROX)
Note
For soft demodulation it is suggested to use the N-dimensional modulator (Modulator_ND) instead, which is based on the QLLR (quantized) arithmetic and therefore is faster. Please note, however, that mixed use of Modulator_1D/Modulator_2D and Modulator_ND is not advised.

Definition at line 203 of file modulator.cpp.

References itpp::pi, itpp::Array< T >::set_size(), and itpp::Array< T >::size().

◆ demodulate_soft_bits() [4/8]

vec itpp::QPSK::demodulate_soft_bits ( const cvec &  rx_symbols,
const cvec &  channel,
double  N0,
Soft_Method  method = LOGMAP 
) const

Soft demodulator for a known channel in AWGN.

Definition at line 219 of file modulator.cpp.

References demodulate_soft_bits().

◆ set_M()

void itpp::PSK::set_M ( int  M)
inherited

◆ demodulate_bits() [1/4]

void itpp::PSK::demodulate_bits ( const cvec &  signal,
bvec &  bits 
) const
inherited

◆ demodulate_bits() [2/4]

bvec itpp::PSK::demodulate_bits ( const cvec &  signal) const
inherited

Hard demodulation of bits.

Definition at line 167 of file modulator.cpp.

References itpp::PSK::demodulate_bits().

◆ demodulate_bits() [3/4]

void itpp::Modulator< std::complex< double > >::demodulate_bits ( const Vec< std::complex< double > > &  signal,
bvec &  bits 
) const
virtualinherited

Hard demodulation of bits.

Definition at line 135 of file modulator.h.

◆ demodulate_bits() [4/4]

bvec itpp::Modulator< std::complex< double > >::demodulate_bits ( const Vec< std::complex< double > > &  signal) const
virtualinherited

Hard demodulation of bits.

Definition at line 137 of file modulator.h.

◆ set()

void itpp::Modulator< std::complex< double > >::set ( const Vec< std::complex< double > > &  symbols,
const ivec &  bits2symbols 
)
virtualinherited

Set the constellation to use in the modulator.

Definition at line 86 of file modulator.h.

◆ bits_per_symbol()

virtual int itpp::Modulator< std::complex< double > >::bits_per_symbol ( ) const
inlinevirtualinherited

Returns number of bits per symbol.

Definition at line 89 of file modulator.h.

◆ get_k()

virtual int itpp::Modulator< std::complex< double > >::get_k ( ) const
inlinevirtualinherited

Returns number of bits per symbol.

Definition at line 92 of file modulator.h.

◆ get_M()

virtual int itpp::Modulator< std::complex< double > >::get_M ( ) const
inlinevirtualinherited

Returns number of modulation symbols.

Definition at line 95 of file modulator.h.

◆ get_symbols()

virtual Vec< std::complex< double > > itpp::Modulator< std::complex< double > >::get_symbols ( ) const
inlinevirtualinherited

Get the symbol values used in the modulator.

Definition at line 98 of file modulator.h.

◆ get_bits2symbols()

virtual ivec itpp::Modulator< std::complex< double > >::get_bits2symbols ( ) const
inlinevirtualinherited

Get the bitmap, which maps input bits into symbols.

The mapping is done as follows. An input bit sequence in decimal notation is used for indexing the bits2symbols table. The indexing result denotes the symbol to be used from the symbols table, e.g.:

PSK mod(8); // assume 8-PSK modulator
cvec sym = mod.get_symbols();
ivec bits2sym = mod.get_bits2symbols();
bvec in_bits = "100" // input bits
int d = bin2dec(in_bits); // decimal representation of in_bits = 4
// mapping of d into PSK symbol using bits2sym and sym tables
std::complex<double> out_symbol = sym(bits2sym(d));
General array class.
Definition array.h:105
M-ary PSK modulator.
Definition modulator.h:636
int mod(int k, int n)
Calculates the modulus, i.e. the signed reminder after division.
Definition elem_math.h:166
ITPP_EXPORT int bin2dec(const bvec &inbvec, bool msb_first=true)
Convert a bvec to decimal int with the first bit as MSB if msb_first == true.

Definition at line 117 of file modulator.h.

◆ modulate() [1/2]

void itpp::Modulator< std::complex< double > >::modulate ( const ivec &  symbolnumbers,
Vec< std::complex< double > > &  output 
) const
virtualinherited

Modulation of symbols.

Definition at line 120 of file modulator.h.

◆ modulate() [2/2]

Vec< std::complex< double > > itpp::Modulator< std::complex< double > >::modulate ( const ivec &  symbolnumbers) const
virtualinherited

Modulation of symbols.

Definition at line 122 of file modulator.h.

◆ demodulate() [1/2]

void itpp::Modulator< std::complex< double > >::demodulate ( const Vec< std::complex< double > > &  signal,
ivec &  output 
) const
virtualinherited

Demodulation of symbols.

Definition at line 125 of file modulator.h.

◆ demodulate() [2/2]

ivec itpp::Modulator< std::complex< double > >::demodulate ( const Vec< std::complex< double > > &  signal) const
virtualinherited

Demodulation of symbols.

Definition at line 127 of file modulator.h.

◆ modulate_bits() [1/2]

void itpp::Modulator< std::complex< double > >::modulate_bits ( const bvec &  bits,
Vec< std::complex< double > > &  output 
) const
virtualinherited

Modulation of bits.

Definition at line 130 of file modulator.h.

◆ modulate_bits() [2/2]

Vec< std::complex< double > > itpp::Modulator< std::complex< double > >::modulate_bits ( const bvec &  bits) const
virtualinherited

Modulation of bits.

Reimplemented in itpp::BPSK_c.

Definition at line 132 of file modulator.h.

◆ demodulate_soft_bits() [5/8]

void itpp::Modulator< std::complex< double > >::demodulate_soft_bits ( const Vec< std::complex< double > > &  rx_symbols,
double  N0,
vec &  soft_bits,
Soft_Method  method = LOGMAP 
) const
virtualinherited

Soft demodulator for AWGN channels.

This function calculates the log-likelihood ratio (LLR) of the received signal from AWGN channels. Depending on the soft demodulation method chosen, either full log-MAP calculation is performed (default method), according to the following equation:

\[\log \left(
\frac{P(b_i=0|r)}{P(b_i=1|r)} \right) = \log \left( \frac{\sum_{s_i
\in S_0} \exp \left( -\frac{|r_k - s_i|^2}{N_0} \right)} {\sum_{s_i
\in S_1} \exp \left( -\frac{|r_k - s_i|^2}{N_0} \right)} \right) \]

or approximate, but faster calculation is performed.

The approximate method finds for each bit the closest constellation points that have zero and one in the corresponding position. Let $d_0 = |r_k - s_0|$ denote the distance to the closest zero point and $d_1 = |r_k - s_1|$ denote the distance to the closest one point for the corresponding bit respectively. The approximate algorithm then computes

\[\frac{d_1^2 - d_0^2}{N_0}\]

This function can be used on channels where the channel gain $c_k = 1$.

When this function is to be used together with MAP-based turbo decoding algorithms then the channel reliability factor $L_c$ of the turbo decoder shall be set to 1. The output from this function can also be used by a Viterbi decoder using an AWGN based metric calculation function.

Parameters
rx_symbolsThe received noisy constellation symbols
N0The spectral density of the AWGN noise
soft_bitsThe soft bits calculated using the expression above
methodThe method used for demodulation (LOGMAP or APPROX)
Note
For soft demodulation it is suggested to use the N-dimensional modulator (Modulator_ND) instead, which is based on the QLLR (quantized) arithmetic and therefore is faster. Please note, however, that mixed use of Modulator_1D/Modulator_2D and Modulator_ND is not advised.

Definition at line 178 of file modulator.h.

◆ demodulate_soft_bits() [6/8]

vec itpp::Modulator< std::complex< double > >::demodulate_soft_bits ( const Vec< std::complex< double > > &  rx_symbols,
double  N0,
Soft_Method  method = LOGMAP 
) const
virtualinherited

Soft demodulator for AWGN channels.

Definition at line 182 of file modulator.h.

◆ demodulate_soft_bits() [7/8]

void itpp::Modulator< std::complex< double > >::demodulate_soft_bits ( const Vec< std::complex< double > > &  rx_symbols,
const Vec< std::complex< double > > &  channel,
double  N0,
vec &  soft_bits,
Soft_Method  method = LOGMAP 
) const
virtualinherited

Soft demodulator for fading channels.

This function calculates the log-likelihood ratio (LLR) of the received signal from fading channels. Depending on the soft demodulation method chosen, either full log-MAP calculation is performed (default method), according to the following equation:

\[\log \left( \frac{P(b_i=0|r)}{P(b_i=1|r)} \right) = \log \left(
\frac{\sum_{s_i \in S_0} \exp \left( -\frac{|r_k - c_k s_i|^2}{N_0}
\right)} {\sum_{s_i \in S_1} \exp \left( -\frac{|r_k - c_k
s_i|^2}{N_0} \right)} \right) \]

or approximate, but faster calculation is performed.

The approximate method finds for each bit the closest constellation points that have zero and one in the corresponding position. Let $d_0 = |r_k - c_k s_0|$ denote the distance to the closest zero point and $d_1 = |r_k - c_k s_1|$ denote the distance to the closest one point for the corresponding bit respectively. The approximate algorithm then computes

\[\frac{d_1^2 - d_0^2}{N_0}\]

When this function is to be used together with MAP-based turbo decoding algorithms then the channel reliability factor $L_c$ of the turbo decoder shall be set to 1. The output from this function can also be used by a Viterbi decoder using an AWGN based metric calculation function.

Parameters
rx_symbolsThe received noisy constellation symbols $r_k$
channelThe channel values $c_k$
N0The spectral density of the AWGN noise
soft_bitsThe soft bits calculated using the expression above
methodThe method used for demodulation (LOGMAP or APPROX)
Note
For soft demodulation it is suggested to use the N-dimensional modulator (Modulator_ND) instead, which is based on the QLLR (quantized) arithmetic and therefore is faster. Please note, however, that mixed use of Modulator_1D/Modulator_2D and Modulator_ND is not advised.

Definition at line 223 of file modulator.h.

◆ demodulate_soft_bits() [8/8]

vec itpp::Modulator< std::complex< double > >::demodulate_soft_bits ( const Vec< std::complex< double > > &  rx_symbols,
const Vec< std::complex< double > > &  channel,
double  N0,
Soft_Method  method = LOGMAP 
) const
virtualinherited

Soft demodulator for fading channels.

Definition at line 228 of file modulator.h.

◆ calculate_softbit_matrices()

void itpp::Modulator< std::complex< double > >::calculate_softbit_matrices ( )
protectedinherited

This function calculates the soft bit mapping matrices S0 and S1.

Definition at line 254 of file modulator.h.

Friends And Related Symbol Documentation

◆ Modulator_1D

Definition of 1D Modulator (with real symbols)

Definition at line 266 of file modulator.h.

◆ Modulator_2D

typedef Modulator<std::complex<double> > Modulator_2D
related

Definition of 2D Modulator (with complex symbols)

Definition at line 272 of file modulator.h.

Member Data Documentation

◆ setup_done

bool itpp::Modulator< std::complex< double > >::setup_done
protectedinherited

Setup indicator.

Definition at line 235 of file modulator.h.

◆ k

int itpp::Modulator< std::complex< double > >::k
protectedinherited

Number of bits per modulation symbol.

Definition at line 237 of file modulator.h.

◆ M

int itpp::Modulator< std::complex< double > >::M
protectedinherited

Number of modulation symbols.

Definition at line 239 of file modulator.h.

◆ bitmap

bmat itpp::Modulator< std::complex< double > >::bitmap
protectedinherited

Bit to symbol mapping table (size: M x k)

Definition at line 241 of file modulator.h.

◆ bits2symbols

ivec itpp::Modulator< std::complex< double > >::bits2symbols
protectedinherited

Bit to symbol mapping in decimal form (size: M)

Definition at line 243 of file modulator.h.

◆ symbols

Vec<std::complex< double > > itpp::Modulator< std::complex< double > >::symbols
protectedinherited

Corresponding modulation symbols (size: M)

Definition at line 245 of file modulator.h.

◆ S0

imat itpp::Modulator< std::complex< double > >::S0
protectedinherited

Matrix where row k contains the constellation points with '0' in bit position k.

Definition at line 248 of file modulator.h.

◆ S1

imat itpp::Modulator< std::complex< double > >::S1
protectedinherited

Matrix where row k contains the constellation points with '1' in bit position k.

Definition at line 251 of file modulator.h.


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

Generated on Mon Jun 10 2024 11:49:39 for IT++ by Doxygen 1.9.8