Без картинок, но с формулами. Но без выводов. ;)
Цифровые фильтры делятся на фильтры с конечной импульсной характеристикой и бесконечной импульсной характеристикой, КИХ (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.