00001 #ifndef _Q_FFT_FIR_HH_ 00002 #define _Q_FFT_FIR_HH_ 00003 00004 #include "QVector.hh" 00005 #include "QVectorC.hh" 00006 #include "QError.hh" 00007 #include "QVectorView.hh" 00008 #include "QRealComplexFFT.hh" 00009 00010 using namespace Cuore; 00011 00012 class QFFTFir { 00013 00014 public: 00015 00016 enum AlgoType { 00017 AT_BV, 00018 AT_BV_Causal, 00019 AT_SF, 00020 AT_SF_Infinite, 00021 }; 00022 00023 QFFTFir(size_t size, double samplFreq, double cutFreq, QFFT::WindowType wt = QFFT::WT_Rect, AlgoType at = AT_BV); 00024 00025 QError FilterData(const QVector& input, QVector& output, size_t subratio = 1) const; 00026 QError FilterDataMinimal(const QVector& input, QVector& output) const; 00027 00028 const QVectorC& GetInputFilterFD() const { return fInputFilterFD; } 00029 const QVector& GetInputFilterTD() const { return fInputFilterTD; } 00030 double GetInputFilterTD_VPR() const { return fInputFilterTD.GetMin()/fInputFilterTD.GetMax(); } 00031 00032 const QVectorC& GetFilterFD() const { return fFilterFD; } 00033 const QVector& GetFilterTD() const { return fFilterTD; } 00034 00035 const QVector& GetWindow() const { return fWindow; } 00036 00037 inline const size_t GetFilterSize() const {return fFilterSize;} 00038 inline const double GetCutFrequency() const {return fCutFreq;} 00039 inline const double GetSamplingFrequency() const {return fSamplingFreq;} 00040 00041 private: 00042 00043 size_t FilterSingleBlock(const QVector& input,QVector& output,size_t subratio, size_t offset) const; 00044 QVectorC GetInputFilter(size_t size, size_t bin_stop); 00045 00046 double fCutFreq; 00047 double fSamplingFreq; 00048 double fFreqResolution; 00049 00050 QVectorC fInputFilterFD; 00051 QVector fInputFilterTD; 00052 00053 QVector fWindow; 00054 00055 QVectorC fFilterFD; 00056 QVector fFilterTD; 00057 size_t fFilterSize; 00058 bool fCausal; 00059 size_t fConvolutionIndex; 00060 size_t fConvolutionSize; 00061 00062 mutable QVectorC fFilteredDataFD; 00063 mutable QVector fFilteredData; 00064 QRealComplexFFT* fFilterTransformer; 00065 00066 }; 00067 00068 #endif