MNE-CPP  beta 1.0
filteroperator.cpp
Go to the documentation of this file.
1 //=============================================================================================================
38 //*************************************************************************************************************
39 //=============================================================================================================
40 // INCLUDES
41 //=============================================================================================================
42 
43 #include "filteroperator.h"
44 
45 
46 //*************************************************************************************************************
47 //=============================================================================================================
48 // USED NAMESPACES
49 //=============================================================================================================
50 
51 using namespace MNEBrowseRawQt;
52 
53 
54 //*************************************************************************************************************
55 //=============================================================================================================
56 // DEFINE MEMBER METHODS
57 //=============================================================================================================
58 
59 FilterOperator::FilterOperator()
60 : MNEOperator(OperatorType::FILTER)
61 {
62 }
63 
64 
65 //*************************************************************************************************************
66 
67 FilterOperator::FilterOperator(QString unique_name, FilterType type, int order, double centerfreq, double bandwidth, double parkswidth, double sFreq, qint32 fftlength, DesignMethod designMethod)
68 : MNEOperator(OperatorType::FILTER)
69 , m_Type(type)
70 , m_iFilterOrder(order)
71 , m_iFFTlength(fftlength)
72 , m_dCenterFreq(centerfreq)
73 , m_dBandwidth(bandwidth)
74 , m_sFreq(sFreq)
75 , m_designMethod(designMethod)
76 , m_sName(unique_name)
77 {
78  switch(designMethod) {
79  case Tschebyscheff: {
80  ParksMcClellan filter(order, centerfreq, bandwidth, parkswidth, (ParksMcClellan::TPassType)type);
81  m_dCoeffA = filter.FirCoeff;
82 
83  //fft-transform m_dCoeffA in order to be able to perform frequency-domain filtering
85 
86  break;
87  }
88 
89  case Cosine: {
90  m_iFilterOrder = 0;
91 
92  CosineFilter filtercos;
93 
94  switch(type) {
95  case FilterType::LPF:
96  filtercos = CosineFilter (fftlength,
97  (centerfreq)*(sFreq/2),
98  parkswidth*(sFreq/2),
99  (centerfreq)*(sFreq/2),
100  parkswidth*(sFreq/2),
101  sFreq,
102  (CosineFilter::TPassType)type);
103  break;
104 
105  case FilterType::HPF:
106  filtercos = CosineFilter (fftlength,
107  (centerfreq)*(sFreq/2),
108  parkswidth*(sFreq/2),
109  (centerfreq)*(sFreq/2),
110  parkswidth*(sFreq/2),
111  sFreq,
112  (CosineFilter::TPassType)type);
113  break;
114 
115  case FilterType::BPF:
116  filtercos = CosineFilter (fftlength,
117  (centerfreq + bandwidth/2)*(sFreq/2),
118  parkswidth*(sFreq/2),
119  (centerfreq - bandwidth/2)*(sFreq/2),
120  parkswidth*(sFreq/2),
121  sFreq,
122  (CosineFilter::TPassType)type);
123  break;
124  }
125 
126  m_dCoeffA = filtercos.m_dCoeffA;
127  m_dFFTCoeffA = filtercos.m_dFFTCoeffA;
128 
129  break;
130  }
131  }
132 }
133 
134 
135 //*************************************************************************************************************
136 
137 FilterOperator::~FilterOperator()
138 {
139 }
140 
141 
142 //*************************************************************************************************************
143 
145 {
146  //This function only nneds to be called when using the Tschebyscheff design method
147  //zero-pad m_dCoeffA to m_iFFTlength
148  RowVectorXd t_coeffAzeroPad = RowVectorXd::Zero(m_iFFTlength);
149  t_coeffAzeroPad.head(m_dCoeffA.cols()) = m_dCoeffA;
150 
151  //generate fft object
152  Eigen::FFT<double> fft;
153  fft.SetFlag(fft.HalfSpectrum);
154 
155  //fft-transform filter coeffs
156  m_dFFTCoeffA = RowVectorXcd::Zero(m_iFFTlength);
157  fft.fwd(m_dFFTCoeffA,t_coeffAzeroPad);
158 }
159 
160 
161 //*************************************************************************************************************
162 
163 RowVectorXd FilterOperator::applyFFTFilter(const RowVectorXd& data) const
164 {
165  //Zero pad in front and back
166  RowVectorXd t_dataZeroPad = RowVectorXd::Zero(m_iFFTlength);
167  t_dataZeroPad.segment(m_iFFTlength/4-m_iFilterOrder/2, data.cols()) = data;
168 
169  //generate fft object
170  Eigen::FFT<double> fft;
171  fft.SetFlag(fft.HalfSpectrum);
172 
173  //fft-transform data sequence
174  RowVectorXcd t_freqData;
175  fft.fwd(t_freqData,t_dataZeroPad);
176 
177  //perform frequency-domain filtering
178  RowVectorXcd t_filteredFreq = m_dFFTCoeffA.array()*t_freqData.array();
179 
180  //inverse-FFT
181  RowVectorXd t_filteredTime;
182  fft.inv(t_filteredTime,t_filteredFreq);
183 
184  //Return filtered data still with zeros at front and end
185  return t_filteredTime;
186 }
The FilterOperator class represents a derived class from an arbitrary MNEOperator class object...
RowVectorXcd m_dFFTCoeffA
Definition: cosinefilter.h:125
RowVectorXd applyFFTFilter(const RowVectorXd &data) const
Creates a cosine filter response in the frequency domain.
Definition: cosinefilter.h:99