Являются ли БИХ-фильтры (и особенно фильтр Баттерворта) причиной?

Aug 19 2020

Я новичок в обработке сигналов. Сейчас я изучаю фильтрацию, и я пытаюсь реализовать фильтр высоких частот (HPF), а затем и полосовой фильтр (BPF). Я реализую фильтры Python 3.8с помощью NumPyи SciPy.

Для случая автономной работы (фильтрация заранее записанного времени) я разработал фильтр верхних частот Баттерворта и применил его к сигналу во временной области с помощью signal.filtfiltфункции. Однако, как показывает документация, этот подход хорош только для автономных случаев, а не для реального времени, поскольку фильтр сканирует сигнал вперед, а затем назад. Я могу восстановить частотную характеристику фильтра с помощью signal.freqzфункции.

Теперь я хочу, чтобы этот фильтр работал также в реальном времени (поэтому он должен быть причинным, и я спрашиваю, возможно ли это для этого типа фильтров. Вот мои вопросы:

  1. Если я правильно понимаю, фильтры Баттерворта - это фильтры с БИХ-характеристикой (бесконечной импульсной характеристикой). Это правда?
  2. Является ли БИХ-фильтр причиной? Может случиться так, что все БИХ-фильтры не являются причинными, и может быть, что некоторые из них, а некоторые нет. В каких случаях БИХ-фильтры являются причинными?
  3. Причинны ли фильтры Баттерворта? Если не всегда, то в каком случае они причинны?
  4. Если ответ на 3 верен, как реализовать причинный фильтр Баттерворта как во временной, так и в частотной областях? (Я могу использовать SciPyтакие функции, как signal.butterи signal.freqzт. Д.)

Соответствующие ссылки:

  • Помогите разработать фильтр Баттерворта
  • filterfilt: https://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.filtfilt.html

Спасибо.

Ответы

7 endolith Aug 19 2020 at 13:49
  1. Да, Баттерворт - это IIR. Технически распад от импульса длится вечно.
  2. Да, все [реализуемые] IIR являются причинными.
  3. Да, из-за №1 и №2.
  4. Не используйте signal.filtfilt. Используйте signal.lfilter. filtfiltделает то же самое lfilter, но дважды в противоположных направлениях, что превращает причинный фильтр в фильтр нулевой фазы.

Однако, как предполагает документация для обеих этих функций, для наиболее практического использования вместо этого вам следует использовать варианты SOS:

Для большинства задач фильтрации предпочтительнее sosfiltиспользовать функцию (и использование конструкции фильтра output='sos') lfilter, поскольку в секциях второго порядка меньше числовых проблем.

Подводя итог функциям:

  • lfilter: Причинная одноступенчатая фильтрация (только нижние порядки)
  • filtfilt: Одноступенчатая фильтрация с нулевой фазой (только младшие разряды)
  • sosfilt: Каузальная фильтрация секций второго порядка
  • sosfiltfilt: Фильтрация сечений второго порядка в нулевой фазе

На самом деле единственная причина использовать lfilterили filtfilt- если ваши коэффициенты уже в b, aформате, если вы реализуете что-то из учебника и т. Д.

Если вы сами разрабатываете фильтр, просто используйте форму SOS, которая уменьшает числовую ошибку.

Обратите внимание, что filtfiltфункции применяют фильтр дважды, поэтому его порядок будет в два раза больше, чем у исходного фильтра.

1 TimWescott Aug 19 2020 at 16:17

Является ли БИХ-фильтр причиной? Может случиться так, что все БИХ-фильтры не являются причинными, и может быть, что некоторые из них, а некоторые нет. В каких случаях БИХ-фильтры являются причинными?

Все настоящие БИХ-фильтры являются причинными. Все реальные системы причинны, если только Вселенная не намного страннее, чем кажется.

Вы можете определить фильтр, который действует на будущую информацию; то есть вы могли бы сказать это$y_n = 0.9 y_{n+1} + x_n$. Это могло бы (с большим количеством слов, чтобы преодолеть скептицизм читателя) описал бы фильтр, импульсная характеристика которого$$h_\kappa = \begin{cases} 0 & \kappa > 0 \\ 0.9^{-\kappa} & \kappa \le 0 \end{cases}$$

Однако реализовать такой фильтр в реальной жизни невозможно.