37#include <itpp/itexports.h>
92 virtual int get_k()
const {
return k; }
95 virtual int get_M()
const {
return M; }
281 setup_done(
false), k(0), M(0), bitmap(
""), bits2symbols(
""), symbols(
""),
287 set(symbols, bits2symbols);
294 "Modulator<T>::set(): Number of symbols and bits2symbols does not match");
296 "Modulator<T>::set(): Number of symbols needs to be even and non-zero");
301 M = bits2symbols.
size();
303 bitmap.set_size(M, k);
304 for (
int m = 0; m < M; m++) {
305 bitmap.set_row(bits2symbols(m),
dec2bin(k, m));
307 calculate_softbit_matrices();
315 it_assert_debug(setup_done,
"Modulator<T>::modulate(): Modulator not ready.");
333 it_assert_debug(setup_done,
"Modulator<T>::demodulate(): Modulator not ready.");
338 for (
int i = 0;
i < signal.
size();
i++) {
339 mindist = std::abs(symbols(0) - signal(
i));
341 for (
int j = 1;
j < M;
j++) {
342 dist = std::abs(symbols(
j) - signal(
i));
355 ivec output(signal.
length());
356 demodulate(signal, output);
364 it_assert_debug(setup_done,
"Modulator<T>::modulate_bits(): Modulator not ready.");
368 it_warning(
"Modulator<T>::modulate_bits(): The number of input bits is not a multiple of k (number of bits per symbol). Remainder bits are not modulated.");
381 modulate_bits(
bits, output);
388 it_assert_debug(setup_done,
"Modulator<T>::demodulate_bist(): Modulator not ready.");
393 for (
int i = 0;
i < signal.
size();
i++) {
394 mindist = std::abs(symbols(0) - signal(
i));
396 for (
int j = 1;
j < M;
j++) {
397 dist = std::abs(symbols(
j) - signal(
i));
411 demodulate_bits(signal,
bits);
421 it_assert_debug(setup_done,
"Modulator<T>::demodulate_soft_bits(): Modulator not ready.");
429 for (
int j = 0;
j < M;
j++) {
432 for (
int i = 0;
i < k;
i++) {
434 for (
int j = 0;
j < (M >> 1);
j++) {
435 P0 += metric(S0(
i,
j));
436 P1 += metric(S1(
i,
j));
444 for (
int j = 0;
j < M;
j++) {
447 for (
int i = 0;
i < k;
i++) {
448 d0min =
d1min = std::numeric_limits<double>::max();
449 for (
int j = 0;
j < (M >> 1);
j++) {
467 demodulate_soft_bits(
rx_symbols, N0, output, method);
477 it_assert_debug(setup_done,
"Modulator_2D::demodulate_soft_bits(): Modulator not ready.");
485 for (
int j = 0;
j < M;
j++) {
489 for (
int i = 0;
i < k;
i++) {
491 for (
int j = 0;
j < (M >> 1);
j++) {
492 P0 += metric(S0(
i,
j));
493 P1 += metric(S1(
i,
j));
501 for (
int j = 0;
j < M;
j++) {
504 for (
int i = 0;
i < k;
i++) {
505 d0min =
d1min = std::numeric_limits<double>::max();
506 for (
int j = 0;
j < (M >> 1);
j++) {
538 for (
int i = 0;
i < k;
i++) {
541 for (
int j = 0;
j < M;
j++) {
542 if (bitmap(
j,
i) ==
bin(0)) {
599 void demodulate_bits(
const cvec& signal, bvec&
bits)
const;
601 bvec demodulate_bits(
const cvec& signal)
const;
648 void demodulate_bits(
const cvec& signal, bvec&
bits)
const;
650 bvec demodulate_bits(
const cvec& signal)
const;
706 virtual void demodulate_soft_bits(
const cvec&
rx_symbols,
double N0,
710 vec demodulate_soft_bits(
const cvec&
rx_symbols,
double N0,
736 virtual void demodulate_soft_bits(
const cvec&
rx_symbols,
737 const cvec&
channel,
double N0,
784 void modulate_bits(
const bvec&
bits, cvec& output)
const;
786 cvec modulate_bits(
const bvec&
bits)
const;
788 void demodulate_bits(
const cvec& signal, bvec& output)
const;
790 bvec demodulate_bits(
const cvec& signal)
const;
811 virtual void demodulate_soft_bits(
const cvec&
rx_symbols,
double N0,
815 vec demodulate_soft_bits(
const cvec&
rx_symbols,
double N0,
838 virtual void demodulate_soft_bits(
const cvec&
rx_symbols,
839 const cvec&
channel,
double N0,
885 void modulate_bits(
const bvec&
bits, vec& output)
const;
887 vec modulate_bits(
const bvec&
bits)
const;
889 void demodulate_bits(
const vec& signal, bvec& output)
const;
891 bvec demodulate_bits(
const vec& signal)
const;
910 virtual void demodulate_soft_bits(
const vec&
rx_symbols,
double N0,
914 vec demodulate_soft_bits(
const vec&
rx_symbols,
double N0,
936 virtual void demodulate_soft_bits(
const vec&
rx_symbols,
981 void demodulate_bits(
const cvec& signal, bvec& output)
const;
983 bvec demodulate_bits(
const cvec& signal)
const;
1024 virtual void demodulate_soft_bits(
const cvec&
rx_symbols,
double N0,
1028 virtual vec demodulate_soft_bits(
const cvec&
rx_symbols,
double N0,
1069 virtual void demodulate_soft_bits(
const cvec&
rx_symbols,
1070 const cvec&
channel,
double N0,
1074 virtual vec demodulate_soft_bits(
const cvec&
rx_symbols,
1075 const cvec&
channel,
double N0,
1117 void demodulate_bits(
const vec& signal, bvec& output)
const;
1119 bvec demodulate_bits(
const vec& signal)
const;
Array< T > mid(int pos, int n) const
Get n elements of the array starting from pos.
int size() const
Returns the number of data elements in the array object.
void set_size(int n, bool copy=false)
Resizing an Array<T>.
int length() const
Returns the number of data elements in the array object.
BPSK modulator with complex symbols.
virtual ~BPSK_c()
Destructor.
BPSK modulator with real symbols.
virtual ~BPSK()
Destructor.
General modulator for 1D or 2D signal constellations.
Modulator(const Vec< T > &symbols, const ivec &bits2symbols)
Constructor.
virtual vec demodulate_soft_bits(const Vec< T > &rx_symbols, const Vec< T > &channel, double N0, Soft_Method method=LOGMAP) const
Soft demodulator for fading channels.
virtual ivec get_bits2symbols() const
Get the bitmap, which maps input bits into symbols.
bmat bitmap
Bit to symbol mapping table (size: M x k)
Vec< T > symbols
Corresponding modulation symbols (size: M)
virtual int get_k() const
Returns number of bits per symbol.
int k
Number of bits per modulation symbol.
virtual int bits_per_symbol() const
Returns number of bits per symbol.
ivec bits2symbols
Bit to symbol mapping in decimal form (size: M)
virtual void demodulate_soft_bits(const Vec< T > &rx_symbols, double N0, vec &soft_bits, Soft_Method method=LOGMAP) const
Soft demodulator for AWGN channels.
virtual Vec< T > modulate(const ivec &symbolnumbers) const
Modulation of symbols.
virtual void demodulate(const Vec< T > &signal, ivec &output) const
Demodulation of symbols.
bool setup_done
Setup indicator.
virtual int get_M() const
Returns number of modulation symbols.
virtual ivec demodulate(const Vec< T > &signal) const
Demodulation of symbols.
virtual void modulate_bits(const bvec &bits, Vec< T > &output) const
Modulation of bits.
virtual Vec< T > modulate_bits(const bvec &bits) const
Modulation of bits.
virtual bvec demodulate_bits(const Vec< T > &signal) const
Hard demodulation of bits.
virtual void demodulate_bits(const Vec< T > &signal, bvec &bits) const
Hard demodulation of bits.
Modulator< std::complex< double > > Modulator_2D
Definition of 2D Modulator (with complex symbols)
imat S1
Matrix where row k contains the constellation points with '1' in bit position k.
Modulator()
Default constructor.
int M
Number of modulation symbols.
virtual Vec< T > get_symbols() const
Get the symbol values used in the modulator.
virtual void demodulate_soft_bits(const Vec< T > &rx_symbols, const Vec< T > &channel, double N0, vec &soft_bits, Soft_Method method=LOGMAP) const
Soft demodulator for fading channels.
virtual vec demodulate_soft_bits(const Vec< T > &rx_symbols, double N0, Soft_Method method=LOGMAP) const
Soft demodulator for AWGN channels.
virtual void set(const Vec< T > &symbols, const ivec &bits2symbols)
Set the constellation to use in the modulator.
void calculate_softbit_matrices()
This function calculates the soft bit mapping matrices S0 and S1.
virtual void modulate(const ivec &symbolnumbers, Vec< T > &output) const
Modulation of symbols.
imat S0
Matrix where row k contains the constellation points with '0' in bit position k.
virtual ~Modulator()
Destructor.
Modulator< double > Modulator_1D
Definition of 1D Modulator (with real symbols)
M-ary PAM modulator with complex symbols.
PAM_c()
Default Constructor.
double scaling_factor
Scaling factor used to normalize the average energy to 1.
virtual ~PAM_c()
Destructor.
M-ary PAM modulator with real symbols.
double scaling_factor
Scaling factor used to normalize the average energy to 1.
PAM()
Default Constructor.
virtual ~PAM()
Destructor.
PSK()
Default Constructor.
PSK(int M)
Class constructor.
virtual ~PSK()
Destructor.
M-ary QAM modulator with square lattice.
double scaling_factor
Scaling factor of square QAM constellation (sqrt((M-1)*2/3))
virtual ~QAM()
Destructor.
QAM()
Default Constructor.
QAM(int M)
Class Constructor.
int L
The square-root of M.
virtual ~QPSK()
Destructor.
Binary arithmetic (boolean) class.
Definitions of converters between different vector and matrix types.
Elementary mathematical functions - header file.
#define it_warning(s)
Display a warning message.
#define it_assert_debug(t, s)
Abort if t is not true and NDEBUG is not defined.
#define it_assert(t, s)
Abort if t is not true.
double trunc_log(double x)
Truncated natural logarithm function.
int levels2bits(int n)
Calculate the number of bits needed to represent n different values (levels).
T min(const Vec< T > &in)
Minimum value of vector.
T max(const Vec< T > &v)
Maximum value of vector.
bool is_even(int x)
Return true if x is an even integer.
vec sqr(const cvec &data)
Absolute square of elements.
Soft_Method
Soft demodulation methods.
@ LOGMAP
Log-MAP full calculation.
@ APPROX
Approximate faster method.
Logarithmic and exponenential functions - header file.
Matrix Class Definitions.
Mat< bin > bmat
bin matrix
Minimum and maximum functions on vectors and matrices.
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.
ITPP_EXPORT bvec dec2bin(int length, int index)
Convert a decimal int index to bvec using length bits in the representation.