Butterworth Filter

Hello, i wanted to filter my data using a IIR filter, a order 2 butterworth filter. raw.plot() aply a FIR filter so i’m using mne.filter.create_filter, but it’s not working. Can someone help me with this?
My code:

fname = 'C:\\Users\\hanna\\OneDrive\\Documentos\\Annotated_Data\\Paciente_24\\chb24_01_edited.edf'
raw=mne.io.read_raw_edf(fname, preload=True)
raw.set_eeg_reference()
raw.pick_channels(['F3-C3', 'C3-P3', 'F4-C4', 'C4-P4'])
data = raw.copy()
iir_params = dict(order=2, ftype='butter')
filt = mne.filter.create_filter(data, sfreq=256, l_freq=0.5, h_freq=40.0, method='iir', iir_params = iir_params, verbose=True)
Setting up band-pass filter from 0.5 - 40 Hz
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
~\AppData\Local\Temp\ipykernel_13152\3677571105.py in <cell line: 1>()
----> 1 filt = mne.filter.create_filter(data, sfreq=256, l_freq=0.5, h_freq=40.0, method='iir', iir_params = iir_params, verbose=True)

<decorator-gen-143> in create_filter(data, sfreq, l_freq, h_freq, filter_length, l_trans_bandwidth, h_trans_bandwidth, method, iir_params, phase, fir_window, fir_design, verbose)

~\mne-python\1.1.1_0\lib\site-packages\mne\filter.py in create_filter(data, sfreq, l_freq, h_freq, filter_length, l_trans_bandwidth, h_trans_bandwidth, method, iir_params, phase, fir_window, fir_design, verbose)
   1005                         % (l_freq, h_freq))
   1006             data, sfreq, f_p1, f_p2, f_s1, f_s2, filter_length, phase, \
-> 1007                 fir_window, fir_design = _triage_filter_params(
   1008                     data, sfreq, l_freq, h_freq, l_trans_bandwidth,
   1009                     h_trans_bandwidth, filter_length, method, phase,

~\mne-python\1.1.1_0\lib\site-packages\mne\filter.py in _triage_filter_params(x, sfreq, l_freq, h_freq, l_trans_bandwidth, h_trans_bandwidth, filter_length, method, phase, fir_window, fir_design, bands, reverse)
   1845     # If we have data supplied, do a sanity check
   1846     if x is not None:
-> 1847         x = _check_filterable(x)
   1848         len_x = x.shape[-1]
   1849         if method != 'fir':

~\mne-python\1.1.1_0\lib\site-packages\mne\filter.py in _check_filterable(x, kind, alternative)
   1384             pass
   1385         else:
-> 1386             raise TypeError(
   1387                 'This low-level function only operates on np.ndarray '
   1388                 f'instances. To get a {kind} {name} instance, use a method '

TypeError: This low-level function only operates on np.ndarray instances. To get a filtered RawEDF instance, use a method like `inst_new = inst.copy().filter(...)` instead.

The error message suggests

To get a filtered RawEDF instance, use a method like inst_new = inst.copy().filter(...)

did you try that? i.e.

data.filter(l_freq=0.5, h_freq=40.0, method='iir',
            iir_params=iir_params, verbose=True)

(I omitted the .copy() part of its suggestion since I see you already copied the data).

1 Like

It worked, thank you