Реализация цифрового фильтра - через свертку или разностное уравнение? - PullRequest
3 голосов
/ 07 декабря 2011

Я очень опытный инженер-программист, и я взял несколько уроков EE в колледже. Я программирую на iPhone и Android и хочу использовать цифровые фильтры (например, нижний, полосовой, полосовой и т. Д.) Для данных микрофона и акселерометра в реальном времени.

Я знаю, что существует множество эквивалентных способов реализации цифрового фильтра в окне выборок во временной области. Я смотрю на два подхода:

  1. Реализация разностного уравнения непосредственно в коде C / Java (например, y [i] = y [i-1] + 2 * x [i]). Я считаю, что это может быть выполнено в O (N) время, где N - длина окна выборки, например N = 512.

  2. Реализация свертки между образцом окна и представление КИХ-фильтра во временной области, обычно в некоторой форме функция. Я задал этот вопрос некоторое время назад. Это можно сделать за O (N LG N) если вы используете быструю свертку с участием БПФ и IFFT.

Теперь, прочитав различные онлайн-ресурсы, я обнаружил, что предпочтительный, общепринятый подход для программирования на C / Java - это (1) выше, реализующий уравнение разностей. Это правильный вывод?

Вот что я нашел:

  • Фильтр акселерометра Apple код реализует разницу уравнение.

  • Этот вопрос Stackoverflow Как реализовать фильтр LowPass? предлагает использовать разницу уравнение.

  • В статье Википедии о фильтре нижних частот представлен алгоритм используя разностное уравнение.

Итак, в общем, мои вопросы на самом деле:

  1. Является ли реализация разностного уравнения (а не посредством быстрой свертки) способом написания фильтров в C / Java?

  2. Ни в одной из приведенных выше ссылок не говорится, как составить разностное уравнение с учетом конкретных частот отсечки или частот остановки полосы. Я знаю, что изучал это некоторое время назад. Есть ли какие-либо ссылки на фильтры для программистов с такой информацией?

Ответы [ 3 ]

3 голосов
/ 07 декабря 2011

Уравнение разности во временной области равно свертке.Что вы думаете о подходе на основе FFT, так это свертка в частотной области или быстрая свертка , которая на самом деле просто оптимизация производительности - она ​​математически эквивалентна свертке во временной области.Обычно прямая свертка во временной области быстрее при малых длинах фильтра, в то время как подход в частотной области выигрывает при большой длине фильтра.Как правило, для 1D-фильтрации «большой» означает, скажем, N> 50.

В приведенном выше абзаце речь идет только о КИХ-фильтрах.Для БИХ-фильтров свертка в частотной области не является опцией (если вы не усекаете импульсную характеристику в некоторой произвольной точке), но обычно БИХ-фильтры, как правило, относительно короткие по сравнению с КИХ-фильтрами.т. е. дизайн фильтр) вы обычно начинаете со спецификации фильтра, а затем используете один из множества существующих пакетов программного обеспечения для генерации коэффициентов.Вы можете реализовать свою собственную процедуру проектирования фильтров, если действительно хотите - посмотрите на алгоритмы, такие как Remez exchange .

3 голосов
/ 08 декабря 2011

БИХ-фильтры низкого порядка (с использованием уравнений с короткими разностями) могут быть вычислительно намного быстрее, чем свертка РПИ или быстрая свертка с использованием БПФ, если они соответствуют спецификации вашего фильтра.Они также похожи на аналоговые фильтры с низким числом компонентов, с которыми разработчик схемы может быть знаком.

Если у вас нет сложной спецификации или требования к фильтру (которое не может быть достаточно близко аппроксимировано при небольшом числе полюсов и нулей), зачем сжигать больше циклов ЦП на КИХ или БПФ?Но если вам нужен более специализированный фильтр, тогда вам нужно.

Вот очень часто используемый рецепт для определения коэффициентов БИХ для биквад .Фильтры biquad IIR также могут быть каскадными для фильтрации более высокого порядка.

0 голосов
/ 07 декабря 2011

Я поддержу предложение использовать традиционные цифровые фильтры во временной области, т. Е. Использовать задержки, сумматоры и множители. Для простой фильтрации в реальном времени этот подход, вероятно, быстрее и менее сложен.

Использование БПФ в приложениях реального времени прекрасно в зависимости от цели. Например, если вы хотите выполнять спектральный анализ в режиме реального времени (скажем, для задачи машинного обучения с использованием звука), тогда БПФ работают хорошо, потому что они быстрые, простые и могут давать высокое спектральное разрешение.

Ваш комментарий верен в отношении FIR vs. IIR. Если вы дадите некоторые (примерные) спецификации фильтров, то мы сможем оказать вам дополнительную помощь в отношении того, какой тип фильтра выбрать и как определить ответвления фильтра (то есть коэффициенты). Например, если у вас есть доступ к Matlab или Python-Scipy, вы можете использовать их для разработки своих фильтров.

(Ознакомьтесь с dsp.stackexchange , чтобы узнать больше об обработке сигналов.)

...