K. Бих и ких фильтры
Еще один метод классификации фильтров основан на их импульсной характеристике. Импульсной характеристикой фильтра называется отклик фильтра на импульсный сигнал (x[0] =1 и x[i] = 0, при i 0), как показано на следующей иллюстрации. Фурье преобразование импульсной характеристики называется частотной характеристикой фильтра. Частотная характеристика фильтра говорит о том, каким будет коэффициент усиления фильтра на различных частотах. У идеального фильтра должно быть единичное усиление в полосе пропускания, и нулевое в полосе режекции. Таким образом, все частотные компоненты в полосе пропускания фильтра проходят без изменения, но частотных компонент, попадающих в полосу режекции фильтра, на его выходе нет.
Если импульсная характеристика фильтра спадает до нуля в течение конечного промежутка времени, то такой фильтр называют фильтром с конечной импульсной характеристикой (КИХ). Однако если импульсная характеристика фильтра существует бесконечно долго, то такой фильтр называют фильтром с бесконечной импульсной характеристикой (БИХ). Конечна ли импульсная характеристика фильтра или нет, зависит от того, как вычисляется выходной сигнал.
Основное различие между КИХ и БИХ фильтрами заключается в том, что для КИХ-фильтров выходной сигнал зависит только от текущих и прошедших входных значений, тогда как выходной сигнал БИХ-фильтра зависит не только от текущих и прошедших входных значений, но и от прошедших выходных значений сигнала.
В качестве примера представьте кассовый аппарат в магазине. Пусть x[k] – будет стоимость k–ой вещи, приобретаемой покупателем, где 1 < k < N, а N – общее число купленных вещей. Кассовый аппарат прибавляет стоимость каждой вещи для выдачи «текущей» суммы. Эта «текущая» сумма y[k] до k-й вещи определяется выражением
y[k] = x[k] + x[k–1] + x[k–2] + x[k–3] + . + x[1] (6-2а)
Таким образом, общая стоимость N вещей равна y[N]. Поскольку y[k] – общая стоимость до k-й вещи включительно, а y[k-1] – до (k-1)-й, то уравнение 6-2а можно переписать как
y[k] = y[k-1] + x[k] (6-2b)
Если же вы добавите налог с продаж в 8%, то уравнения 6-2а и 6-2b можно переписать так:
y[k] = 1.08x[k] + 1.08x[k-1] + 1.08x[k – 2] + 1.08x[k – 3] + . + 1.08x[1] (6-3а)
y[k] = y[k-1] + 1.08x[k] (6-3b)
Обратите внимание, что оба уравнения 6-3а и 6-3b идентичны в описании поведения кассового аппарата. Разница состоит лишь в том, что уравнение 6-3а выражено только через значения входных элементов, тогда как выражение 6-3b содержит как входные, так и выходные значения. Уравнение 6-3а называется нерекурсивным или КИХ реализацией. Уравнение 6-3b называется рекурсивным или БИХ реализацией.
Коэффициенты фильтров
В выражении 6-3а значение константы, умножаемой на каждый член, равно 1.08. В уравнении 6-3b множитель при слагаемом с y[k-1] равен 1, а при слагаемом с x[k] – 1.08. Эти постоянные множители называются коэффициентами фильтров. Для БИХ фильтра эти умножаемые на входные значения коэффициенты называются коэффициентами вперед, а умножаемые на выходные значения – коэффициентами назад.
Уравнения 6-2а, 6-2b, 6-3а и 6-3b, описывающие действие фильтра, называются разностными уравнениями.
Преимущества и недостатки КИХ и БИХ фильтров
Сравнивая КИХ и БИХ фильтры, можно заключить, что преимущество БИХ фильтров над КИХ фильтрами состоит в том, что БИХ фильтрам требуется меньшее число коэффициентов для выполнения схожих операций фильтрации. Таким образом, БИХ фильтры работают намного быстрее и не требуют дополнительной памяти, так как выполняются сразу же.
Недостаток БИХ фильтров состоит в том, что их фазо-частотная характеристика (ФЧХ) является нелинейной. Если в приложении не требуется фазовая информация, как, например, для простого мониторинга сигнала, то для этого вполне подойдет БИХ фильтр. Однако для приложений, требующих линейных фазовых откликов, следует использовать КИХ-фильтры. Кроме того, рекурсивная природа БИХ фильтров усложняет их разработку и применение.
КИХ-фильтр
Фильтр с конечной импульсной характеристикой (нерекурсивный фильтр, КИХ-фильтр, FIR-фильтр) — один из видов линейных электронных фильтров, характерной особенностью которого является ограниченность по времени его импульсной характеристики (с какого-то момента времени она становится точно равной нулю). Такой фильтр называют ещё нерекурсивным из-за отсутствия обратной связи. Знаменатель передаточной функции такого фильтра — некая константа.
Содержание
Динамические характеристики

Разностное уравнение, описывающее связь между входным и выходным сигналами фильтра: где P — порядок фильтра, x(n) — входной сигнал, y(n) — выходной сигнал, а bi — коэффициенты фильтра. Иными словами, значение любого отсчета выходного сигнала определяется суммой масштабированных значений P предыдущих отсчетов. Можно сказать иначе: значение выхода фильтра в любой момент времени есть значение отклика на мгновенное значение входа и сумма всех постепенно затухающих откликов P предыдущих отсчетов сигнала, которые всё ещё оказывают влияние на выход (после P -отсчетов импульсная переходная функция становится равной нулю, как уже было сказано, поэтому все члены после P -го тоже станут равными нулю). Запишем предыдущее уравнение в более ёмком виде:

Это вторая публикация на тему «Цифровая фильтрация на ПЛИС». Вторая часть будет посвящена практической реализации КИХ фильтров на FPGA. В процессе подготовки материала я понял, что она раздуется до небывалых размеров, но делить ее на несколько частей не хочется. Поэтому все тонкости теории и синтеза FIR фильтров будут в одной статье, разбитой на взаимосвязанные разделы. Начну обзор с теоретической части, в частности — расскажу об особенностях и методах расчета коэффициентов фильтров. Подробно рассмотрю создание КИХ фильтров в различных средах — MATLAB, CoreGENERATOR, Vivado HLS. Всех заинтересовавшихся прошу под кат.
Часть 2. КИХ фильтр
Теория
Рассмотрим простой пример реализации FIR фильтров. Как известно, существует два больших класса фильтров — БИХ, с бесконечной импульсной характеристикой и КИХ, с конечной импульсной характеристикой. Остановимся на втором типе: КИХ фильтрах (англ. FIR — «finite impulse response»). КИХ фильтр — это линейный цифровой фильтр, основной особенностью которого является ограниченность во времени его импульсной характеристики, то есть с определенного момента времени она становится равной нулю. Как правило, большинство КИХ фильтров выполнено без обратной связи, поэтому практически все КИХ фильтры — нерекурсивные.
Вот так выглядит реализация КИХ фильтра в общем виде, в частности — на ПЛИС. 
Все КИХ-фильтры описываются следующими уравнениями:
где y(n) — выходной сигнал (функция текущего и прошедших значений на входе), x(n) — входное воздействие, h(k) — коэффициенты импульсной характеристики, N — длина фильтра (количество коэффициентов фильтра), H(z) — передаточная характеристика фильтра.
В чем секрет КИХ фильтров?
Самая важная особенность КИХ фильтров заключается в возможности получения точной линейной фазовой характеристики. У читателя возникает закономерный вопрос — «а зачем это надо?». Остановимся на этом моменте подробнее. Сигнал подвергается различным преобразованиям при прохождении через фильтр. В частности, изменяются амплитуда и фаза сигнала в зависимости от частотной характеристики фильтра (амплитудной, АЧХ и фазовой, ФЧХ). Для многочастотных сигналов недопустимо, чтобы при прохождении блоков обработки, фаза сигнала искажалась. Причем, если АЧХ в полосе пропускания сделать практически постоянной не составляет труда, то с ФЧХ возникают проблемы. Для оценки искажений фазы удобно ввести понятия фазовой и групповой задержек.
Фазовая задержка — это величина задержки для каждой из частотных компонент сигнала. Определяется как угол сдвига фазы, деленный на частоту. Групповая задержка — это средняя временная задержка всего многочастотного сигнала. Определяется как производная фазы по частоте. Математически фазовая и групповая задержки записываются следующим образом:
Из формулы для групповой задержки становится очевидно условие линейности ФЧХ фильтра. Если ФЧХ — линейна, то групповая задержка после взятия производной равна константе, то есть постоянна для всех частотных компонент. Логично, что фильтр с нелинейной ФЧХ будет вносить искажения в фазу сигнала.
Таким образом, линейность фазовой характеристики — одна из важнейших особенностей КИХ-фильтров. Остановимся на изучении этого класса фильтров.
КИХ фильтры с линейной ФЧХ
sin(x)/x независимо от типа фильтра (ФНЧ, ФВЧ, ПФ, РФ, дифференциатор). Для решения практических задач зачастую не приходится задумываться о том, какого типа фильтр выбран. Доказательство условия симметрии коэффициентов приводить не буду, но любопытный читатель может найти его сам в различной литературе, ссылки на которую я привожу в конце статьи.
Проектирование КИХ фильтров
Под «расчетом FIR фильтра» в большинстве случаев понимают поиск его коэффициентов по значениям частотной характеристики. Не могу припомнить случаев, когда решалась бы обратная задача за исключением академического интереса.
- Спецификация фильтра. Задается тип фильтра (ФНЧ, ФВЧ, полосовой, режекторный), количество коэффициентов N, требуемая частотная характеристика, с допусками на нелинейность в полосе затухания и полосе пропускания и т. д.
- Вычисление коэффициентов. Любыми доступными способами и средствами вычисляются коэффициенты фильтра, удовлетворяющие спецификации из предыдущего пункта.
- Анализ следствий конечной разрядности. На этом этапе оценивается влияние эффектов квантования на коэффициенты фильтра, промежуточные и выходные данные.
- Реализация. На этой стадии происходит разработка фильтра на доступном языке программирования или реализация фильтра путем создания готовых IP-ядер.
Спецификация фильтра
- Apass — неравномерность в полосе пропускания,
- Astop — уровень затухания в полосе подавления,
- Fpass — граничная частота полосы пропускания,
- Fstop — граничная частота полосы затухания,
- N — порядок фильтра (количество коэффициентов фильтра).
Вычисление коэффициентов фильтра
На эту тему можно написать несколько книг и научных статей, но в рамках данной статьи рассматривать подробно все методы не будем. Существует множество методов расчета коэффициентов фильтра — метод взвешивания оконными функциями, метод частотной выборки, различные оптимальные (по Чебышеву) методы с применением алгоритма Ремеза и т.д. Все методы уникальны по своим особенностям и дают те или иные результаты. Для метода оконного взвешивания негативным проявлением становится эффект Гиббса, вносящий неравномерность и выбросы в частотную характеристику фильтра между рассчитанными точками функции. Бороться с ним можно бесконечно, но на практике вводят допуски по неравномерностям в полосе пропускания и полосе подавления.
Основным методом расчета коэффициентов для многих фильтров является модифицированный алгоритм Ремеза — «Parks-McClellan algorithm». По своей сути это косвенный итерационный метод для нахождения оптимальных значений с Чебышевской характеристикой фильтра. Особенность метода заключается в минимизации ошибки в полосе затухания и пропускания путем Чебышевской аппроксимации импульсной характеристики. Вполне логично, что чем больше количество коэффициентов, тем меньше неравномерность АЧХ и тем она прямоугольнее.
От выбора метода зависит конечный результат, но все они сводятся к одним и тем же целям — минимизации выбросов в полосе пропускания и увеличении «прямоугольности» АЧХ.
Анализ следствий конечной разрядности
Разрядность коэффициентов — главный фактор, от которого зависит вид частотной характеристики. В современных ПЛИС разрядность коэффициентов может быть выбрана любой, но разумные цифры лежат в пределах от 16 до 27 битов. Для высоких порядков фильтра часто требуется обеспечить большой динамический диапазон разрядной сетки, но если этого не удается сделать, рано или поздно начинают проявляться ошибки квантования. Из-за ограниченной разрядности коэффициентов модифицируется частотная характеристика, а в некоторых случаях она искажается настолько сильно, что приходится жертвовать параметрами из частотной спецификации для достижения приемлемого результата. Так или иначе, разрядность представления коэффициентов прямо влияет на максимально возможное затухание Astop. Поэтому при использовании слишком ограниченной разрядной сетки коэффициентов, порой невозможно достичь желаемого подавления даже при огромных порядках фильтра!
Разрядность промежуточных данных и арифметическое переполнение — факторы, от которых также зависит вид частотной характеристики и результат на выходе фильтра. Во многих ПЛИС проблема устраняется использованием аккумуляторов большой разрядности в блоках DSP. Например, в ПЛИС Xilinx 6 и 7 серии в ячейках DSP48E1 используются 48-битные аккумуляторы и перемножители. На следующем рисунке представлен стандартный блок DSP48E1, на котором реализуются КИХ фильтры.
Встроенные DSP блоки современных ПЛИС выполнены таким образом, чтобы максимально удобно проводить задачи ЦОС. В первую очередь — для реализации FIR фильтров.
Для реализации простейших фильтров требуется совсем немного логических операций. Основной узел, с помощью которого реализуется FIR фильтр — DSP блок ПЛИС. В этом блоке происходят все математические операции — перемножение входных отсчетов с коэффициентами фильтров, задержка входного сигнала, суммирование данных. Современные узлы DSP содержат предварительный сумматор, поэтому даже операции суммирования для фильтров с симметричной ИХ можно делать внутри этого узла. Помимо DSP блока, фильтру нужна память для хранения коэффициентов (распределенная или блочная). Больше фильтр ничего не использует. На рисунке приведена реализация КИХ фильтра с использованием перемножителей, аккумуляторов, линий задержки и памяти для хранения коэффициентов.

Расчет фильтра в MATLAB
Существует множество приложений, в которых можно проводить расчет фильтра и поиск его коэффициентов. Например, LABView, Scope FIR, FDATool из MATLAB или бесплатного аналога Octave. Пожалуй, самым удобным средством расчета КИХ фильтра является MATLAB. Для запуска средства создания и анализа фильтров необходимо в командном окне среды набрать ключевое слово fdatool. Появится примерно вот такое окно (в зависимости от версии MATLAB оно может иметь чуть иной вид): 
- Filter Order — определяет порядок фильтра (минимальный или заданный пользователем)**.
- Frequency Specifications — определяет частотные параметры характеристики фильтра.
- Magnitude Specifications — определяет амплитудные параметры характеристики фильтра.
- Density Factor — для типа Equiripple задает сетку точек, по которым происходит аппроксимация АЧХ фильтра.
- Lowpass — фильтр нижних частот,
- Raised cosine — фильтр «приподнятого косинуса»,
- Highpass — фильтр верхних частот,
- Bandpass — полосовой фильтр,
- Bandstop — режекторный (заграждающий) фильтр,
- Differentiator — дифференциатор,
- Nyquist — фильтр Найквиста,
- Multiband — многополосный фильтр,
- Hilbert transformer — преобразователь Гильберта,
- Arbitrary magnitude — фильтры с произвольной АЧХ.
Причем, в зависимости от типа фильтра, средство анализа укажет на ограничения по типу фильтра и предложит ввести корректное значение N.
- Butterworth — фильтры с характеристикой Баттерворта,
- Chebyshev Type I, II — фильтры Чебышева,
- Elliptic — эллиптический фильтр,
- Maximally flat — фильтр с максимально плоской характеристикой в полосе пропускания,
- Equiripple — фильтр с равномерно пульсирующей АЧХ,
- Least-squares — фильтр по методу наименьших квадратов,
- Window — фильтр с оконным взвешиванием различными функциями****,
- Complex Equiripple — комплексный фильтр с равномерно пульсирующей АЧХ,
- Maximally flat — фильтр с максимально плоской характеристикой в полосе пропускания,
*** — наибольший практический интерес представляют фильтры типа Equiripple и Window.
**** — при выборе этой опции появляется панель доступа к оконным функциям и их параметрам.
Для метода Equiripple производится самый простейший расчет КИХ фильтра по модифицированному алгоритму Ремеза. Пользователь задает параметры из спецификации на фильтр и сразу видит результат. В случае неудовлетворительных результатов можно в любой момент изменить один или несколько параметров фильтра и получить другую частотную характеристику. Расчет проводится до тех пор, пока не получены требуемые характеристики. Если не удалось добиться значений по заданию, то рано или поздно придется жертвовать той или иной величиной из спецификации, либо существенно увеличивать порядок фильтра N.
Для метода Window доступно несколько вариантов оконных функций: Bartlett, Blackman, Blackman-Harris, Chebyshev, Flat Top, Gaussian, Hamming, Hann, Kaiser, Rectangular и т. д., вплоть до пользовательских оконных функций (User-defined). Все эти функции обладают своими особенностями и могут давать различные параметры частотной характеристики КИХ фильтра. Часть оконных функций рассчитывается без параметров, а часть фильтров задается через определенные параметры, влияющие на АЧХ фильтра.
Из всех представленных оконных функций, на мой взгляд, самой удобной является окно Кайзера. Для построения АЧХ требуется задать всего один параметр Beta, который влияет на уровень подавления в полосе затухания и на прямоугольность частотной характеристики.
Слева снизу относительно главной рабочей области средство FDATool содержит дополнительные вкладки, в которых можно указать тип фильтра (дециматор или интерполятор), имя модели для вставки в Simulink, тип и разрядность коэффициентов и входных данных и многое другое. В практических целях самые основные вкладки это Design Filter — в ней происходит расчет фильтра, и Quantinization Parameters — в этой вкладке задается тип и разрядность данных.
На верхней панели находятся кнопки, с помощью которых можно посмотреть АЧХ и ФЧХ фильтра, групповую и фазовую задержку, импульсную и переходную характеристики, карту нулей и полюсов фильтра, рассчитанные коэффициенты и т.д.
График АЧХ и ФЧХ фильтра: 
График импульсной характеристики фильтра: 
График диаграммы нулей и полюсов:
Помимо всего этого, FDATool позволяет импортировать и экспортировать модели фильтров и рассчитанные коэффициенты. Например, можно рассчитать фильтр и отправить его модель в Simulink в виде модели на стандартных примитивах. Можно рассчитать коэффициенты и сохранить их в отдельном файле, например, как файл с расширением *.h (header).
Кроме того, можно создать файл коэффициентов *.COE в специальном формате для Xilinx. Для этого нужно выбрать тип коэффициентов с фиксированной точкой и задать их разрядность. Затем нажать Targets -> Xilinx Coefficient (.COE) File, в результате чего в главном окне MATLAB отобразится содержимое файла — глобальные настройки и коэффициенты в HEX-формате.
Видно, что при подаче на вход единичного импульса, на выходе образуется не что иное, как импульсная характеристика фильтра (график из Simulink). 
Xilinx FIR Compiler
Как и в случае с CIC фильтром, приведу подробное описание средства создания FIR фильтров от Xilinx. Отмечу, что описание содержит не просто перевод из даташита, а замечания и рекомендации из личного опыта и опыта моих коллег.
FIR Compiler — Вкладка 1: 
Component name — имя компонента (используются латинские буквы a-z, цифры 0-9 и символ «_»).
Рекомендую использовать осмысленные имена, в которых зашифрованы главные параметры фильтра. Например, xfir128t_d1_b18_4c_w6_a7 — фильтр, сделанный для Xilinx, N = 128 (taps), децимация не используется, разрядность коэффициентов 18, четыре канала, применена оконная функция Кайзера с параметром beta = 6, кристалл ПЛИС — Artix-7.
- Select source — выбор источника коэффициентов (Vector — вектор, заданный вручную или COE File — файл с набором коэффициентов). Предпочтительно использовать перегружаемые *.COE файлы.
- Coefficient Vector — вектор коэффициентов, задаваемый вручную.
- Coefficient File — вектор коэффициентов, считываемый из файла.
- Number of Coefficient Sets — количество реально используемых DSP блоков для обработки коэффициентов. Количество коэффициентов должно делиться нацело на указанное значение. Полезная опция при работе на высокой частоте относительно частоты дискретизации, позволяет существенно экономить ресурсы ПЛИС.
- Number of Coefficient (per set) — количество коэффициентов, обрабатываемых единовременно DSP блоками. Значение в поле автоматически устанавливается при считывании количества коэффициентов и предыдущего параметра.
- Filter type — тип фильтра: простой / интерполирующий / децимирующий / полифазный.
- Rate Change Type — изменение скорости обработки. Может быть целочисленным или дробным.
- Interpolation / Decimation Rate Value — коэффициент интерполяции / децимации.
- Zero Pack Factor — для интерполирующих фильтров параметр определяет количество нулей, вставляемых между коэффициентами.
- Number of channels — количество независимых каналов фильтрации: 1-64.
- Select format — выбор частотных соотношений фильтра: Frequency Specification / Sample period.
- Frequency Specification — Частотная спецификация: пользователь задает частоту дискретизации и частоту обработки данных.
- Sample period — Тактовая спецификация: пользователь задает отношение частоты обработки к тактовой частоте данных.
- Input Sampling Frequency — входная частота дискретизации: *.
- Clock frequency — частота обработки фильтра: *****.
- Input Sampling period — отношение частоты обработки к частоте входного тактового сигнала: *****.
FIR Compiler — Вкладка 2: 
- Systolic Multiply Accumulate — систолический фильтр с накоплением,
- Transpose Multiply Accumulate — перестраиваемый фильтр с накоплением,
- Distributed Arithmetic — фильтр на распределенной логике ПЛИС.
- Use Reloadable Coeffcients — использовать перегружаемые коэффициенты. Полезная опция для реализации в одном фильтре перегружаемых частотных характеристик.
- Coefficient Structure — структура коэффициентов, 5 типов: несимметричные, симметричные, отрицательно симметричные, полуполосные и с преобразованием Гильберта. По умолчанию FIR compiler пытается сам определить тип коэффициентов (inferred).
- Coefficient Type — тип коэффициентов: знаковый или беззнаковый.
- Quantization — задает метод округления: целочисленные коэффициенты, округление к ближайшему целому или максимальный динамический диапазон (масштабирует коэффициенты относительно максимального).
- Coefficient Width — разрядность коэффициентов. Значение в этом поле влияет на частотную характеристику фильтра, что можно наблюдать в соответствующем окне (Freq. Response).
- Best Precision Fraction Length — автоматически устанавливает наилучшее соотношение для целой и дробной частей разрядной сетки.
- Coefficient Fractional Bits — определяет позицию для разделения целой части от дробной в разрядной сетке представления коэффициентов.
- Number of Paths — определяет количество параллельных каналов для обработки. Количество DSP ядер пропорционально значению в этом поле. Для этой опции на вход фильтра поступает несколько независимых потоков данных, в то время как для параметра Number of Channels данные поступают на один вход и обрабатываются последовательно.
- Input Data Type — тип данных на входе фильтра (знаковый или беззнаковый).
- Input Data Width — разрядность входных данных.
- Input Data Fractional Bits — определяет количество бит, приходящихся на дробную часть представления входных данных. Значение в этом поле не влияет на реализацию фильтра! (число с фиксированной точкой можно представить как угодно: с дробной частью или вовсе без нее, но результат один и тот же).
- Output Rounding Mode — режим округления выходных данных: полная точность, отбрасывание младших значащих битов, округление до целого вниз/вверх, округление до четного/нечетного. Во многих задачах не требуется менять этот параметр и можно оставить Full Precision — полную точность.
- Output Width — разрядность выходных данных фильтра.
- Output Fractional Bits — количество бит, определяющих дробную часть выходных данных. Поле информативное и не влияет на реализацию фильтра.
- Allow Rounding Approximation — для режимов Symmetric Rounding Mode опция разрешает аппроксимацию при округлении без дополнительных затрат ресурсов (автоматическое определение знакового бита в слове).
- Registered Output — активная опция добавляет на выход фильтра дополнительный регистр для увеличения производительности (максимальной частоты обработки) фильтра.
- SCLR — синхронный сброс фильтра (логическая единица на входе производит сброс).
- Use Deterministic SCLR Behavior — определяет поведение внутренних данных фильтра типа Multiply-Accumulate в процессе сброса. При активной опции сигнал сброса очищает внутренние регистры, память данных и хранения коэффициентов.
- ND — «New data», входной сигнал, определяющий поступление данных на вход фильтра. Вместе с сигналом RFD позволяют организовать пакетную обработку данных. Как правило, сигналы ND и RFD подключают к управляющим сигналам FIFO.
- CE — «Clock Enable», сигнал разрешения тактирования фильтра. При низком уровне на входе этого сигнала приостанавливается любая обработка внутри фильтра, независимо от того, поступают новые данные или нет.
- DATA_VALID — сигнал валидности выходных данных. Опция полезна только в многоканальном режиме (Number of Channels > 1).
- Device Column Lengths — определяет длину колонок DSP блоков. Полезное информативное поле, в котором можно заранее определить верхнюю границу порядка фильтра и максимальное количество реализуемых фильтров.
- Column Configuration — определяет конфигурацию и положение DSP блоков в колонках. С этим параметром нужно работать осторожно, поскольку при разрыве фильтра между несколькими колонками может возникнуть большая задержка, следовательно — упадет максимальная тактовая частота.
- Inter-column Pipe Length — определяет количество дополнительных регистров между колонками DSP блоков для устранения негативного эффекта задержки распространения.
Summary — эта вкладка в виде списка отражает конечные настройки фильтра (количество каналов, порядок фильтра, параметры частот, разрядность входных, выходных и промежуточных данных, разрядность коэффициентов, задержка в фильтре, количество используемых DSP блоков, наличие сигналов контроля и т.д.).
- IP-symbol — схематичный вид IP-блока с активными портами ввода/вывода.
- Freq. response — частотная характеристика FIR-фильтра.
- Implementation Details — оценка занимаемых ресурсов DSP и RAMB, суммарная задержка, количество коэффициентов и порядок их загрузки.
Абстрактный пример
- Частота дискретизации Fs: 250 МГц,
- Частота среза фильтра Fpass: 55 МГц,
- Коэффициент прямоугольности: > 0.88 (Fpass/Fstop),
- Подавление в полосе пропускания (Apass): < 0.5 дБ,
- Подавление в полосе затухания (Astop): > 50 дБ.
Шаг 1: Оценка ресурсов ПЛИС
Необходимо понять, сколько доступно ресурсов кристалла для реализации подобного фильтра. В DS180 можно найти, что микросхема имеет 240 DSP48E1 блоков, выстроенных в три колонки (это важно!). Из ТЗ известно, что ИХ – симметрична, а это значит, что для фильтра порядка N потребуется N/2 блоков DSP48E1. Следовательно, на выбранной микросхеме возможна реализация 2 фильтров с длиной характеристики N = 240, либо 6 фильтров с длиной N = 80. В практических целях при обработке сигналов длину ИХ выбирают кратному степени двойки. Например, N = 64, 128 или 256. Либо, N = (128 + 64), (32 + 16 + 8). В нашем случае необходимо реализовать 6 фильтров на 240 DSP блоках. С учетом симметрии для каждого фильтра возможно использовать длину N < 81 коэффициентов. Предположим, что для достижения параметров фильтра хватит N = 80 = 64 + 16 коэффициентов.
Шаг 2: Поиск коэффициентов фильтра
Запустим FDATool и внесем в нужные поля параметры фильтра из спецификации (помним, что порядок N задается на 1 меньше, чем истинный порядок фильтра). Режим 1 – Equiripple. Для частоты среза Fpass = 55 МГц и коэффициента прямоугольности > 0.85 найдем частоту заграждения Fstop < 62.5 МГц. На следующем рисунке представлен расчет фильтра по требуемым параметрам: 
Как видно, фильтр удовлетворяет всем перечисленным требованиям.
Режим 2 – Window. Неожиданно перед самой сдачей проекта вашему заумному заказчику вбрела в дурную голову мысль. «Хочу 70 дБ подавление при прочих равных условиях!». Элементная база выбрана, плата разведена и смонтирована, ПЛИС установлена, проект отлаживался несколько месяцев и нет возможности поставить что-то переделывать. Что делать? Проектировать свой собственный КИХ фильтр за неделю до сдачи проекта? Искать другие методы подавления АЧХ? Переделывать плату и устанавливать ПЛИС пожирнее? Нереально! Главное – не паниковать. Метод Equiripple уже не спасает. Переходим к оконному режиму Window. При выборе моего любимого окна Кайзера можно добиться лучших характеристик фильтра. Например, обеспечить необходимое подавление в полосе затухания Astop = 80 дБ (параметр Beta = 8). Но для оконного метода следует учитывать, что в полосе затухания из-за недостаточной разрядности коэффициентов могут проявляться эффекты квантования. 
Далее известным способом выгружаем рассчитанные коэффициенты в *.COE файл для дальнейшей работы.
Шаг 3: Реализация
Количество каналов и коэффициентов было подобрано таким образом, чтобы на 100% занять ресурсы DSP48E1 в ПЛИС. Количество занимаемых ресурсов для 6 каналов на рисунке ниже: 
Не стоит пугаться, что проект не заработает на 250 МГц. Еще как заработает. PlanAhead любит перестраховываться и указывает значения ниже реальных. Результаты разводки шести каналов FIR фильтров.
Схематический вид части IP-ядра FIR фильтра: 
Разводки платы в FPGA Editor (Zoom нижней части): 
Разводка платы в FPGA Editor:
Практические советы
- Заранее определить возможную децимацию сигнала (по отношению частоты дискретизации и граничной частоте в спектре сигнала). Использовать дешевые CIC-фильтры для целей децимации. После децимации возможно сократить количество используемых DSP блоков кристалла.
- Определить отношение частоты дискретизации и частоты обработки в кристалле ПЛИС. Если частота обработки в несколько раз превышает частоту дискретизации, можно во столько же раз сэкономить количество ресурсов на реализацию FIR фильтра.
- Реализовать фильтр на распределенной логике ПЛИС, если это возможно и не критично с точки зрения частот обработки. Этот метод очень сложен в реализации и не будет стабильно работать для больших порядков фильтра N.
- Для реализации фильтров с симметричной ИХ предварительно оценить размер колонок DSP блоков и количество этих колонок в ПЛИС. Для реализации длинных фильтров с симметричной ИХ требуется каскадное соединение DSP блоков и при размещении фильтра внутри ПЛИС в одной колонке может не хватить ячеек DSP. С другой стороны, при реализации независимых каналов фильтров, может попросту не хватить колонок, если в каждой колонке умещается только один фильтр. Придется либо уменьшать длину характеристики, либо делать два небольших фильтра с меньшим числом коэффициентов.******
- Для современных кристаллов ПЛИС (Altera и Xilinx) при реализации фильтра с симметричной ИХ использовать предварительный сумматор в узле DSP, а не на распределенной логике. Внутренний pre-adder значительно экономит не только логические ячейки, но и трассировочные ресурсы кристалла! *******
Vivado HLS
- уменьшение времени проектирования (понятие «time-to-market«),
- уменьшение порога вхождения (популяризация ПЛИС среди С++ разработчиков).
В качестве примера я взял одну из лабораторных работ от Xilinx, в которой в первом приближении показана вся мощь современных средств. Основная разработка с помощью Vivado HLS базируется на взаимосвязанных задачах: написание кода и его оптимизация по скорости (Speed) и занимаемой площади (Area) с помощью директив.
- – C Validation/Simulation (Project -> Run C Simulation): написание алгоритма, отладка проекта, выявление ошибок в коде, сравнение данных с эталоном и т.д.
- – C Synthesis (Solution -> Run C Synthesis): синтез проекта из C-кода в RTL форму и анализ полученных данных: оценка производительности (latency, trip count, speed etc.), оценка ресурсов, полученный интерфейс ввода/вывода.*
- – RTL Verification (Solution -> Run C/RTL Cosimulation): повторное использование C-модели теста main() для анализа RTL-модели (self-checking).
- – IP Creation (Solution -> Export RTL): создание IP-ядра для дальнейшего использования в основном проекте (Xilinx ISE, Vivado и т.д)
- Source file – подходит для задания директив, которые НЕ БУДУТ меняться на протяжении создания проекта. Например, директивы для интерфейса портов I/O не меняются. В проекте эти директивы обозначаются префиксом: #HLS.
- Directive file – подходит для задания условий и ограничений, которые влияют на оптимизацию по скорости и размещению. Как правило, в проекте можно сравнить в различных solutions несколько ограничений и выбрать оптимальное. В проекте эти директивы обозначаются префиксом: %HLS.
Директивы в отдельном файле выглядят следующим образом:
Замечание: В процессе оптимизации разработчику часто приходится сравнивать различные результаты по производительности и ресурсам. Поэтому зачастую большая часть директив записывается в отдельный файл. Если разработчик уверен, что конкретная оптимизация нужна для всех решений, то её можно занести в исходные тексты!
- без использования директив (синтезатор использует минимум ресурсов — последовательная обработка данных),
- с использованием директив для портов (синтезатор оптимизирует интерфейс ввода/вывода),
- с использованием директивы UNROLL (для разворачивания цикла FOR и параллельной обработки каждой итерации цикла).
Сравнение трех решений: 
Директивы: 
Вкладка Performance: 
Вкладка Resources: 
- Чтение порта x и запись порта y происходит за один такт. Чтение порта c за два такта, потому что он описан как интерфейс памяти RAM;
- Используется два умножителя;
- Сдвиговый регистр shift_reg используется для операции чтения и записи;
- Остальные ресурсы не используются совместно, потому что существуют в единственном виде (в выражениях в коде).
Процесс создания нового проекта и все шаги проектирования описывать не буду, поскольку статья и так уже разрослась до небывалых размеров. Но если вам интересна тема использования Vivado HLS в своих проектах – я с удовольствием поделюсь своим опытом. Также можно воспользоваться помощью хабраюзера urock. В этом деле он мастер!
Введение
Цифровой фильтр – фильтр, обрабатывающий цифровой сигнал с целью выделения и (или) подавления определённых частот этого сигнала.
- Разделяют два больших класса цифровых фильтров:
- Фильтры с конечной импульсной характеристикой (КИХ-фильтры, FIR)
- Фильтры с бесконечной импульсной характеристикой (БИХ-фильтры, IIR)
Зачем они нужны? Чем нас не устраивают аналговые фильтры? Давайте рассмотрим преимущества и недостатки цифровых фильтров.
Преимущества цифровых фильтров:
- Высокая точность и воспроизводимость (у аналоговых фильтров это определяется разбросом номиналов компонентов)
- Гибкость (можно изменять характеристику, не затрагивая аппаратную часть)
- Компактность (например, аналоговые ФНЧ могут занимать много места, в то время как цифровые имеют одинаковые габариты при любой форме АЧХ в пределах одной частоты дискретизации)
Недостатки цифвровых фильтров:
- Сложность работы в реальном времени (все вычисления должны пройти менее, чем за один период дискретизации)
- Высокая стоимость
Начнём изучение фильтров с наиболее простого типа — КИХ-фильтров.
КИХ-фильтры
Давайте сразу рассмотрим пример. Сгенерируем в Matlab зашумлённый сигнал частотой 0.5 Гц, оцифрованный с частотй дискретизации 10 Гц. Для начала, объявим переменную fs , которой присвоим значение частоты дискретизации, создадим массив временных отсчётов ts , и переменную N , которой присвоим количество получившихся отсчётов:
Теперь создадим сам синусоидальный сигнал x с частотой 0.5 Гц, зашумлённый случайным сигналом, амплитуда которого изменяется в диапазоне от a=-0.01 до b=0.1 :
Построим график сигнала x :
И получим результат:
Сгенерированный сигнал x(n)
Возьмём первые пять отсчётов с x(1) по x(5) , найдём их среднее арифметическое, запишем его в новый массив в элемент y(1) , затем возьмём отсчёты с x(2) по x(6) , также рассчитаем их среднее значение и запишем его в элемент y(2) и так далее, пока не пройдём по всему сигналу:
А теперь построим сигналы x и y друг под другом в одном окне:
Результаты выполнения получившегося скрипта показаны ниже:
Результаты работы фильтра “скользящее среднее”
И что же мы видим? Сигнал y(n) (на рисунке снизу) похож на сигнал x(n) (сверху), однако имеет некоторую задержку и более гладкую форму. Получается, что мы только что применили к сигналу x(n) фильтр нижних частот (ФНЧ)! Спроектированный нами фильтр называется скользящее среднее. Уравнение данного фильтра имеет вид:
![\begin{equation*} y[n]=\sum\limits_{k=0}^{M-1} h(k) \cdot x(n-k) \text{, где} \sum\limits_{k=0}^M h(k) = 1 \end{equation*}](https://leonidov.su/wp-content/ql-cache/quicklatex.com-b1bdff669d80da2fe4508b625186fae0_l3.png)
(1)
А его структурная схема выглядит так:

Структурная схема фильтра “скользящее среднее состоящего из пяти отсчётов
В каждый момент времени берётся текущий отсчёт и 4 предыдущих, каждый из которых домножается на коэффициент 1/5, затем эти результаты складываются и полученная сумма поступает на выход. Процедура повторяется, пока весь сигнал не будет обработан.
Свёртка
А что, если вместо коэффициентов 1/5 взять что-то другое? На самом деле, уравнение (1) представляет собой частный случай операции свёртки:
![\begin{equation*} y[n] = x[n] \ast h[n]=\sum\limits_{k=0}^{M-1} h(k) \cdot x(n-k), \end{equation*}](https://leonidov.su/wp-content/ql-cache/quicklatex.com-c92c6e0ed841a43340c6de002b1b1e2a_l3.png)
(2)
где
,
— длина
,
— длина ![]()
Это уравнение и является уравнением КИХ-фильтра. Его структурная схема выглядит так:

Структурная схема КИХ-фильтра
Теорема о свёртке
Со свёрткой связана следующая теорема:
Если два сигнала
и
имеют дискретные преобразования Фурье (ДПФ)
и
соответственно, то свёртка этих сигналов во временной области
эквивалентна произведению их спектров в частотной области
(и наоборот):
(3)
И действует это в обе стороны. Получается, что, когда мы делаем свёртку исходного сигнала с коэффициентами фильтра, мы перемножаем амплитудно-частотную характеристику (АЧХ) исходного сигнала и АЧХ фильтра, тем самым убираем ненужные частоты. А это и есть фильтрация.
Мы выше говорили: “фильтры с конечной импульсной характеристикой, фильтры с бесконечной импульсной характеристикой”. А что же такое “импульсная характеристика”? Давайте вспомним на примере фильтров.
Импульсная характеристика КИХ-фильтра
Импульсная характеристика фильтра — это выходная последовательность фильтра во временной области при подаче на вход фильтра дельта-функции, или функции Дирака — единственного отсчёта, равного единице (единичного импульса), которому предшествуют и за которым следуют нулевые отсчёты.
Возьмём предыдущий пример из Matlab и вместо исходного сигнала x подставим в него функцию Дирака:
Результат выполнения скрипта показан ниже:
Функция Дирака и реакция на неё скользящего среднего из пяти отсчётов
Из рисунка видно, что импульсная характеристика фильтра представляет собой 5 отсчётов амплитудой 0.2 (или 1/5). Получается, что мы с вами видим ни что иное, как коэффициенты фильтра. Поэтому коэффициенты КИХ-фильтра также называют его импульсной характеристикой.
Проектирование КИХ-фильтров
Теперь возникает вопрос: как рассчитать коэффициенты, чтобы получить требуемую АЧХ фильтра? Самый простой способ: “рисуем” необходимую АЧХ в частотной области, делаем обратное ДПФ от этой АЧХ и получаем набор коэффициентов во временной области. Наверняка, каждый из вас мечтает увидеть фильтр с идеально прямоугольной АЧХ. Возможно ли такое? Давайте разбираться. Что из себя представляет ДПФ от идеально прямоугольного сигнала? Правильно, функцию
, которую мы рассматривали, когда изучали растекание спектра ДПФ:
Функция ![]()
Данная функция бесконечна во временной области, поэтому для реализации идеально прямоугольной АЧХ нам потребуется бесконечное количество коэффициентов фильтра. Получается, чем больше мы используем коэффициентов h[n] , тем больше АЧХ фильтра будет похожа на прямоугольную. Вроде бы логично — возьми побольше коэффициентов, получишь хороший фильтр. Но не всё так просто: в реальности мы не можем увеличивать количество коэффициентов фильтра, т.к. это приведёт к дополнительным операциям перемножения, каждая из которых вызывает задержку. Для того, чтобы система работала в реальном времени, нужно, чтобы все вычисления по формуле (2) производились за время, не превышающее один период дискретизации. Вот и простейшее ограничение.
Давайте попробуем на примере. Создадим сигнал x(n) , состоящий из N нулевых отсчётов, затем присвоим первым 200 отсчтётам значение 1. Это будет наша требуемая форма АЧХ:
Рассчитаем ОДПФ от сигнала x(n) , для удобства сдвинем его с помощью ifftshift , отбросим мнимую часть и присвоим полученный результат сигналу y(n) . Далее построим графики сигнала x(n) , и, чтобы лучше рассмотреть сигнал у(n) , график его 200 центральных отсчётов.
Результат выполнения скрипта показан ниже:
Требуемая форма АЧХ фильтра x(n) и 200 центральных отсчётов его импульсной характеристики y(n)
Теперь давайте анализировать реальную АЧХ от спроектированного фильтра. Для этого создадим сигнал a(n) , состоящий из N нулевых отсчётов, затем присвоим первому отсчёту 1. Таким образом, получим функцию Дирака, спектр которой является константой на всей частотной оси:
Теперь попробуем пропустить функцию Дирака через спроектированный ранее фильтр y(n) , при этом будем использовать разное количество отсчётов y(n) :
Результат выполнения скрипта показан ниже:
Форма АЧХ фильтра в зависимости от количества отсчётов
Из графиков видно, что, чем больше мы используем отсчётов нашего фильтра (а количество отсчётов – это порядок цифрового фильтра), тем более его характеристика становится похожа на идеальную. Однако, стоит обратить внимание, что на вершине АЧХ всех наших фильтров видны пульсации независимо от того, сколько используется отсчётов в импульсной характеристике. Эти пульсации называются пульсации Гиббса и возникают из-за медленной сходимости ряда Фурье, которая обусловлена наличием разрыва функции на частоте среза полосы пропускания фильтра. С увеличением числа отсчетов уменьшается длительность выбросов на вершине АЧХ, но их амплитуда не меняется и составляет примерно 9% от амплитуды АЧХ на частоте среза.
Окна при проектировании КИХ-фильтров
Запишем выражение (3) следующим образом:
(4) ![]()
— бесконечная импульсная характеристика идеального фильтра
— окно, наложенное на бесконечную импульсную характеристику
и
— их ДПФ
Получается, что, когда мы берём какое-то ограниченное количество отсчётов от импульсной характеристики идеального фильтра, мы умножаем эту импульсную характеристику на прямоугольное окно, спектр которого мы рассматривали выше. Эта процедура во временной области эквивалентна свёртке спектра идеальной характеристики и спектра ограниченной импульсной характеристики в частотной области. Ниже приведён листинг, моделирующий выражение (4):
Результат выполнения скрипта показан ниже:
Результаты моделирования выражения (4)
Чтобы уменьшить амплитуду пульсаций, как и в случае с ДПФ, при проектировании КИХ-фильтров используют окна, отличные от прямоугольного. Давайте модифицируем наш листинг “Анализ АЧХ фильтра, часть 4” и добавим в строчках 26, 34, 42, 50 умножение на окно Хэмминга:
Полученные результаты показаны ниже:
Форма АЧХ фильтра, взвешенного окном, в зависимости от количества отсчётов
Другое дело! Пульсации ушли, однако АЧХ фильтра стала более “заваленной”. Выбор типа окна зависит от конкретной решаемой задачи. Самые распространённые: параметрическое окно Кайзера, Чебышёва, окно Блэкмана, Хэмминга и др.
БИХ-фильтры
Основное отличие в структуре БИХ-фильтра от КИХ-фильтра — наличие обратной связи. Что такое обратная связь? Это когда на вход устройства подаётся сигнал, пропорциональный сигналу на его выходе. Таким образом, значение выходного сигнала БИХ-фильтра зависит не только от текущего и предыдущего значения входного сигнала, но и от предыдущего значения выходного сигнала. Это одновременно и плюс, и минус: наличие обратной связи позволяет значительно сократить количество отсчётов (а значит, и порядок фильтра, а как следствие – количество умножений), однако может привести к неустойчивости его работы, или вообще превратить фильтр в генератор. Из-за того, что при отсутствии входного сигнала на выходе БИХ-фильтра может генерироваться бесконечное количество отсчётов, его и прозвали фильтром с бесконечной импульсной характеристикой.
Давайте на примере сравним, сколько же потребуется коэффициентов КИХ- и БИХ-фильтра для реализации одинаковой АЧХ. Спроектируем с помощью filterDesigner два ФНЧ со следующими параметрами:
Гц — частота дискретизации;
Гц — начало спада АЧХ;
Гц — конец спада АЧХ;
дБ — пульсации в полосе пропускания;
дБ — подавление в полосе задерживания.
В результате получили два фильтра, АЧХ и ФЧХ которых представлены ниже:
| АЧХ и ФЧХ КИХ-фильтра | АЧХ и ФЧХ БИХ-фильтра |
Из рисунка видно, что АЧХ фильтров действительно схожи, однако, для реализации КИХ-фильтра нам потребовалось 222 коэффициента, а для реализации БИХ-фильтра — всего 41. Получается, что в случае с БИХ-фильтром, операций умножения требуется в 5 раза меньше.
Следует также обратить внимание на график фазы. У КИХ-фильтров ФЧХ гарантированно линейная, у БИХ-фильтров она гарантированно нелинейная, о чём нужно помнить.
Рассмотрим структуру БИХ-фильтра:

Структурная схема БИХ-фильтра
Он состоит из двух частей: прямой и обратной связи. Прямая связь повторяет структурную схему КИХ фильтра, обратная связь напоминает зеркальную копию прямой связи.
Таким образом, разностное уравнение БИХ-фильтра имеет вид:
![\begin{equation*} y[n] = \sum\limits_{i=0}^{N} b(i) \cdot x(n-i) - \sum\limits_{k=1}^{M} a(k) \cdot y(n-k), \end{equation*}](https://leonidov.su/wp-content/ql-cache/quicklatex.com-8be774d473e364fbb980013abfee0d2b_l3.png)
(5)
и
— входной и выходной сигналы соответственно;
— коэффициенты прямой связи;
— коэффициенты обратной связи;
и
— порядок прямой и обратной связи соответственно;
При проектировании БИХ-фильтров используют z-преобразование, корни которого идут от преобразования Лапласа. Второе преобразование вам точно знакомо, его должны были изучать на курсе математического анализа. Давайте вспомним, что это такое, а затем перейдём к изучению z-преобразования. Но это на следующей лекции.