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

3G开发

开发平台:

Visual C++

  1. //
  2. //  File = k_pwrmtr.cpp
  3. //
  4. #include <stdlib.h>
  5. #include <fstream>
  6. #include <math.h>
  7. #include "parmfile.h"
  8. #include "k_pwrmtr.h"
  9. #include "misdefs.h"
  10. extern ParmFile *ParmInput;
  11. #ifdef _DEBUG
  12.   extern ofstream *DebugFile;
  13. #endif
  14. extern int PassNumber;
  15. ofstream PowerDebug("power.txt", ios::out);
  16. //======================================================
  17. // constructor - parms read from ParmFile
  18. template <class T>
  19. k_PowerMeter<T>::k_PowerMeter( char* instance_name )
  20. //              :PracSimModel(instance_name,
  21. //                            outer_model)
  22. {
  23. //  In_Sig = in_sig;
  24. //  Est_Avg_Sig_Pwr = est_avg_sig_pwr;
  25.   OPEN_PARM_BLOCK;
  26.   GET_FLOAT_PARM(Init_Pwr_Output);
  27.   GET_FLOAT_PARM(Integ_Const);
  28. }
  29. //============================================
  30. //  constructor for subordinate instance with
  31. //              parms passed in call
  32. template <class T>
  33. k_PowerMeter<T>::k_PowerMeter( char *instance_name,
  34.                             float init_pwr_output,
  35.                             float integ_const )
  36. //        :PracSimModel( instance_name, outer_model)
  37. {
  38. //  In_Sig = in_sig;
  39. //  Est_Avg_Sig_Pwr = est_avg_sig_pwr;
  40.   Init_Pwr_Output = init_pwr_output;
  41.   Integ_Const = integ_const;
  42. }
  43. //=============================================
  44. template <class T>
  45. k_PowerMeter<T>::~k_PowerMeter( void ){ };
  46. //===========================================
  47. template <class T>
  48. void k_PowerMeter<T>::Initialize(int max_proc_block_size,
  49.                               double samp_intvl)
  50. {
  51.   *DebugFile << "Now in k_PowerMeter::Initialize()" << endl;
  52.   Max_Proc_Block_Size = max_proc_block_size;
  53.   Meas_Pwr_Buf = new float[Max_Proc_Block_Size];
  54.   //double samp_intvl = 1.0/samp_rate;
  55.   double dx = 1.0/tan(PI*samp_intvl/Integ_Const);
  56.   Const_1 = 1.0/(dx+1.0);
  57.   Const_2 = (dx-1.0)/(dx+1.0);
  58.   Delay_Reg = Init_Pwr_Output/2.0;
  59.   //Delay_Reg = Init_Pwr_Output;
  60. }
  61. //=============================================
  62. template <class T>
  63. int k_PowerMeter<T>::Execute(  T *in_sig_ptr,
  64.                             float *est_avg_sig_pwr,
  65.                             int block_size)
  66. {
  67.   int is;
  68.   float *meas_pwr_ptr;
  69.   float meas_pwr;
  70.   T in_sig;
  71.   std::complex<float> cmpx_in_sig;
  72.   //float pwr_sig;
  73.   //float desired_avg_pwr, gain;
  74.   
  75.   #ifdef _DEBUG
  76.     *DebugFile << "In k_PowerMeter::Execute" << endl;
  77.   #endif
  78.   meas_pwr_ptr = Meas_Pwr_Buf;
  79.   //----------------------------------------------
  80.   for(is=0; is<block_size; is++)
  81.     {
  82.     in_sig = *in_sig_ptr++;
  83.     cmpx_in_sig = in_sig;
  84.     *meas_pwr_ptr++ = std::norm(cmpx_in_sig);
  85.     //*meas_pwr_ptr++ = std::norm(cmpx_in_sig)/2.0;
  86.     }
  87.   //---------------------------------------------
  88.   // smooth the measured signal power with an integrating filter
  89.   double const_1 = Const_1;
  90.   double const_2 = Const_2;
  91.   double delay_reg = Delay_Reg;
  92.   float result;
  93.   double dy;
  94.   meas_pwr_ptr = Meas_Pwr_Buf;
  95.   for(is=0; is<block_size; is++)
  96.     {
  97.     meas_pwr = *meas_pwr_ptr++;
  98.     dy = meas_pwr * const_1 + delay_reg * const_2;
  99.     result = float(dy + delay_reg);
  100.     delay_reg = dy;
  101.     *est_avg_sig_pwr++ = result;
  102.     //PowerDebug << (is + (PassNumber-1)*block_size) << ", "
  103.     //          << meas_pwr << ", " << result << endl;
  104.     }
  105.   Delay_Reg = delay_reg;
  106.   return(0);
  107. }
  108. template k_PowerMeter<std::complex<float> >;
  109. template k_PowerMeter<float>;