Попробую про цифровые фильтры.

Aug 14, 2007 10:58

Без картинок, но с формулами. Но без выводов. ;)

Цифровые фильтры делятся на фильтры с конечной импульсной характеристикой и бесконечной импульсной характеристикой, КИХ (FIR, finite impulse response) и БИХ (IIR, infinite impulse response). Кстати, у аналоговых фильтров такое же деление, по-моему. "Импульсная характеристика" - это реакция на единичный входной импульс i(t)= floor(t)==0?1:0.

Как они считаются:
КИХ: yi=Σj=0Najxi-j,
БИХ:yi=Σj=0Najxi-j+Σj=1Mbjyi-j, где xi - входные, а yi - выходные отсчеты.

У БИХ присутствует обратная связь и, в идеале, любое входное воздействие (да-да, в виде импульса) будет влиять на все последующие за ним выходные отсчеты. У КИХ обратной связи нет, они проще. Поэтому они и используются в обработке видео.

БИХ же используются в обработке звука, поскольку они могут обеспечить крутой завал в районе частоты среза (>10дб на октаву) и практически плоскую характеристику в районе пропускания, чего КИХ не умеют.

Для обоих типов фильтров можно переписать отношение в виде функции отклика H(z), где z - комплексное число, лежащее на единичной окружности: z(t)=ei2πt. Нас будет интересовать только z(t) для t в промежутке 0..0.5, t - это множитель для частоты дискретизации, а в указанном промежутке лежат представимые по теореме Котельникова частоты.

Так вот, для БИХ H(z)=Σaizi/(1-Σbizi).

Для КИХ, соответственно, H(z)=Σaizi.

Строгое правило: для БИХ нули полинома (1-Σbizi) zk (они же полюсы H(z)) должны лежать строго внутри единичного круга, иначе фильтр будет усиливать свои собственные колебания. А вот нули полинома Σaizi могут лежать где угодно, но обычно фильтры проектируют так, чтобы |zk|=1. Так проще.

Вот.

Коэффициенты ai и bi должны быть действительными числами, поэтому, в общем случае, для каждого нуля zk имеется сопряженный к нему zk+1=zk*. Исключений немного: для полюсов БИХ это значений, лежащие на действительной оси, для нулей фильтров обоих типов это 1 и -1.

Амплитудно-частотная характеристика считается так через вычисление модуля H(z): АЧХ(f)=|H(z(f/fдискр))|. Фазово-частотная характеристика - это график arg(H(z(f/fдискр))).

Еще раз вот.

Теперь можно собирать свои собственные фильтры путем подбора коэффициентов. ;)

Кстати. Вот фильтр: z0+z1. Его нуль находит в районе -1, t=f/fдискр=0.5. Он не будет пропускать частоту fдискр/2. А другой фильтр z0-z1 не будет пропускать частоту 0. Вот вам и 1) фильтр низких частот и 2) фильтр высоких частот. ;)

Кстати, я думаю применить эту технику для фильтров при изменении частоты дискретизации изображений, точнее, при их сжатии. Мне надо пропустить низкие частоты, задавив высокие, но не совсем, а чтобы не сильно мешались, не вносили большой ошибки по сравнению с основным сигналом. Поэтому я думаю, что можно будет использовать фильтры с нулями z=-x, x >=1. При этом для уменьшения вдвое x=1, а чем меньше мы уменьшаем, чем дальше отодвигаем x. Надо только усиление скомпенсировать, но это делается путем умножения всех коэффициентов полинома на масштабирующий коэффициент.

Как-то так.

Ссылки по теме: Numerical recipes in C, особенно 13.5Digital Filtering in the Time Domain.

цифровые фильтры

Previous post Next post
Up