В случае конечная импульсная характеристика возможно спроектировать линейные фазовые фильтры, которые при применении к данным (с помощью filter
или conv
), просто задержка выхода на фиксированное количество выборок. Однако для БИХ фильтров фазы искажение обычно сильно нелинейно. The 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);
Теперь создайте фильтр lowpass 6-го порядка Баттерворта, чтобы отфильтровать высокочастотную синусоиду. Фильтрация 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
отличаются. The filtfilt
линия находится в фазе с исходной синусоидой 3 Гц, в то время как filter
линия задерживается. The filter
линия показывает переходный процесс в ранние моменты времени. filtfilt
уменьшает переходные процессы запуска фильтра путем тщательного выбора начальных условий и путем предварительного включения в последовательность входа короткой отраженной части последовательности входа.
Для наилучших результатов убедитесь, что последовательность, которую вы фильтруете, имеет длину, по крайней мере, три раза большую, чем порядок фильтра, и сужается к нулю на обоих ребрах.