Я видел в SO-потоке предложение использовать filtfilt
вместо него обратную / прямую фильтрацию lfilter
.
Какова мотивация использовать один метод против другого?
Я видел в SO-потоке предложение использовать filtfilt
вместо него обратную / прямую фильтрацию lfilter
.
Какова мотивация использовать один метод против другого?
filtfilt
делает один и тот же фильтр дважды, в противоположных направлениях, так что он не медленнее, чемlfilter
дважды в одном направлении, что позволяет получить одинаковую частотную характеристику.Ответы:
filtfilt
это фильтрация нулевой фазы, которая не сдвигает сигнал при его фильтрации. Поскольку фаза равна нулю на всех частотах, она также является линейной фазой. Фильтрация во времени требует от вас предсказания будущего, поэтому его нельзя использовать в реальных онлайн-приложениях, только для автономной обработки записей сигналов.lfilter
только причинно-следственная фильтрация, аналогичная реальной электронной фильтрации. Это не может быть нулевой фазой. Это может быть линейно-фазовая (симметричная КИХ), но обычно это не так. Обычно это добавляет разные величины задержки на разных частотах.Пример и изображение должны сделать это очевидным. Хотя величина частотной характеристики фильтров одинакова (вверху слева и вверху справа), низкочастотный диапазон нижних частот совпадает с исходным сигналом, только без высокочастотного содержимого, в то время как минимальная фазовая фильтрация задерживает сигнал причинно-следственной связью. :
источник
lfilter
не обязательно минимальная фаза, это может быть что угодно в зависимости от коэффициентов фильтра, но в любом случае это причинно-следственная связь , аfiltfilt
это не так. Таким образом, результат сравнения, которыйfiltfilt
имеет нулевую задержку иlfilter
всегда добавляет некоторую задержку, не совсем верен, поскольку неfiltfilt
является причинно-следственной, во-первых. Что на самом деле имеет значение, так это то,filtfilt
что не вызывает никаких фазовых искажений, тогда какlfilter
делает (если только он не используется в качестве линейного фазового КИХ-фильтра, т.е. с знаменателем = 1).filtfilt
соответствует фильтрации с (2N-1) -го порядка сlfilter
.lfilter
илиfiltfilt
. Они ведут себя по-разному, как показаноОтвет @endolith полный и правильный! Пожалуйста, сначала прочитайте его пост, а затем этот в дополнение к нему. Из-за моей низкой репутации я не смог ответить на комментарии, в которых @Thomas Arildsen и @endolith утверждают об эффективном порядке фильтра, полученного
filtfilt
:lfilter
действительно применяет данный фильтр, и в пространстве Фурье это похоже на применение функции передачи фильтра ONCE.filtfilt
примените один и тот же фильтр дважды, и эффект будет аналогичен применению передаточной функции фильтра SQUARED. В случае фильтра Баттерворта (scipy.signal.butter
) с передаточной функциейэффективный выигрыш будет
и это не может быть истолковано как фильтр Баттерворта или порядка2 n - 12n 2n−1
источник