msk_theory.cpp
上传用户:jtjnyq9001
上传日期:2014-11-21
资源大小:3974k
文件大小:3k
源码类别:

3G开发

开发平台:

Visual C++

  1. //
  2. //  File = msk_theory.cpp
  3. //
  4. #include <stdlib.h>
  5. #include <math.h>
  6. #include "msk_theory.h"
  7. #include "sinc.h"
  8. #include "q_func.h"
  9. #include <fstream>
  10. #ifndef PI
  11.   #define PI 3.1415926535897932
  12. #endif
  13. using namespace std;
  14. void MskPsd( double carrier_freq,
  15.               double bit_energy,
  16.               double bit_intvl,
  17.               double beg_freq,
  18.               double end_freq,
  19.               int num_pts,
  20.               bool plot_in_db,
  21.               char* out_filename)
  22. {
  23.   double freq, val;
  24.   double work, numer, denom;
  25.   double first_term, second_term;
  26.   double scale;
  27.   ofstream *out_file;
  28.   out_file = new ofstream(out_filename, ios::out);
  29.   scale = PI * PI / 8.0;
  30.   double delta_freq = (end_freq - beg_freq)/double(num_pts-1);
  31.   for(int n=0; n<num_pts; n++)
  32.     {
  33.     freq = beg_freq + n * delta_freq;
  34.     // calculate first term
  35.     work = 2.0 * bit_intvl * ( freq - carrier_freq );
  36.     denom = 1.0 - 4.0*work*work;
  37.     if(denom == 0.0)
  38.       {
  39.       //first_term = PI*PI/16.0;
  40.       first_term = 0.25;
  41.       }
  42.     else
  43.       {
  44.       numer = 2.0*cos(PI * work);
  45.       denom *= PI;
  46.       first_term = numer/denom;
  47.       first_term *= first_term;
  48.       }
  49.     //------------------------------------------
  50.     // calculate second term
  51.     work = 2.0 * bit_intvl * ( freq + carrier_freq );
  52.     denom = 1.0 - 4.0*work*work;
  53.     if(denom == 0.0)
  54.       {
  55.       //second_term = PI*PI/16.0;
  56.       second_term = 0.25;
  57.       }
  58.     else
  59.       {
  60.       numer = 2.0*cos(PI * work);
  61.       denom *= PI;
  62.       second_term = numer/denom;
  63.       second_term *= second_term;
  64.       }
  65.     val = scale * bit_energy * (first_term + second_term);
  66.     if( plot_in_db )
  67.       {
  68.       if(val>0.0)
  69.         {
  70.         val = 10.0 * log10(val);
  71.         }
  72.       else
  73.         {
  74.         val = -200.0;
  75.         }
  76.       }
  77.     (*out_file) << freq << ", " << val << endl;
  78.     }
  79.   delete out_file;
  80. }
  81. void MskBer( double beg_ebno,
  82.               double end_ebno,
  83.               int num_pts,
  84.               char* out_filename)
  85. {
  86.   double ebno_numeric, ebno_db, bit_err, q_arg;
  87.   ofstream *out_file;
  88.   out_file = new ofstream(out_filename, ios::out);
  89.   double delta_ebno = (end_ebno - beg_ebno)/double(num_pts-1);
  90.   for(int n=0; n<num_pts; n++)
  91.     {
  92.     ebno_db = beg_ebno + n * delta_ebno;
  93.     ebno_numeric = pow(10.0, ebno_db/10.0);
  94.     q_arg = sqrt(2.0*ebno_numeric);
  95.     bit_err = q_func(q_arg);
  96.     //bit_err = 0.5 * erfc(sqrt(ebno_numeric));
  97.     (*out_file) << ebno_db << ", " << bit_err << endl;
  98.     }
  99.   delete out_file;
  100. }
  101. //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++