IT++ Logo Newcom Logo

modulator.h

Go to the documentation of this file.
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
SourceForge Logo

Generated on Fri Jun 8 00:37:34 2007 for IT++ by Doxygen 1.5.2