QFFTFir.hh
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