00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00026 #ifndef __modulator_h
00027 #define __modulator_h
00028
00029 #include <iostream>
00030 #include <vector.h>
00031 #include <specmat.h>
00032 namespace SPUC {
00040 class Modulator_1d {
00041 public:
00043 Modulator_1d(const vec &insymbols = "0", const ivec &inbitmap = "0");
00045 virtual ~Modulator_1d() { }
00047 virtual vec modulate(const ivec &symbolnumbers);
00049 virtual ivec demodulate(const vec &signal);
00050
00052 virtual vec modulate_bits(const bvec &bits);
00054 virtual bvec demodulate_bits(const vec &signal);
00055
00057 void set(const vec &insymbols, const ivec &inbitmap);
00058
00060 vec get_symbols(void);
00062 ivec get_bitmap(void);
00063 protected:
00065 int k;
00067 int M;
00069 ivec bitmap;
00071 vec symbols;
00072 };
00073
00094 class Modulator_2d {
00095 public:
00097 Modulator_2d(const cvec &insymbols = zeros_c(1), const ivec &inbitmap = "0");
00099 virtual ~Modulator_2d() {}
00101 virtual cvec modulate(const ivec &symbolnumbers);
00103 virtual ivec demodulate(const cvec &signal);
00104
00106 virtual cvec modulate_bits(const bvec &bits);
00108 virtual bvec demodulate_bits(const cvec &signal);
00109
00127 void demodulate_soft_bits(const cvec &rx_symbols, double N0, vec &soft_bits);
00128
00145 void demodulate_soft_bits(const cvec &rx_symbols, const cvec &chan, double N0, vec &soft_bits);
00146
00161 void demodulate_soft_bits_approx(const cvec &rx_symbols, double N0, vec &soft_bits);
00162
00178 void demodulate_soft_bits_approx(const cvec &rx_symbols, const cvec &chan, double N0, vec &soft_bits);
00179
00181 void set(const cvec &insymbols, const ivec &inbitmap);
00182
00184 cvec get_symbols();
00186 ivec get_bitmap();
00187
00188 protected:
00189
00191 int k;
00193 int M;
00195 ivec bitmap;
00197 cvec symbols;
00198
00200 void calculate_softbit_matricies(ivec inbitmap);
00201
00203 imat S0;
00205 imat S1;
00207 bool soft_bit_mapping_matrices_calculated;
00208 };
00209
00222 class MOD_BPSK {
00223 public:
00225 MOD_BPSK() { }
00227 virtual ~MOD_BPSK() {}
00229 void modulate_bits(const bvec &bits, vec &out);
00231 vec modulate_bits(const bvec &bits);
00233 void modulate_bits(const bvec &bits, cvec &out);
00235 void demodulate_bits(const vec &signal, bvec &out);
00237 bvec demodulate_bits(const vec &signal);
00238
00245 void demodulate_bits(const cvec &signal, bvec &out);
00246
00260 void demodulate_soft_bits(const vec &rx_symbols, double N0, vec &soft_bits);
00261
00276 void demodulate_soft_bits(const cvec &rx_symbols, const cvec &channel, double N0, vec &soft_bits);
00277 };
00278
00289 class MOD_PAM {
00290 public:
00292 MOD_PAM(int Mary) { set_M(Mary); }
00294 virtual ~MOD_PAM() { }
00296 void modulate_bits(const bvec &bits, vec &out);
00298 vec modulate_bits(const bvec &bits);
00300 void demodulate_bits(const vec &signal, bvec &out);
00302 bvec demodulate_bits(const vec &signal);
00304 void set_M(int Mary);
00305
00306
00307
00308
00309 protected:
00311 int k;
00313 int M;
00315 bmat bitmap;
00317 ivec bits2symbols;
00319 vec symbols;
00321 double average_energy;
00323 double scaling_factor;
00324 };
00325
00356 class MOD_QPSK {
00357 public:
00359 MOD_QPSK() {}
00361 virtual ~MOD_QPSK() {}
00363 void modulate_bits(const bvec &bits, cvec &out);
00365 cvec modulate_bits(const bvec &bits);
00367 void demodulate_bits(const cvec &signal, bvec &out);
00369 bvec demodulate_bits(const cvec &signal);
00388 void demodulate_soft_bits(const cvec &rx_symbols, double N0, vec &soft_bits);
00407 void demodulate_soft_bits(const cvec &rx_symbols, const cvec &channel, double N0, vec &soft_bits);
00408
00409
00410
00411 };
00412
00436 class MOD_PSK {
00437 public:
00439 MOD_PSK(int Mary) { set_M(Mary); }
00441 virtual ~MOD_PSK() { }
00443 void modulate_bits(const bvec &bits, cvec &out);
00445 cvec modulate_bits(const bvec &bits);
00447 void demodulate_bits(const cvec &signal, bvec &out);
00449 bvec demodulate_bits(const cvec &signal);
00450
00469 void demodulate_soft_bits(const cvec &rx_symbols, double N0, vec &soft_bits);
00488 void demodulate_soft_bits(const cvec &rx_symbols, const cvec &channel, double N0, vec &soft_bits);
00489
00491 void set_M(int Mary);
00492
00493
00494
00495
00496 protected:
00498 int k;
00500 int M;
00502 bmat bitmap;
00504 ivec bits2symbols;
00506 cvec symbols;
00508 double average_energy;
00510 imat S0;
00512 imat S1;
00513 };
00514
00547 class MOD_QAM {
00548 public:
00550 MOD_QAM(int Mary) { set_M(Mary); }
00552 virtual ~MOD_QAM() { }
00554 void modulate_bits(const bvec &bits, cvec &out);
00556 cvec modulate_bits(const bvec &bits);
00558 void demodulate_bits(const cvec &signal, bvec &out);
00560 bvec demodulate_bits(const cvec &signal);
00561
00580 void demodulate_soft_bits(const cvec &rx_symbols, double N0, vec &soft_bits);
00581
00600 void demodulate_soft_bits(const cvec &rx_symbols, const cvec &channel, double N0, vec &soft_bits);
00601
00603 void set_M(int Mary);
00605 cvec get_symbols() { return symbols; }
00607 ivec get_bitmap() { return bits2symbols; }
00608
00609
00610
00611
00612 protected:
00614 int k;
00616 int M;
00618 int L;
00620 bmat bitmap;
00622 ivec bits2symbols;
00624 cvec symbols;
00626 double average_energy;
00628 double scaling_factor;
00630 imat S0;
00632 imat S1;
00633 };
00634 }
00635 #endif // __modulator_h
00636