00001 00033 #ifndef MODULATOR_H 00034 #define MODULATOR_H 00035 00036 #include <itpp/base/vec.h> 00037 #include <itpp/base/specmat.h> 00038 00039 00040 namespace itpp { 00041 00043 00048 class Modulator { 00049 public: 00051 Modulator() {} 00053 virtual ~Modulator() {} 00055 virtual double bits_per_symbol() const = 0; 00057 virtual void modulate_bits(const bvec &bits, cvec &out) const = 0; 00059 virtual cvec modulate_bits(const bvec &bits) const = 0; 00061 virtual void demodulate_bits(const cvec &signal, bvec &out) const = 0; 00063 virtual bvec demodulate_bits(const cvec &signal) const = 0; 00065 virtual void demodulate_soft_bits(const cvec &rx_symbols, double N0, 00066 vec &soft_bits) const = 0; 00068 virtual void demodulate_soft_bits(const cvec &rx_symbols, 00069 const cvec &channel, double N0, 00070 vec &soft_bits) const = 0; 00072 virtual void demodulate_soft_bits_approx(const cvec &rx_symbols, double N0, 00073 vec &soft_bits) const = 0; 00075 virtual void demodulate_soft_bits_approx(const cvec &rx_symbols, 00076 const cvec &channel, double N0, 00077 vec &soft_bits) const = 0; 00078 }; 00079 00080 00085 class Modulator_1d { 00086 public: 00088 Modulator_1d(const vec &symbols = "0", const ivec &bitmap = "0"); 00090 virtual ~Modulator_1d() { } 00091 00093 void set(const vec &symbols, const ivec &bitmap); 00094 00096 virtual double bits_per_symbol() const { return k;} 00098 vec get_symbols() const { return symbols; } 00100 ivec get_bitmap() const { return bitmap; } 00101 00103 virtual vec modulate(const ivec &symbolnumbers) const; 00105 virtual ivec demodulate(const vec &signal) const; 00106 00108 virtual vec modulate_bits(const bvec &bits) const; 00110 virtual bvec demodulate_bits(const vec &signal) const; 00111 00112 protected: 00114 int k; 00116 int M; 00118 ivec bitmap; 00120 vec symbols; 00121 }; 00122 00123 00148 class Modulator_2d { 00149 public: 00151 Modulator_2d(const cvec &symbols = "1+0i -1+0i", const ivec &bitmap = "0 1"); 00153 virtual ~Modulator_2d() {} 00154 00156 void set(const cvec &symbols, const ivec &bitmap); 00157 00159 virtual double bits_per_symbol() const { return k; } 00161 cvec get_symbols() const { return symbols; } 00163 ivec get_bitmap() const { return bitmap; } 00164 00166 virtual cvec modulate(const ivec &symbolnumbers) const; 00168 virtual ivec demodulate(const cvec &signal) const; 00169 00171 virtual void modulate_bits(const bvec &bits, cvec &out) const; 00173 virtual cvec modulate_bits(const bvec &bits) const; 00175 virtual void demodulate_bits(const cvec &signal, bvec &bits) const; 00177 virtual bvec demodulate_bits(const cvec &signal) const; 00178 00200 virtual void demodulate_soft_bits(const cvec &rx_symbols, double N0, 00201 vec &soft_bits) const; 00202 00223 virtual void demodulate_soft_bits(const cvec &rx_symbols, const cvec &chan, 00224 double N0, vec &soft_bits) const; 00225 00242 virtual void demodulate_soft_bits_approx(const cvec &rx_symbols, double N0, 00243 vec &soft_bits) const; 00244 00262 virtual void demodulate_soft_bits_approx(const cvec &rx_symbols, 00263 const cvec &chan, 00264 double N0, vec &soft_bits) const; 00265 00266 00267 protected: 00269 int k; 00271 int M; 00273 ivec bitmap; 00275 cvec symbols; 00276 00278 void calculate_softbit_matricies(const ivec& inbitmap); 00281 imat S0; 00284 imat S1; 00285 }; 00286 00287 00301 class BPSK : public Modulator { 00302 public: 00304 BPSK() { } 00306 virtual ~BPSK() {} 00308 virtual double bits_per_symbol() const { return 1; } 00310 void modulate_bits(const bvec &bits, vec &out) const; 00312 virtual void modulate_bits(const bvec &bits, cvec &out) const; 00314 virtual cvec modulate_bits(const bvec &bits) const; 00316 void demodulate_bits(const vec &signal, bvec &out) const; 00318 virtual bvec demodulate_bits(const vec &signal) const; 00325 virtual void demodulate_bits(const cvec &signal, bvec &out) const; 00327 virtual bvec demodulate_bits(const cvec &signal) const; 00328 00346 void demodulate_soft_bits(const vec &rx_symbols, double N0, 00347 vec &soft_bits) const; 00348 00367 virtual void demodulate_soft_bits(const cvec &rx_symbols, double N0, 00368 vec &soft_bits) const; 00369 00390 virtual void demodulate_soft_bits(const cvec &rx_symbols, 00391 const cvec &channel, double N0, 00392 vec &soft_bits) const; 00393 00397 virtual void demodulate_soft_bits_approx(const cvec &rx_symbols, 00398 double N0, vec &soft_bits) const; 00399 00403 virtual void demodulate_soft_bits_approx(const cvec &rx_symbols, 00404 const cvec &channel, double N0, 00405 vec &soft_bits) const; 00406 }; 00407 00408 00409 00421 class PAM : public Modulator { 00422 public: 00424 PAM(int Mary) { set_M(Mary); } 00426 virtual ~PAM() { } 00428 void set_M(int Mary); 00429 00431 virtual double bits_per_symbol() const { return k; } 00432 00434 void modulate_bits(const bvec &bits, vec &out) const; 00436 virtual void modulate_bits(const bvec &bits, cvec &out) const; 00438 virtual cvec modulate_bits(const bvec &bits) const; 00440 void demodulate_bits(const vec &signal, bvec &out) const; 00442 virtual void demodulate_bits(const cvec &signal, bvec &out) const; 00444 virtual bvec demodulate_bits(const cvec &signal) const; 00445 00470 virtual void demodulate_soft_bits(const cvec &rx_symbols, double N0, 00471 vec &soft_bits) const; 00472 00481 virtual void demodulate_soft_bits_approx(const cvec &rx_symbols, double N0, 00482 vec &soft_bits) const; 00483 00484 00509 virtual void demodulate_soft_bits(const cvec &rx_symbols, 00510 const cvec &channel, double N0, 00511 vec &soft_bits) const; 00512 00521 virtual void demodulate_soft_bits_approx(const cvec &rx_symbols, 00522 const cvec &channel, double N0, 00523 vec &soft_bits) const; 00524 00525 protected: 00527 int k; 00529 int M; 00531 bmat bitmap; 00533 ivec bits2symbols; 00535 vec symbols; 00537 double average_energy; 00539 double scaling_factor; 00542 imat S0; 00545 imat S1; 00546 }; 00547 00548 00582 class QPSK : public Modulator { 00583 public: 00585 QPSK() {} 00587 virtual ~QPSK() {} 00589 virtual double bits_per_symbol() const { return 2; } 00590 00592 virtual void modulate_bits(const bvec &bits, cvec &out) const; 00594 virtual cvec modulate_bits(const bvec &bits) const; 00596 virtual void demodulate_bits(const cvec &signal, bvec &out) const; 00598 virtual bvec demodulate_bits(const cvec &signal) const; 00623 virtual void demodulate_soft_bits(const cvec &rx_symbols, double N0, 00624 vec &soft_bits) const; 00625 00651 virtual void demodulate_soft_bits(const cvec &rx_symbols, 00652 const cvec &channel, double N0, 00653 vec &soft_bits) const; 00654 00658 virtual void demodulate_soft_bits_approx(const cvec &rx_symbols, double N0, 00659 vec &soft_bits) const; 00660 00664 virtual void demodulate_soft_bits_approx(const cvec &rx_symbols, 00665 const cvec &channel, double N0, 00666 vec &soft_bits) const; 00667 }; 00668 00669 00696 class PSK : public Modulator { 00697 public: 00699 PSK(int Mary) { set_M(Mary); } 00701 virtual ~PSK() { } 00703 void set_M(int Mary); 00704 00706 virtual double bits_per_symbol() const { return k; } 00708 virtual void modulate_bits(const bvec &bits, cvec &out) const; 00710 virtual cvec modulate_bits(const bvec &bits) const; 00712 virtual void demodulate_bits(const cvec &signal, bvec &out) const; 00714 virtual bvec demodulate_bits(const cvec &signal) const; 00715 00739 virtual void demodulate_soft_bits(const cvec &rx_symbols, double N0, 00740 vec &soft_bits) const; 00741 00750 virtual void demodulate_soft_bits_approx(const cvec &rx_symbols, double N0, 00751 vec &soft_bits) const; 00752 00776 virtual void demodulate_soft_bits(const cvec &rx_symbols, 00777 const cvec &channel, double N0, 00778 vec &soft_bits) const; 00779 00788 virtual void demodulate_soft_bits_approx(const cvec &rx_symbols, 00789 const cvec &channel, double N0, 00790 vec &soft_bits) const; 00791 00792 protected: 00794 int k; 00796 int M; 00798 bmat bitmap; 00800 ivec bits2symbols; 00802 cvec symbols; 00804 double average_energy; 00807 imat S0; 00810 imat S1; 00811 }; 00812 00813 00849 class QAM : public Modulator { 00850 public: 00852 QAM(int Mary) { set_M(Mary); } 00854 virtual ~QAM() { } 00856 void set_M(int Mary); 00857 00859 virtual double bits_per_symbol() const { return k; } 00861 cvec get_symbols() const { return symbols; } 00863 ivec get_bitmap() const { return bits2symbols; } 00864 00866 virtual void modulate_bits(const bvec &bits, cvec &out) const; 00868 virtual cvec modulate_bits(const bvec &bits) const; 00870 virtual void demodulate_bits(const cvec &signal, bvec &out) const; 00872 virtual bvec demodulate_bits(const cvec &signal) const; 00873 00897 virtual void demodulate_soft_bits(const cvec &rx_symbols, double N0, 00898 vec &soft_bits) const; 00899 00908 virtual void demodulate_soft_bits_approx(const cvec &rx_symbols, double N0, 00909 vec &soft_bits) const; 00910 00934 virtual void demodulate_soft_bits(const cvec &rx_symbols, 00935 const cvec &channel, double N0, 00936 vec &soft_bits) const; 00937 00946 virtual void demodulate_soft_bits_approx(const cvec &rx_symbols, 00947 const cvec &channel, double N0, 00948 vec &soft_bits) const; 00949 00950 protected: 00952 int k; 00954 int M; 00956 int L; 00958 bmat bitmap; 00960 ivec bits2symbols; 00962 cvec symbols; 00964 double average_energy; 00966 double scaling_factor; 00969 imat S0; 00972 imat S1; 00973 }; 00974 00975 } // namespace itpp 00976 00977 #endif // #ifndef MODULATOR_H
Generated on Wed Apr 18 11:45:34 2007 for IT++ by Doxygen 1.5.2