Как построить полосовой фильтр в Matlab с помощью функции butter? - PullRequest
0 голосов
/ 22 апреля 2020

Я пытаюсь извлечь значения подавления мю из моего набора данных ЭЭГ, который не позволяет использовать EEGLab. Я сделал большинство шагов, но мне нужно добавить полосовой фильтр, и я не уверен, как.

Частотный диапазон, который мне нужен, составляет 8-13, моя частота дискретизации равна 1000, и мне сказали, что я буду нужен порядок от 8 до 10.

В документации MATLAB приведен следующий пример:

[A,B,C,D] = butter(10,[500 560]/750); 
d = designfilt('bandpassiir','FilterOrder',20, ... 'HalfPowerFrequency1',500,'HalfPowerFrequency2',560, ... 'SampleRate',1500);

Однако я не уверен, какие параметры мне нужно использовать для моего случая, кроме выборки Оценить и порядок фильтрации. Кроме того, мне не ясно, что такое [A, B, C, D]. Буду признателен за любой вклад.

1 Ответ

1 голос
/ 23 апреля 2020

Я обычно go над самими отдельными функциями - вы немного перепутали. Первый вход в butter уже является порядком фильтра (поэтому вы указали порядок 10 и попытались указать порядок 20 в функции desginfilt ...). Для фильтра Баттерворта компания MATLAB рекомендует использовать формулировку усиления с нулевым полюсом, а не стандартные коэффициенты a - b. Вот пример:

f_low = 100; % Hz
f_high = 500; % Hz
f_sampling = 10e3; % 10kHz

assert(f_low < f_high)


f_nrm_low   = f_low /(f_sampling/2);
f_nrm_high  = f_heigh /(f_sampling/2);

% determine filter coefficients:
[z,p,k] = butter(4,[f_nrm_low f_nrm_high],'bandpass');
% convert to zero-pole-gain filter parameter (recommended)
sos = zp2sos(z,p,k); 
% apply filter
sig_flt = sosfilt(sos,sig);

Я заполнил стандартными значениями из моей области работы. 4-й порядок - это абсолютный стандарт. В вашем случае вы просто go с

f_low = 200; % Hz
f_high = 213; % Hz
f_sampling = 1000; % 1kHz

f_nrm_low   = f_low /(f_sampling/2);
f_nrm_high  = f_heigh /(f_sampling/2);

% determine filter coefficients:
[z,p,k] = butter(15,[f_nrm_low f_nrm_high],'bandpass');

PS: тип 'bandpath' не требуется, так как функция знает об этом, если вы указываете массив в качестве ввода ;)

...