01-08-2023
Фильтр с конечной импульсной характеристикой (Нерекурсивный фильтр, КИХ-фильтр) или FIR-фильтр (FIR сокр. от finite impulse response — конечная импульсная характеристика) — один из видов линейных цифровых фильтров, характерной особенностью которого является ограниченность по времени его импульсной характеристики (с какого-то момента времени она становится точно равной нулю). Такой фильтр называют ещё нерекурсивным из-за отсутствия обратной связи. Знаменатель передаточной функции такого фильтра — некая константа.
Содержание |
Разностное уравнение, описывающее связь между входным и выходным сигналами фильтра: где — порядок фильтра, — входной сигнал, — выходной сигнал, а — коэффициенты фильтра. Иными словами, значение любого отсчета выходного сигнала определяется суммой масштабированных значений предыдущих отсчетов. Можно сказать иначе: значение выхода фильтра в любой момент времени есть значение отклика на мгновенное значение входа и сумма всех постепенно затухающих откликов предыдущих отсчетов сигнала, которые всё ещё оказывают влияние на выход (после -отсчетов импульсная переходная функция становится равной нулю, как уже было сказано, поэтому все члены после -го тоже станут равными нулю). Запишем предыдущее уравнение в более ёмком виде:
Для того, чтобы найти ядро фильтра положим
где — дельта-функция. Тогда импульсная характеристика КИХ-фильтра может быть записана как:
Z-преобразование импульсной характеристики даёт нам передаточную функцию КИХ-фильтра:
КИХ-фильтр обладает рядом полезных свойств, из-за которых он иногда более предпочтителен в использовании, чем БИХ-фильтр. Вот некоторые из них:
КИХ фильтры могут быть реализованы с использованием трех элементов: умножитель, сумматор и блок задержки. Вариант, показанный на рисунке, есть прямая реализация КИХ-фильтров типа 1.
Ниже приведен пример программы КИХ-фильтра, написанный на C :
/* КИХ Фильтр на 128 отводов */ float fir_filter(float input) { int i; static float sample[128]; float acc; float output; sample[0] = input; acc = 0.0f; /* Аккумулятор */ /* Умножение с накоплением */ for (i = 0; i < 128; i++) { acc += (h[i] * sample[i]); } /* Выход */ output = acc; /* Смещаем задержаный сигнал */ for (i = 127; i > 0; i--) sample[i] = sample[i - 1]; return output; }
Фильтр с конечной импульсной характеристикой.