MNE-CPP  beta 1.0
filterdata.cpp
Go to the documentation of this file.
1 //=============================================================================================================
38 //*************************************************************************************************************
39 //=============================================================================================================
40 // INCLUDES
41 //=============================================================================================================
42 
43 #include "filterdata.h"
44 
45 
46 //*************************************************************************************************************
47 //=============================================================================================================
48 // USED NAMESPACES
49 //=============================================================================================================
50 
51 using namespace UTILSLIB;
52 
53 
54 //*************************************************************************************************************
55 
56 FilterData::FilterData()
57 {
58 }
59 
60 FilterData::~FilterData()
61 {
62 }
63 
64 //*************************************************************************************************************
65 
66 FilterData::FilterData(QString unique_name, FilterType type, int order, double centerfreq, double bandwidth, double parkswidth, qint32 fftlength)
67 : m_Type(type)
68 , m_iFilterOrder(order)
69 , m_iFFTlength(fftlength)
70 {
71  ParksMcClellan filter(order, centerfreq, bandwidth, parkswidth, (ParksMcClellan::TPassType)type);
72  m_dCoeffA = filter.FirCoeff;
73 
74  //fft-transform m_dCoeffA in order to be able to perform frequency-domain filtering
76 
77  Q_UNUSED(unique_name);
78 }
79 
80 //*************************************************************************************************************
81 
83 {
84  //zero-pad m_dCoeffA to m_iFFTlength
85  RowVectorXd t_coeffAzeroPad = RowVectorXd::Zero(m_iFFTlength);
86  t_coeffAzeroPad.head(m_dCoeffA.cols()) = m_dCoeffA;
87 
88  //generate fft object
89  Eigen::FFT<double> fft;
90  fft.SetFlag(fft.HalfSpectrum);
91 
92  //fft-transform filter coeffs
93  m_dFFTCoeffA = RowVectorXcd::Zero(m_iFFTlength);
94  fft.fwd(m_dFFTCoeffA,t_coeffAzeroPad);
95 }
96 
97 //*************************************************************************************************************
98 
99 RowVectorXd FilterData::applyFFTFilter(RowVectorXd& data)
100 {
101  //zero-pad data to m_iFFTlength
102  RowVectorXd t_dataZeroPad = RowVectorXd::Zero(m_iFFTlength);
103  t_dataZeroPad.head(data.cols()) = data;
104 
105  //generate fft object
106  Eigen::FFT<double> fft;
107  fft.SetFlag(fft.HalfSpectrum);
108 
109  //fft-transform data sequence
110  RowVectorXcd t_freqData;
111  fft.fwd(t_freqData,t_dataZeroPad);
112 
113  //perform frequency-domain filtering
114  RowVectorXcd t_filteredFreq = m_dFFTCoeffA.array()*t_freqData.array();
115 
116  //inverse-FFT
117  RowVectorXd t_filteredTime;
118  fft.inv(t_filteredTime,t_filteredFreq);
119 
120  //cuts off ends at front and end and return result
121  return t_filteredTime.segment(m_iFilterOrder/2+1,m_iFFTlength-m_iFilterOrder);
122 }
void fftTransformCoeffs()
fftTransformCoeffs transforms the calculated filter coefficients to frequency-domain ...
Definition: filterdata.cpp:82
RowVectorXd m_dCoeffA
Definition: filterdata.h:127
RowVectorXcd m_dFFTCoeffA
Definition: filterdata.h:130
The FilterData class represents a derived class from an arbitrary MNEOperator class object...