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

3G开发

开发平台:

Visual C++

  1. //
  2. //  File = bart_pdgm.cpp
  3. //
  4. #include <stdlib.h>
  5. #include "parmfile.h"
  6. #include "model_graph.h"
  7. #include "bart_pdgm.h"
  8. //#include "trianglr.h"
  9. //#include "hamming.h"
  10. //#include "hann.h"
  11. #include "fft_T.h"
  12. #include "dump_spect.h"
  13. #ifdef _DEBUG
  14.   extern ofstream *DebugFile;
  15. #endif
  16. #define _NO_ZERO_ENDS 0
  17. #define _ZERO_ENDS 1
  18. extern ParmFile *ParmInput;
  19. extern int PassNumber;
  20. //======================================================
  21. template <class T>
  22. BartlettPeriodogram<T>::
  23.          BartlettPeriodogram( char* instance_name,
  24.                               PracSimModel* outer_model,
  25.                               Signal<T>* in_sig )
  26.                       :PracSimModel(   instance_name,
  27.                                        outer_model )
  28. {
  29.    MODEL_NAME(BartlettPeriodogram);
  30.    OPEN_PARM_BLOCK;
  31.    GET_INT_PARM(Seg_Len);
  32.    GET_INT_PARM(Fft_Len);
  33.    GET_INT_PARM(Hold_Off);
  34.    GET_INT_PARM(Num_Segs_To_Avg);
  35.    Psd_File_Name = new char[64];
  36.    strcpy(Psd_File_Name, "");
  37.    GET_STRING_PARM(Psd_File_Name);
  38.    GET_DOUBLE_PARM(Freq_Norm_Factor);
  39.    GET_BOOL_PARM(Output_In_Decibels);
  40.    GET_BOOL_PARM(Plot_Two_Sided);
  41.    GET_BOOL_PARM(Halt_When_Completed);
  42.    In_Sig = in_sig;
  43.    MAKE_INPUT(In_Sig);
  44.    Time_Seg = new T[Seg_Len];
  45.    Sample_Spectrum = new double[Fft_Len];
  46.    Freq_Seg = new std::complex<double>[Fft_Len];
  47.    for(int is=0; is<Fft_Len; is++) {
  48.       Sample_Spectrum[is] = 0.0;
  49.    }
  50.    Psd_File = new ofstream(Psd_File_Name, ios::out);
  51.    Processing_Completed = false;
  52. }
  53. //======================================================
  54. template <class T>
  55. BartlettPeriodogram<T>::~BartlettPeriodogram( void ){ };
  56. //======================================================
  57. template <class T>
  58. void BartlettPeriodogram<T>::Initialize(void)
  59. {
  60.    Segs_In_Est = 0;
  61.    Samps_Needed = Seg_Len;
  62.    Block_Size = In_Sig->GetBlockSize();
  63.    Samp_Intvl = In_Sig->GetSampIntvl();
  64.    Delta_F = 1.0/(Samp_Intvl*Fft_Len);
  65. };
  66. //======================================================
  67. template <class T>
  68. int BartlettPeriodogram<T>::Execute()
  69. {
  70.    int i,is;
  71. #ifdef _DEBUG
  72.    *DebugFile << "In SampleSpectrum::Execute" << endl;
  73. #endif
  74.    if(Processing_Completed) return(_MES_AOK);
  75.    if(PassNumber < Hold_Off) return (_MES_AOK);
  76.    //--------------------------------
  77.    //  Get pointers for buffers
  78.    Block_Size = In_Sig->GetValidBlockSize();
  79.    T *in_sig_ptr = GET_INPUT_PTR(In_Sig);
  80.    int samps_avail = Block_Size;
  81.    while(Samps_Needed <= samps_avail)
  82.    {
  83.       //  The new input block has enough samples to 
  84.       //  finish a segment.
  85.       //
  86.       //  Fill up FFT buffer by getting Samps_Needed
  87.       //  input samples.
  88.       for(is=Samps_Needed; is>0; is--){
  89.          Time_Seg[Seg_Len - is] = *in_sig_ptr++;
  90.       }
  91.       samps_avail -= Samps_Needed;
  92.       //  Perform FFT
  93.       FFT<double>(   
  94.          Time_Seg,
  95.          Freq_Seg,
  96.          Seg_Len,
  97.          Fft_Len);
  98.       for(i=0; i<Seg_Len; i++){
  99.          Sample_Spectrum[i] += Samp_Intvl * 
  100.             std::norm(Freq_Seg[i])/Seg_Len;
  101.       }
  102.       for(is=0; is<Seg_Len; is++){
  103.          Time_Seg[is] = 0.0;
  104.       }
  105.       Samps_Needed = Seg_Len;
  106.       Segs_In_Est++;
  107.       // is it time to dump the results?
  108.       if(Segs_In_Est == Num_Segs_To_Avg){
  109.          for(i=0; i<Seg_Len; i++){
  110.             Sample_Spectrum[i] /= 
  111.                double(Num_Segs_To_Avg);
  112.          }
  113.          DumpSpectrum(  
  114.             Sample_Spectrum,
  115.             Fft_Len,
  116.             Delta_F,
  117.             Freq_Norm_Factor,
  118.             Output_In_Decibels,
  119.             Plot_Two_Sided,
  120.             Psd_File);
  121.          Processing_Completed = true;
  122.          Psd_File->close();
  123.          if(Halt_When_Completed){
  124. #ifdef _DEBUG
  125.             *DebugFile << "Execution halted by " 
  126.                << GetModelName() << endl;
  127. #endif
  128.             exit(0);
  129.          }
  130.       }
  131.    }// end of while
  132.    //---------------------------------------------------
  133.    //  The number of avail new samples is not sufficient
  134.    //  to finish a segment.  Copy the avaialble samples
  135.    //  and then wait for the next pass to get some more.
  136.    for(is=0; is<samps_avail; is++){
  137.       Time_Seg[Seg_Len - Samps_Needed + is] = 
  138.                                        *in_sig_ptr++;
  139.    }
  140.    Samps_Needed -= samps_avail;
  141.    return(_MES_AOK);
  142. }
  143. template BartlettPeriodogram< std::complex<float> >;
  144. template BartlettPeriodogram<float>;