Строю цифровой фильтр 2-го порядка по этому руководству:
http://yehar.com/blog/?p=121 (начиная с заголовка "From poles and zeros to filter coefficients")
Уравнение его такое:
где in(t) и out(t) - входные и выходные сигналы соответственно. Автор пишет, что любой фильтр 2-го порядка можно записать таким образом.
Передаточная функция:
,
где z - частота в виде комплексного числа.
- позиции двух сопряжённых "нулей", где фильтр подавляет частоты
- позиции двух сопряжённых "пиков" где фильтр подчёркивает частоты.
Мне нужен фильтр низких частот. Он имеет следующую схему:
(
- частота дискретизации, соответственно,
- частота Найквиста)
Код:
__---|---__ два совпадающих нуля на (-1;0)
_/ | \_
/ | x \ Пик и его сопряжённая пара на:
| | | (px=r*cos(2pi f/SR); py=r*sin(2pi f/SR)), где r-расстояние пика от центра единичного круга, f - частота среза фильтра
-o--------+--------|-
| | | использую в нормализации 0 Гц.
\_ | x _/
\__ | __/
---|---
Значит,
Подставив и преобразовав, получил такое:
Автор упомянутого блога в статье разбирает похожий пример, только он делает фильтр без "нулей", и в числителе у него только
. Он предлагает дальше сделать так:
"Давайте посмотрим на знаменатель.
Пусть (помножим на )
Коэффициенты при разных степенях z - это на самом деле коэффициенты к выходу фильтра:
"Вопрос 1: откуда он это взял? (его фильтр работает, ошибок нет, я потестил)
Но у меня ещё есть чиститель. По аналогии я беру числитель:
, умножаю на
:
.
Значит, коэффициенты ко входным значениям будут:
,
,
, и я могу переписать уравнение (1) так:
?
Теперь надо сделать нормализацию, т.е. найти
. Для фильтра низких частот она вроде как делается по 0Гц, то есть
Поскольку
,
,
.
Выше мы нашли:
Подставляем в наше уравнение:
Вопрос 2: Нифига не работает. Кто видит ошибку?