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

3G开发

开发平台:

Visual C++

  1. //
  2. //  File = ms_error_T.cpp
  3. //
  4. #include <stdlib.h>
  5. #include <fstream>
  6. #include <strstream>
  7. #include "parmfile.h"
  8. #include "model_error.h"
  9. #include "ms_error_T.h"
  10. #include "model_graph.h"
  11. extern ParmFile *ParmInput;
  12. extern PracSimModel *ActiveModel;
  13. extern int PassNumber;
  14. //======================================================================
  15. //  Constructor
  16. template< class T >
  17. MeanSquareError< T >::MeanSquareError( char* instance_name,
  18.                                 PracSimModel* outer_model,
  19.                                 Signal<T>* in_signal,
  20.                                 Signal<T>* ref_signal )
  21.               :PracSimModel(instance_name,
  22.                             outer_model)
  23. {  
  24.   MODEL_NAME(MeanSquareError);
  25.   //ENABLE_MULTIRATE;
  26. //  ActiveModel = this;
  27.   //-----------------------------------
  28.   // Read configuration parameters
  29.   //OPEN_PARM_BLOCK;
  30.   //GET_INT_PARM(Interp_Rate);
  31.   //-----------------------------------
  32.   //  Signals
  33.   In_Sig = in_signal;
  34.   Ref_Sig = ref_signal;
  35.   MAKE_INPUT( Ref_Sig );
  36.   MAKE_INPUT( In_Sig );
  37.   //CHANGE_RATE(In_Sig, Out_Sig, Interp_Rate);
  38. };
  39. //================================================
  40. template< class T >
  41. MeanSquareError<T>::~MeanSquareError( void ){ };
  42. //=======================================================
  43. template< class T >
  44. void MeanSquareError<T>::Initialize()
  45.   {
  46.   //---------------------------------------
  47.   //  Initialize derived parameters
  48.   //Samp_Intvl = In_Sig->GetSampIntvl();
  49.   //Block_Size = In_Sig->GetBlockSize();
  50.   Cumul_Ms_Error = 0.0;
  51.   Cumul_Ref_Pwr = 0.0;
  52. }
  53. //=======================================
  54. template< class T >
  55. int MeanSquareError<T>::Execute()
  56. {
  57.   T *input_signal_ptr;
  58.   T *ref_signal_ptr;
  59.   int is, block_size;
  60.   double block_sum;
  61.   double ms_error, rms_error;
  62.   double cumul;
  63.   double input_samp, input_pwr;
  64.   double ref_samp, ref_pwr;
  65.   double scale_fact;
  66.   double snr;
  67.   T diff;
  68.   //-----------------------------------------
  69.   // Get pointers for input and output signals
  70.   
  71.   ref_signal_ptr = GET_INPUT_PTR(Ref_Sig);
  72.   input_signal_ptr = GET_INPUT_PTR(In_Sig);
  73.   block_size = In_Sig->GetValidBlockSize();
  74.   //Out_Sig->SetValidBlockSize(block_size * Interp_Rate);
  75.   //-----------------------------------------------------
  76.   //  normal processing loop
  77.   block_sum = 0.0;
  78.    input_pwr = 0.0;
  79.    ref_pwr = 0.0;
  80.    for(is=0; is<block_size; is++) {
  81.       input_samp = (*input_signal_ptr++);
  82.       input_pwr += input_samp*input_samp;
  83.       }
  84.    for(is=0; is<block_size; is++) {
  85.       ref_samp = (*ref_signal_ptr++);
  86.       ref_pwr += ref_samp*ref_samp;
  87.       }
  88.    Cumul_Ref_Pwr += ref_pwr;
  89.    scale_fact = sqrt(ref_pwr/input_pwr);
  90.    scale_fact = 1.0;
  91.   ref_signal_ptr = GET_INPUT_PTR(Ref_Sig);
  92.   input_signal_ptr = GET_INPUT_PTR(In_Sig);
  93.    for(is=0; is<block_size; is++) {
  94.       diff = (scale_fact*(*input_signal_ptr++)) - (*ref_signal_ptr++);
  95.       block_sum += diff * diff;
  96.       }
  97.    ms_error = block_sum/block_size;
  98.    Cumul_Ms_Error += block_sum;
  99.    rms_error = sqrt(ms_error);
  100.    snr = 10.0* log10(ref_pwr/block_sum);
  101.    cumul = 10.0* log10(Cumul_Ref_Pwr/Cumul_Ms_Error);
  102.    if(PassNumber%50 == 0) {
  103.       BasicResults << Instance_Name << ": " << PassNumber << " RMS = " << rms_error 
  104.                   << "  SNR = " << snr << " Cumul = " << cumul << endl;
  105.       BasicResults << " scale_fact = " << scale_fact << endl;
  106.       }
  107.    return(_MES_AOK);
  108. }
  109. //template MeanSquareError< int >;
  110. template MeanSquareError< float >;
  111. //template MeanSquareError< bit_t >;