[Eeglablist] causal bandpassfilter with very low cutoff
ksherbst at googlemail.com
Wed Aug 8 06:58:57 PDT 2012
thank you for your very helpful comments. Andreas, I was trying to
implement your suggestion but can't quite get it to work.
After low-pass filtering (30Hz), downsampling (128Hz), the butterworth
filter you suggested transforms large parts of the data into NaNs.
I think it might already go wrong with the low-pass filter. Do you have a
suggestion what to use here? It should also be causal, so I tried both
iirfilt and butter but apparently I was not able to put together the right
combination of parameters.
Sorry for being so ignorant but my understanding of filtering is at a very
On Wed, Aug 8, 2012 at 12:13 PM, Andreas Widmann <widmann at uni-leipzig.de>wrote:
> Sophie asked for a *causal* filter. IIR is an appropriate filter type for
> this purpose. Using a linear phase FIR filter, as suggested, one will
> introduce a long filter delay. Using a minimum-phase FIR filter one will
> loose linear phase anyway. Thus, it is reasonable to use IIR as the filter
> delay is usually considerably smaller than for minimum-phase FIR in this
> type of application. (I have a slight preference for Butterworth due to its
> good (flat) frequency response in the passband.)
> See also recent contribution on causal filtering by Rousselet:
> and my short comment (mainly focused on why one should not use the EEGLAB
> Basic FIR filter)
> Am 08.08.2012 um 10:17 schrieb Davide Baldo <davidebaldo84 at gmail.com>:
> > Hi!
> > I don't understand why to use a IIR filter. They always cause some
> (phase) distorsion.
> > I suggest you to use a FIR filter. If you use Matlab, just type
> "fdatool" (Filter design & analysis tool). Than select: High pass and FIR
> (Equiripple). Set the Srate to 512 and the Fstop to 0.01. You did not
> specfied which frequencies you do not want to distort. I guess you could
> set Fpass to 0.5 Hz (all frequencies higher than 0.5 Hz won't be modified).
> Then set Dstop to 0.0005 and Dpass to 0.01.
> > Now you can click on Design Filter. When done...click on File -> Export
> (It export the filter on Matlab workspace). Set Numerator to "HP_Filter"
> (it s just a name for the filter).
> > Now you are ready to filter your data:
> > HP_Delay = round( mean(grpdelay(HP_filter)) ); % a FIR filter
> introduces a delay in the signal. you need to compensate it.
> > HP_Data = filter( HP_filter, 1, your_data ) ; % Filter the data
> > HP_Data = circshift( HP_Data , [1 -HP_Delay] ); %compensate the
> delay introduced by the HP filter
> > I hope it helps you.
> > Ciao!
> > Davide.
> > On Mon, Aug 6, 2012 at 6:38 PM, Andreas Widmann <widmann at uni-leipzig.de>
> > Hi Sophie,
> > a 0.01 Hz highpass filter with 512 Hz sampling frequency is very
> extreme. My personal rule of thumb is that the srate / cutoff ratio for IIR
> highpass filtering should not be much higher than ~1000 (acknowledgement to
> BM). The problem is increased by the EEGLAB default estimation of required
> filter order by a very narrow transition band (defined as cutoff/3 in your
> case; the help text in pop_iirfilt is wrong!). The extreme filter cutoff
> with narrow transition band requires a high filter order (here 6), but the
> resulting 6th order filter is instable.
> > I would suggest first downsampling the data to an as low as possible
> sampling frequency (after lowpass filtering the data to 1/4-1/5 of new
> sampling frequency!).
> > Then, I would suggest filtering the data with a butterworth filter at
> 0.1 Hz cutoff frequency. Roll-off is a function of filter order (approx.
> order times -6dB/octave).
> > E.g.:
> > >> [b, a] = butter(4, 0.1 / (srate / 2), 'high')
> > for a forth order filter.
> > Check frequency response with
> > >> freqz(b, a, 2^14, srate)
> > At 256 Hertz this gives a reasonable frequency response and very good DC
> attenuation. Downsampling your data to 128 Hz you can use the same filter
> for a 0.05 Hz highpass.
> > Check filter stability with
> > >> zplane(b, a)
> > All poles should be inside the unit circle. If you test the 6th order
> butterworth filter you will see that also this filter is instable.
> > Causal filtering can be done easily on the command line using the MATLAB
> built in filter function. Take care not to filter across boundaries/DC
> offsets! Filter each segment separately.
> > Hope this helps, best,
> > Andreas
> > Am 06.08.2012 um 17:44 schrieb Sophie Herbst <ksherbst at googlemail.com>:
> > > Hi EEGlablist,
> > >
> > > I am trying to apply a causal bandpass filter with a very low cutoff
> (0.01Hz) to my EEG data (continuos data with ~2,700,000 points, srate =
> > > by using iirfilt.m:
> > >
> > > iirfilt(EEG.data, EEG.srate, 0.01, 40, 0, 0, 0, , , 'on')
> > >
> > > I seem to run into similar problems as described in EEGLAB Bug #1011:
> the default values for transition bandwidth and passband/ stopband ripple
> do not seem to work as
> > > the filter runs but leaves a matrix of NaNs.
> > >
> > > I have been playing around with values for the transition bandwidth
> etc, but I could not get a satisfying frequency response.
> > > Any idea why this is and which filter would be better to use?
> > >
> > > Thanks a lot,
> > > Sophie
> > _______________________________________________
> > Eeglablist page: http://sccn.ucsd.edu/eeglab/eeglabmail.html
> > To unsubscribe, send an empty email to
> eeglablist-unsubscribe at sccn.ucsd.edu
> > For digest mode, send an email with the subject "set digest mime" to
> eeglablist-request at sccn.ucsd.edu
-------------- next part --------------
An HTML attachment was scrubbed...
More information about the eeglablist