Main Page | Modules | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members

modulator.h

Go to the documentation of this file.
00001 // 
00002 // SPUC - Signal processing using C++ - A DSP library
00003 /*---------------------------------------------------------------------------*
00004  *                                   IT++                                    *
00005  *---------------------------------------------------------------------------*
00006  * Copyright (c) 1995-2002 by Tony Ottosson, Thomas Eriksson, Pål Frenger,   *
00007  * Tobias Ringström, and Jonas Samuelsson.                                   *
00008  *                                                                           *
00009  * Permission to use, copy, modify, and distribute this software and its     *
00010  * documentation under the terms of the GNU General Public License is hereby *
00011  * granted. No representations are made about the suitability of this        *
00012  * software for any purpose. It is provided "as is" without expressed or     *
00013  * implied warranty. See the GNU General Public License for more details.    *
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     //vec modulate(const svec &symbolnumbers);
00307     //svec demodulate(const vec &signal);
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   //cvec modulate(const svec &symbolnumbers);
00410   //svec demodulate(const cvec &signal);
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   //cvec modulate(const svec &symbolnumbers);
00494   //svec demodulate(const cvec &signal);
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   //cvec modulate(const svec &symbolnumbers);
00610   //svec demodulate(const cvec &signal);
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 

Generated on Fri Sep 16 11:02:20 2005 for spuc by  doxygen 1.4.4