[Eeglablist] causal bandpassfilter with very low cutoff

Makoto Miyakoshi mmiyakoshi at ucsd.edu
Thu Aug 9 11:50:49 PDT 2012


Dear Guillaume and Clemens,

> If you want to do the same procedure with IIR filters, you have to use
> the filtfiltHD function.

Actually I tested it with Clemens Brunner (who suggested fir1 instead
of firls, and now fir1 is the default). We confirmed two things.

1. EEGLAB's IIR filter plug-in uses filtfilt, so it is a zero-phase filter.
2. EEGLAB's filter option 'causal' does not use a minimum-phase
filter; this option does not preserve the rise onset, which is
discussed in Rousselet (2012) 'Does filtering preclude us from
studying ERP time-courses?'

I'm not a filter expert. Would you help me Clemens?

Makoto



2012/8/9 Guillaume Lio <guillaume.lio at isc.cnrs.fr>:
>
>
>
> Dear Davide,
>>> I don't understand why to use a IIR filter. They always cause some (phase) distorsion.
>> Is it true even with filtfilt?
>>
>> Makoto
>
> Causal filters always cause phase distortions.
> FIR filters cause linear phase distortions.
> IIR filters cause non-linear phase distortions.
>
> The filtfilt procedure makes filters not causal to produce zero-phase
> filters.
> But, the matlab built-in filtfilt fonction works only with FIR filters.
>
> If you want to do the same procedure with IIR filters, you have to use
> the filtfiltHD function.
> filtfiltHD function can be found here :
> http://www.mathworks.com/matlabcentral/fileexchange/17061-filtfilthd
>
> Hope this help.
>
> Guillaume Lio
>
>
>
>
>> 2012/8/8 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>
>>> wrote:
>>>> 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 =
>>>>> 512Hz)
>>>>> 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
>>>
>>>
>>> _______________________________________________
>>> 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
>>
>>
>
> _______________________________________________
> 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



-- 
Makoto Miyakoshi
JSPS Postdoctral Fellow for Research Abroad
Swartz Center for Computational Neuroscience
Institute for Neural Computation, University of California San Diego



More information about the eeglablist mailing list