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

3G开发

开发平台:

Visual C++

  1. //
  2. //  File = ar_proc_gen.cpp
  3. //
  4. #include <stdlib.h>
  5. #include <fstream>
  6. #include <math.h>
  7. #include "parmfile.h"
  8. #include "ar_proc_gen.h"
  9. #include "model_graph.h"
  10. #include "syst_graph.h"
  11. #include "misdefs.h"
  12. #include "gausrand.h"
  13. extern int PassNumber;
  14. extern ParmFile *ParmInput;
  15. extern SystemGraph CommSystemGraph;
  16. #ifdef _DEBUG
  17.   extern ofstream *DebugFile;
  18. #endif
  19. //======================================================
  20. // normal constructor
  21. template <class T>
  22. ArProcessGenerator<T>::ArProcessGenerator( char* instance_name,
  23.                                               PracSimModel* outer_model,
  24.                                               Signal<T>* noise_sig)
  25.                       :PracSimModel(instance_name,
  26.                                     outer_model)
  27. {
  28.   MODEL_NAME(ArProcessGenerator);
  29.   Noise_Sig = noise_sig;
  30.   OPEN_PARM_BLOCK;
  31.   GET_INT_PARM(Noise_Seed);
  32.   GET_DOUBLE_PARM(Driving_Variance);
  33.   Driving_Sigma = float(sqrt(Driving_Variance));
  34.   GET_INT_PARM(Ar_Order);
  35.   int ar_size = Ar_Order+1;
  36.   A_Coeffs = new double[ar_size];
  37.   GET_DOUBLE_PARM_ARRAY(A_Coeffs, ar_size);
  38.   //----------------------------------------------
  39.   MAKE_OUTPUT(Noise_Sig);
  40.   Old_Output = new T[Ar_Order];
  41.   for(int i=0; i<Ar_Order; i++) Old_Output[i] = 0.0;
  42. }
  43. //=============================================
  44. template <class T>
  45. ArProcessGenerator<T>::~ArProcessGenerator( void ){ };
  46. //===========================================
  47. template <class T>
  48. void ArProcessGenerator<T>::Initialize(void)
  49. {
  50.   *DebugFile << "Now in ArProcessGenerator::Initialize()" << endl;
  51.   Proc_Block_Size = Noise_Sig->GetBlockSize();
  52. }
  53. //=============================================
  54. template <class T>
  55. int ArProcessGenerator<T>::Execute(void)
  56. {
  57.    int is, idx;
  58.    float *noise_sig_ptr;
  59.    float driving_sigma;
  60.    float rand_var;
  61.    float noise_sig_val;
  62.    //--------------------------------------------
  63.    driving_sigma = Driving_Sigma;
  64.    long noise_seed = Noise_Seed;
  65.    //---------------------------------------------
  66.    noise_sig_ptr = GET_OUTPUT_PTR(Noise_Sig);
  67.    //-------------------------------------------------
  68.    //  main loop
  69.    for(is=0; is<Proc_Block_Size; is++)
  70.    {
  71.       // generate gaussian RV
  72.       GaussRandom(&noise_seed, &rand_var);
  73.       noise_sig_val = driving_sigma * rand_var;
  74.       for(idx=0; idx<Ar_Order; idx++)
  75.       {
  76.          noise_sig_val -= A_Coeffs[idx+1]*Old_Output[idx];
  77.       }
  78.       for(idx=Ar_Order-1; idx>0; idx--)
  79.       {
  80.          Old_Output[idx] = Old_Output[idx-1];
  81.       }
  82.       Old_Output[0] = noise_sig_val;
  83.       *noise_sig_ptr++ = noise_sig_val;
  84.    }// end of main loop
  85.    // put back variables that have changed
  86.    Noise_Seed = noise_seed;
  87.    //----------------------------------------------
  88.    Noise_Sig->SetValidBlockSize(Proc_Block_Size);
  89.    return(_MES_AOK);
  90. };
  91. template ArProcessGenerator<float>;