Непонятный эффект при использовании filtfilt

ЦОС, обработка видео и изображений в MATLAB\Simulink

Модератор: Admin

ida
Пользователь
Сообщения: 6
Зарегистрирован: Ср окт 25, 2017 11:03 am
Откуда: Днепропетровск

Непонятный эффект при использовании filtfilt

Сообщение ida » Ср окт 25, 2017 12:11 pm

Здравствуйте,

Изначально, для удаления постоянной составляющей и дрейфа нуля из сигнала использовал функцию filter:

Код: Выделить всё

Fs = 250;                    % Sampling frequency [Hz](samples per second)
FcHP = 0.5;                       % Cutoff frequency [Hz]
WcHP = 2 * FcHP / Fs;           % Cutoff frequency [relative units]
[bHP, aHP] = butter(2, WcHP, 'high');
Flt = filter(bHP, aHP, Raw);

(Почему используется именно фильтр Баттерворта, в данной ситуации, я думаю, не важно.)

Далее делаю БПФ и строю амплитудные спектры исходного и фильтрованного сигнала:

Код: Выделить всё

% Length of FFT
FFTLength = 250;       
% Frequencies of bins
f = Fs*(0:(FFTLength/2))/FFTLength;
% Raw
YRaw = fft(Raw, FFTLength);
PRaw = abs(YRaw/FFTLength);
% Filtered
YFlt = fft(Flt, FFTLength);
PFlt = abs(YFlt/FFTLength);
% Plotting FFT
figure;
hold on;
P = PRaw(1:FFTLength/2+1);
P(2:end-1) = 2*P(2:end-1);
stem(f, P, '-b');
P = PFlt(1:FFTLength/2+1);
P(2:end-1) = 2*P(2:end-1);
stem(f, P, '-r');
grid on;
grid minor;
legend('Raw', 'Flt');

Получаю результат: (С добавлением картинок, извиняюсь, лажа. Попробую на пальцах.) Результат абсолютно логичный - в спектре отфильтрованного сигнала амплитуда нулевого бина в несколько раз меньше чем в спектре исходного.
Перехожу к использованию функции filtfilt:

Код: Выделить всё

...
[bHP, aHP] = butter(1, WcHP, 'high');
Flt = filtfilt(bHP, aHP, Raw);
...

(Остальной код без изменений.)
Результат удивляет - в спектре отфильтрованного сигнала амплитуда нулевого бина в несколько раз больше чем в спектре исходного (равно как и амплитуды ближайших к нему 3-4 бинов). При этом, результат фильтрации во временной области практически не отличается от результата при использовании функции filter (т.е. фильтрует).

Что является причиной разницы результатов в частотной области при использовании функций filter и filtfilt?

sandy
Эксперт
Сообщения: 5309
Зарегистрирован: Ср сен 22, 2004 4:49 pm

Re: Непонятный эффект при использовании filtfilt

Сообщение sandy » Ср окт 25, 2017 7:39 pm

Без картинок и без конкретного сигнала сложно что-то сказать. Проверил на произвольном сигнале, ничего подобного не увидел.

На всякий случай: а сигнал какой длины вы через этот фильтр пропускаете? Если он вдруг короткий (меньше, чем где-то 500 отсчетов), то вы установившегося состояния после функции filter особо не увидите, да и что сделает filtfilt с ее методами отсекания переходных процессов, тоже сложно предположить.
С уважением

Александр Сергиенко

ida
Пользователь
Сообщения: 6
Зарегистрирован: Ср окт 25, 2017 11:03 am
Откуда: Днепропетровск

Re: Непонятный эффект при использовании filtfilt

Сообщение ida » Ср окт 25, 2017 10:30 pm

sandy
Проблему с нехваткой примера сигнала и картинок попробую разрешить завтра. Сигнал длинный, порядка 7500 сэмплов.

ida
Пользователь
Сообщения: 6
Зарегистрирован: Ср окт 25, 2017 11:03 am
Откуда: Днепропетровск

Re: Непонятный эффект при использовании filtfilt

Сообщение ida » Ср окт 25, 2017 11:21 pm

sandy
Предпринял попытку сунуть тестовый сигнал и картинки с результатами во вложение (архив TestDataAndPctures.zip). Правда, не могу сразу понять, закончилась данная попытка успехом или провалом.

На всякий случай, код загружающий тестовый сигнал из файла:

Код: Выделить всё

% Open file dialog
[filename, pathname] = uigetfile( '*.csv', 'Select the ECG record', 'MultiSelect', 'off');
% File reading
record = csvread([pathname filename]);
% Raw ECG
ecgRaw = record(:,2);

ida
Пользователь
Сообщения: 6
Зарегистрирован: Ср окт 25, 2017 11:03 am
Откуда: Днепропетровск

Re: Непонятный эффект при использовании filtfilt

Сообщение ida » Чт окт 26, 2017 11:22 am

Ссылка на архив, содержащий тестовый сигнал и изображения спектров:
https://fex.net/#!527125239688

sandy
Эксперт
Сообщения: 5309
Зарегистрирован: Ср сен 22, 2004 4:49 pm

Re: Непонятный эффект при использовании filtfilt

Сообщение sandy » Пт окт 27, 2017 11:42 pm

Вы при построении спектра используете только 256 первых отсчетов сигнала. Посмотрите на графиках сигналов, как выглядит этот фрагмент после filter и как после filtfilt, и все поймете. Другой вопрос - почему он так выглядит после filtfilt. Дело в том, что эта функция для устранения задержки использует двунаправленную обработку сигнала фильтром, при этом применяются некоторые хитрости для устранения переходных процессов по краям. Вероятно, результатом этих хитростей в данном случае явился вот такой выброс.
С уважением



Александр Сергиенко

ida
Пользователь
Сообщения: 6
Зарегистрирован: Ср окт 25, 2017 11:03 am
Откуда: Днепропетровск

Re: Непонятный эффект при использовании filtfilt

Сообщение ida » Сб окт 28, 2017 8:06 pm

sandy
Вы правы. Я превратно истолковал параметр n функции fft. Решил что это ширина скользящего окна ПФ (не дочитал :oops: ).
После изменения значения данного параметра:

Код: Выделить всё

FFTLength = 2^nextpow2(length(Raw));

спектр после filtfilt выглядит вполне логично (хотя и заметно отличается от спектра после filter, но это и не удивительно).
Огромное спасибо!

И еще один сопутствующий вопрос.
В описании функции filtfilt сказано что она удваивает порядок фильтра заданного коэффициентами b и a. Правильно ли я поступаю, когда для фильтрации фильтром 2-го порядка, скармливаю функции filtfilt фильтр 1-го порядка с требуемой частотой среза? Или тут есть подводные камни?

sandy
Эксперт
Сообщения: 5309
Зарегистрирован: Ср сен 22, 2004 4:49 pm

Re: Непонятный эффект при использовании filtfilt

Сообщение sandy » Сб окт 28, 2017 9:10 pm

В описании функции filtfilt сказано что она удваивает порядок фильтра заданного коэффициентами b и a.

Фильтрация осуществляется два раза - сначала от начала сигнала к концу, потом от конца к началу. В результате эффективный порядок фильтра удваивается.
Правильно ли я поступаю, когда для фильтрации фильтром 2-го порядка, скармливаю функции filtfilt фильтр 1-го порядка с требуемой частотой среза? Или тут есть подводные камни?

Смотря что имеется в виду под "правильно". Двукратное применение фильтра Баттерворта первого порядка - это не то же самое, что однократное применение фильтра Баттерворта второго порядка.
С уважением



Александр Сергиенко

ida
Пользователь
Сообщения: 6
Зарегистрирован: Ср окт 25, 2017 11:03 am
Откуда: Днепропетровск

Re: Непонятный эффект при использовании filtfilt

Сообщение ida » Сб окт 28, 2017 9:47 pm

Двукратное применение фильтра Баттерворта первого порядка - это не то же самое, что однократное применение фильтра Баттерворта второго порядка

Нечто подобное я и подозревал. Спасибо.