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

3G开发

开发平台:

Visual C++

  1. //
  2. //  File = disc_auto_corr.cpp
  3. //
  4. #include <stdlib.h>
  5. #include "parmfile.h"
  6. #include "disc_auto_cov.h"
  7. #include "misdefs.h"
  8. #include "model_graph.h"
  9. #include "sigplot.h"
  10. extern ParmFile* ParmInput;
  11. extern int PassNumber;
  12. #ifdef _DEBUG
  13.   extern ofstream *DebugFile;
  14. #endif
  15. ofstream CovarFile("covar_res.txt", ios::out);
  16. //======================================================
  17. DiscreteAutoCovar::DiscreteAutoCovar( char* instance_name,
  18.                                 PracSimModel* outer_model,
  19.                                 Signal<byte_t>* in_sig)
  20.             :PracSimModel(instance_name,
  21.                           outer_model)
  22. {
  23.   In_Sig = in_sig;
  24.   OPEN_PARM_BLOCK;
  25.   GET_INT_PARM(Num_Corr_Passes);
  26.   GET_DOUBLE_PARM(Mean);
  27.   Mean_Sqrd = Mean * Mean;
  28.   MAKE_INPUT(In_Sig);
  29. }
  30. DiscreteAutoCovar::~DiscreteAutoCovar( void ){ };
  31. void DiscreteAutoCovar::Initialize(void)
  32. {
  33.    Proc_Block_Size = In_Sig->GetBlockSize();
  34.    Samp_Intvl = In_Sig->GetSampIntvl();
  35.    Corr_Buf = new double[Proc_Block_Size/2];
  36.    for(int i=0; i<Proc_Block_Size/2; i++) Corr_Buf[i]=0.0;
  37. //   Max_Corr = 0.0;
  38. //   Max_Corr_Time = 0.0;
  39.    //INITIALIZATION_REPORT(BasicResults);
  40.    return;
  41. }
  42. int DiscreteAutoCovar::Execute()
  43. {
  44.    byte_t *in_sig_beg;
  45.    byte_t *in_sig_ptr;
  46.    byte_t *slide_sig_beg;
  47.    byte_t *slide_sig_ptr;
  48.    int i, j;
  49.    int sum;
  50.    double covar_val;
  51.    if(PassNumber > Num_Corr_Passes) return(_MES_AOK);
  52.    //-------------------------------------------------------
  53.    //  Copy frequently accessed member vars into local vars
  54.    int proc_block_size = Proc_Block_Size;
  55.    int slide_block_size = proc_block_size/2;
  56.    double samp_intvl = Samp_Intvl;
  57.    //----------------------------------------
  58.    // Get pointers for input and output
  59.    in_sig_beg = GET_INPUT_PTR(In_Sig);
  60.    slide_sig_beg = in_sig_beg + proc_block_size/4;
  61.    //----------------------------------------
  62.    for( j=0; j<slide_block_size; j++)
  63.    {
  64.       sum = 0;
  65.       in_sig_ptr = in_sig_beg;
  66.       slide_sig_ptr = slide_sig_beg;
  67.       for( i=0; i<slide_block_size; i++)
  68.       {
  69.          sum += (*in_sig_ptr )*(*slide_sig_ptr );
  70.          slide_sig_ptr++;
  71.          in_sig_ptr++;
  72.       }
  73.       Corr_Buf[j] += ((float(sum)/slide_block_size)- Mean_Sqrd);
  74.       in_sig_beg++;
  75.    }
  76.    if(PassNumber == Num_Corr_Passes)
  77.    {
  78.       for( j=0; j<slide_block_size; j++)
  79.       {
  80.          covar_val = fabs((Corr_Buf[j]/Num_Corr_Passes));
  81.          if(covar_val <1e-20) covar_val = 1e-20;
  82.          CovarFile << j-slide_block_size/2 << ", " << 10.0*log10(covar_val) << endl;
  83.          //CovarFile << j-slide_block_size/2 << ", " << Corr_Buf[j] << endl;
  84.       }
  85.       CovarFile.close();
  86.       exit(22);
  87.    }
  88.    //---------------------
  89.    return(_MES_AOK);
  90. }