37#include <itpp/itexports.h>
92 virtual int get_k()
const {
return k; }
95 virtual int get_M()
const {
return M; }
225 double N0, vec& soft_bits,
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");
297 it_assert((
max(in_bits2symbols) == in_bits2symbols.size() - 1)
298 && (
min(in_bits2symbols) == 0),
"Modulator<T>::set(): Improper bits2symbol vector");
304 for (
int m = 0; m <
M; m++) {
316 output.
set_size(symbolnumbers.length());
317 for (
int i = 0; i < symbolnumbers.length(); i++)
318 output(i) =
symbols(symbolnumbers(i));
324 Vec<T> output(symbolnumbers.length());
334 double dist, mindist;
336 output.set_size(signal.
size());
338 for (
int i = 0; i < signal.
size(); i++) {
341 for (
int j = 1; j <
M; j++) {
343 if (dist < mindist) {
355 ivec output(signal.
length());
367 if (bits.length() %
k) {
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.");
370 int no_symbols = bits.length() /
k;
372 for (
int i = 0; i < no_symbols; i++) {
389 double dist, mindist;
391 bits.set_size(
k*signal.
size());
393 for (
int i = 0; i < signal.
size(); i++) {
396 for (
int j = 1; j <
M; j++) {
398 if (dist < mindist) {
403 bits.replace_mid(i*
k,
bitmap.get_row(closest));
422 double P0, P1, d0min, d1min, temp;
425 soft_bits.set_size(
k * rx_symbols.
size());
428 for (
int l = 0; l < rx_symbols.
size(); l++) {
429 for (
int j = 0; j <
M; j++) {
430 metric(j) = std::exp(-
sqr(rx_symbols(l) -
symbols(j)) / N0);
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));
443 for (
int l = 0; l < rx_symbols.
size(); l++) {
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++) {
450 temp = metric(
S0(i, j));
451 if (temp < d0min) { d0min = temp; }
452 temp = metric(
S1(i, j));
453 if (temp < d1min) { d1min = temp; }
455 soft_bits(l*
k + i) = (-d0min + d1min) / N0;
473 const Vec<T> &channel,
double N0,
478 double P0, P1, d0min, d1min, temp;
481 soft_bits.set_size(
k * rx_symbols.
size());
484 for (
int l = 0; l < rx_symbols.
size(); l++) {
485 for (
int j = 0; j <
M; j++) {
486 metric(j) = std::exp(-
sqr(rx_symbols(l) - channel(l) *
symbols(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));
500 for (
int l = 0; l < rx_symbols.
size(); l++) {
501 for (
int j = 0; j <
M; j++) {
502 metric(j) =
sqr(rx_symbols(l) - channel(l) *
symbols(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++) {
507 temp = metric(
S0(i, j));
508 if (temp < d0min) { d0min = temp; }
509 temp = metric(
S1(i, j));
510 if (temp < d1min) { d1min = temp; }
512 soft_bits(l*
k + i) = (-d0min + d1min) / N0;
535 S0.set_size(
k,
M >> 1,
false);
536 S1.set_size(
k,
M >> 1,
false);
538 for (
int i = 0; i <
k; i++) {
541 for (
int j = 0; j <
M; j++) {
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,
741 vec demodulate_soft_bits(
const cvec& rx_symbols,
const cvec& channel,
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,
843 vec demodulate_soft_bits(
const cvec& rx_symbols,
const cvec& channel,
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,
937 const vec& channel,
double N0,
941 vec demodulate_soft_bits(
const vec& rx_symbols,
const vec& channel,
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;
virtual ~BPSK_c()
Destructor.
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.
virtual int get_k() const
Returns number of bits per symbol.
virtual int bits_per_symbol() const
Returns number of bits per symbol.
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.
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
Modulator()
Default constructor.
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.
virtual ~Modulator()
Destructor.
Modulator< double > Modulator_1D
Definition of 1D Modulator (with real symbols)
void set_M(int M)
Set the size of the signal constellation.
PAM_c()
Default Constructor.
double scaling_factor
Scaling factor used to normalize the average energy to 1.
virtual ~PAM_c()
Destructor.
void set_M(int M)
Set the size of the signal constellation.
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.
void set_M(int M)
Change the size of the signal constellation.
virtual ~PSK()
Destructor.
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.
void set_M(int M)
Change the size of the signal constellation.
virtual ~QPSK()
Destructor.
int size() const
The size of the vector.
void set_size(int size, bool copy=false)
Set length of vector. if copy = true then keeping the old values.
int length() const
The size of the vector.
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.
int abs(const itpp::bin &inbin)
absolute value of bin