Являются ли БИХ-фильтры (и особенно фильтр Баттерворта) причиной?
Я новичок в обработке сигналов. Сейчас я изучаю фильтрацию, и я пытаюсь реализовать фильтр высоких частот (HPF), а затем и полосовой фильтр (BPF). Я реализую фильтры Python 3.8
с помощью NumPy
и SciPy
.
Для случая автономной работы (фильтрация заранее записанного времени) я разработал фильтр верхних частот Баттерворта и применил его к сигналу во временной области с помощью signal.filtfilt
функции. Однако, как показывает документация, этот подход хорош только для автономных случаев, а не для реального времени, поскольку фильтр сканирует сигнал вперед, а затем назад. Я могу восстановить частотную характеристику фильтра с помощью signal.freqz
функции.
Теперь я хочу, чтобы этот фильтр работал также в реальном времени (поэтому он должен быть причинным, и я спрашиваю, возможно ли это для этого типа фильтров. Вот мои вопросы:
- Если я правильно понимаю, фильтры Баттерворта - это фильтры с БИХ-характеристикой (бесконечной импульсной характеристикой). Это правда?
- Является ли БИХ-фильтр причиной? Может случиться так, что все БИХ-фильтры не являются причинными, и может быть, что некоторые из них, а некоторые нет. В каких случаях БИХ-фильтры являются причинными?
- Причинны ли фильтры Баттерворта? Если не всегда, то в каком случае они причинны?
- Если ответ на 3 верен, как реализовать причинный фильтр Баттерворта как во временной, так и в частотной областях? (Я могу использовать
SciPy
такие функции, какsignal.butter
иsignal.freqz
т. Д.)
Соответствующие ссылки:
- Помогите разработать фильтр Баттерворта
- filterfilt: https://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.filtfilt.html
Спасибо.
Ответы
- Да, Баттерворт - это IIR. Технически распад от импульса длится вечно.
- Да, все [реализуемые] IIR являются причинными.
- Да, из-за №1 и №2.
- Не используйте signal.filtfilt. Используйте signal.lfilter.
filtfilt
делает то же самоеlfilter
, но дважды в противоположных направлениях, что превращает причинный фильтр в фильтр нулевой фазы.
Однако, как предполагает документация для обеих этих функций, для наиболее практического использования вместо этого вам следует использовать варианты SOS:
Для большинства задач фильтрации предпочтительнее
sosfilt
использовать функцию (и использование конструкции фильтраoutput='sos'
)lfilter
, поскольку в секциях второго порядка меньше числовых проблем.
Подводя итог функциям:
- lfilter: Причинная одноступенчатая фильтрация (только нижние порядки)
- filtfilt: Одноступенчатая фильтрация с нулевой фазой (только младшие разряды)
- sosfilt: Каузальная фильтрация секций второго порядка
- sosfiltfilt: Фильтрация сечений второго порядка в нулевой фазе
На самом деле единственная причина использовать lfilter
или filtfilt
- если ваши коэффициенты уже в b, a
формате, если вы реализуете что-то из учебника и т. Д.
Если вы сами разрабатываете фильтр, просто используйте форму SOS, которая уменьшает числовую ошибку.
Обратите внимание, что filtfilt
функции применяют фильтр дважды, поэтому его порядок будет в два раза больше, чем у исходного фильтра.
Является ли БИХ-фильтр причиной? Может случиться так, что все БИХ-фильтры не являются причинными, и может быть, что некоторые из них, а некоторые нет. В каких случаях БИХ-фильтры являются причинными?
Все настоящие БИХ-фильтры являются причинными. Все реальные системы причинны, если только Вселенная не намного страннее, чем кажется.
Вы можете определить фильтр, который действует на будущую информацию; то есть вы могли бы сказать это$y_n = 0.9 y_{n+1} + x_n$. Это могло бы (с большим количеством слов, чтобы преодолеть скептицизм читателя) описал бы фильтр, импульсная характеристика которого$$h_\kappa = \begin{cases} 0 & \kappa > 0 \\ 0.9^{-\kappa} & \kappa \le 0 \end{cases}$$
Однако реализовать такой фильтр в реальной жизни невозможно.