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

3G开发

开发平台:

Visual C++

  1. //
  2. //  File = sines_in_awgn.cpp
  3. //
  4. #include <stdlib.h>
  5. //#include <fstream>
  6. #include "sines_in_awgn.h"
  7. #include "misdefs.h"
  8. #include "parmfile.h"
  9. #include "model_graph.h"
  10. #include "sigstuff.h"
  11. #include "syst_graph.h"
  12. #include "gausrand.h"
  13. extern ParmFile *ParmInput;
  14. //extern ActiveSystemGraph ActSystGraph;
  15. #ifdef _DEBUG
  16.   extern ofstream *DebugFile;
  17. #endif
  18. //======================================================
  19. SinesInAwgn::SinesInAwgn( char* instance_name,
  20.                     PracSimModel* outer_model,
  21.                     Signal<float>* out_sig )
  22.         :PracSimModel( instance_name,
  23.                         outer_model )
  24. {
  25.   MODEL_NAME(SinesInAwgn);
  26.   Out_Sig = out_sig;
  27.   OPEN_PARM_BLOCK;
  28.    GET_DOUBLE_PARM(Awgn_Sigma);
  29.    GET_LONG_PARM(Noise_Seed);
  30.   GET_INT_PARM(Num_Sines);
  31.   Phase_In_Deg = new double[Num_Sines];
  32.   Phase_In_Rad = new double[Num_Sines];
  33.   Arg_Increm = new double[Num_Sines];
  34.   Base_Arg = new double[Num_Sines];
  35.   Freq_In_Hz = new double[Num_Sines];
  36.   Tone_Gain = new double[Num_Sines];
  37.   GET_DOUBLE_PARM_ARRAY(Phase_In_Deg,Num_Sines);
  38.   for(int idx=0; idx<Num_Sines; idx++)
  39.     {
  40.     Phase_In_Rad[idx] = PI * Phase_In_Deg[idx] /180.0;
  41.     cout << "Phase_In_Rad[" << idx << "] = " << Phase_In_Rad[idx] << endl;
  42.     }
  43.   GET_DOUBLE_PARM_ARRAY(Freq_In_Hz, Num_Sines);
  44.   GET_DOUBLE_PARM_ARRAY(Tone_Gain, Num_Sines);
  45.   MAKE_OUTPUT(Out_Sig);
  46. }
  47. //====================================================
  48. SinesInAwgn::~SinesInAwgn( void){};
  49. //====================================================
  50. void SinesInAwgn::Initialize(void)
  51. {
  52.   *DebugFile << "Now in SinesInAwgn::Initialize()" << endl;
  53.   Block_Size = Out_Sig->GetBlockSize();
  54.   Samp_Intvl = Out_Sig->GetSampIntvl();
  55.   for(int isin=0; isin<Num_Sines; isin++)
  56.     {
  57.     Arg_Increm[isin] = TWO_PI * Freq_In_Hz[isin] * Samp_Intvl;
  58.     Base_Arg[isin] = Phase_In_Rad[isin];
  59.     }
  60. }
  61. //====================================================
  62. int SinesInAwgn::Execute()
  63. {
  64.   int is, isin;
  65.   float *out_sig_ptr;
  66.   double out_samp;
  67.   double *base_arg, *arg_increm;
  68.   double *tone_gain;
  69.   long noise_seed;
  70.   double awgn_sigma;
  71.   //--------------------------------
  72.   //  Get pointer for output buffer
  73.   out_sig_ptr = GET_OUTPUT_PTR(Out_Sig);
  74.   base_arg = Base_Arg;
  75.   arg_increm = Arg_Increm;
  76.   tone_gain = Tone_Gain;
  77.   noise_seed = Noise_Seed;
  78.   awgn_sigma = Awgn_Sigma;
  79.   for (is=0; is<Block_Size; is++)
  80.     {
  81.     GaussRandom(&noise_seed, &out_samp);
  82.     out_samp *= awgn_sigma;
  83.     for(isin=0; isin<Num_Sines; isin++)
  84.       {
  85.       out_samp += tone_gain[isin] * sin(base_arg[isin] + (is*arg_increm[isin]));
  86.       }
  87.     if(is < Block_Size/2)
  88.       {
  89.       //*out_sig_ptr++ = 2*is*out_samp/Block_Size;
  90.       *out_sig_ptr++ = out_samp;
  91.       }
  92.     else
  93.       {
  94.       //*out_sig_ptr++ = out_samp * (1.0- 2*(is-Block_Size/2.0)/double(Block_Size));
  95.       *out_sig_ptr++ = out_samp;
  96.       }
  97.     }
  98.   for(isin=0; isin<Num_Sines; isin++)
  99.     {
  100.     Base_Arg[isin] = fmod(Base_Arg[isin] + Block_Size*Arg_Increm[isin],TWO_PI);
  101.     }
  102.   Noise_Seed = noise_seed;
  103.   return(_MES_AOK);
  104. }