В случае КИХ-фильтров возможно разработать линейные фильтры фазы, которые, когда применился к данным (использующий filter
или conv
), просто задерживают вывод постоянным числом выборок. Для БИХ-фильтров, однако, искажение фазы обычно очень нелинейно. Функция filtfilt
использует информацию в сигнале в точках до и после текущей точки, в сущности "изучая будущее", устранить искажение фазы.
Чтобы видеть, как filtfilt
делает это, вспомните что если Z-преобразование действительной последовательности , затем Z-преобразование инвертированной временем последовательности . Рассмотрите следующую схему обработки:
Когда , это , вывод уменьшает до . Учитывая все выборки последовательности , вдвойне отфильтрованная версия это имеет искажение нулевой фазы, возможно.
Например, 1 второй сигнал длительности, выбранный на уровне 100 Гц, состоявших из двух синусоидальных компонентов на уровне 3 Гц и 40 Гц,
fs = 100; t = 0:1/fs:1; x = sin(2*pi*t*3)+.25*sin(2*pi*t*40);
Теперь создайте 6-й порядок Баттерворт lowpass фильтр, чтобы отфильтровать высокочастотную синусоиду. Отфильтруйте x
с помощью и filter
и filtfilt
для сравнения:
[b,a] = butter(6,20/(fs/2)); y = filtfilt(b,a,x); yy = filter(b,a,x); plot(t,x,t,y,t,yy) legend('Original','filtfilt','filter')
Обе отфильтрованных версии устраняют синусоиду на 40 Гц, очевидную в исходном сигнале. График также показывает, как filter
и filtfilt
отличаются. Строка filtfilt
совпадает с исходной синусоидой на 3 Гц, в то время как строка filter
задерживается. Строка filter
показывает переходному процессу в прежние времена. filtfilt
уменьшает переходные процессы запуска фильтра путем тщательного выбора начальных условий, и путем предварительного ожидания на вход упорядочивают короткую, отраженную часть входной последовательности.
Для лучших результатов убедитесь последовательность, которую вы фильтруете, имеет длину по крайней мере три раза порядок фильтра и заострения, чтобы обнулить на обоих ребрах.