31.08.2019

Фильтр с конечной импульсной характеристикой. Цифровые фильтры с конечной импульсной характеристикой (КИХ-фильтры)


Введение

Цифровой фильтр (ЦФ) - устройство, пропускающее, либо подавляющее заданные в цифровой форме сигналы в определенной полосе частот. В отличие от аналоговых фильтров, у которых входной сигнал изменяется непрерывно, в цифровых фильтрах входной сигнал представляется в дискретной форме, т. е. принимает каждый раз новое значение через интервал дискретизации. Величина, обратная этому интервалу, - частота дискретизации.

Фильтры частотной селекции - это устройства, пропускающие или подавляющие частоты определенного диапазона в составе спектра входного сигнала.

Существует четыре основных типа фильтров частотной селекции: низкочастотный, высокочастотный, полосовой и режекторный.

Цифровой фильтр частотной селекции - это наиболее известный, хорошо изученный и апробированный на практике тип ЦФ.

Выделяют два основных вида ЦФ - фильтры с конечной импульсной характеристикой (КИХ-фильтры) и с бесконечной импульсной характеристикой (БИХ-фильтры).

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

В данной работе будет рассмотрено проектирование цифровых КИХ-фильтров с помощью метода частотной выборки.

Цифровые фильтры с конечной импульсной характеристикой (КИХ-фильтры)

цифровой фильтр процессор

Термином цифровой фильтр называют аппаратную или программную реализацию математического алгоритма, входом которого является цифровой сигнал, а выходом - другой цифровой сигнал, форма которого и амплитудная и фазовая характеристики сильно модифицированы. Во многих приложениях цифровые фильтры предпочтительнее аналоговых, поскольку они позволяют более точно воплотить амплитудные и фазовые спецификации. Кроме того, для цифровых фильтров нехарактерно присущее аналоговым фильтрам изменение характеристик в зависимости от температуры и напряжения.

Цифровой фильтр можно представить некоторым функциональным блоком, на вход которого поступает входной сигнал x(n) в виде последовательности числовых отсчетов, а с выхода снимаются числовые отсчеты выходного сигнала y(n).

Порядок расчета цифрового фильтра включает четыре основных этапа:

1. Определение требуемых свойств фильтра. На данном этапе задается тип фильтра (ФНЧ, ФВЧ), нужная амплитудная или фазовая характеристика и разрешенные допуски, частота дискретизации и длина слов, которыми будут представлены входные данные.

2. Вычисление коэффициентов. На этом этапе определяются коэффициенты передаточной функции H(z) , которая удовлетворяет заданным свойствам фильтра.

3. Выбор структуры. Данный этап включает преобразование передаточной функции, полученной на предыдущем этапе, в подходящую фильтрующую структуру.

4. Проверка моделированием, удовлетворяет ли полученный фильтр заданным требованиям.

Для того чтобы реализовать цифровой фильтр, необходимо знать его частотную характеристику, передаточную функцию, а для фильтров с конечной импульсной характеристикой достаточно знания отсчетов импульсной характеристики h(n), так как каждый отсчет выходного сигнала может быть вычислен как результат свертки входного сигнала с импульсной характеристикой:

где N - порядок фильтра (длина импульсной характеристики).

Желательно иметь минимальное N, при котором еще удовлетворяются требования к частотной характеристике фильтра. Тогда для реализации фильтра потребуется меньшая вычислительная мощность, т.е. будут меньше затраты времени и памяти.

Существует два основных вида цифровых фильтров: фильтры с конечной импульсной характеристикой (КИХ-фильтры) и с бесконечной импульсной характеристикой (БИХ-фильтры).

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

Рассмотрим основные характеристики КИХ-фильтров.

Амплитудно-частотная характеристика КИХ-фильтра часто задается в виде схемы допусков. Такая схема для фильтра нижних частот показана на рисунке. Подобную схему можно получить и для других частотно-избирательных фильтров.

Основные параметры:

дp - отклонение в полосе пропускания (или неравномерность);

дs - отклонение в полосе подавления;

fp - граничная частота полосы пропускания;

fs - граничная частота полосы подавления;

Fs - частота дискретизации.

На практике удобнее выражать дp и дs в децибелах. Расстояние между fs и fp равно ширине полосы перехода фильтра. Другой важный параметр - длина фильтра N , которая определяет число коэффициентов фильтра. В большинстве случаев указанные параметры полностью определяют частотную характеристику КИХ-фильтра.

Линейная фазовая характеристика КИХ-фильтра.

Пусть {h (n)} -- физически реализуемая последовательность конечной длины, заданная на интервале 0. Ее z-преобразование равно:

Преобразование Фурье от {h (n)}:

является периодическим по частоте с периодом 2р.

Из уравнения (3) видно, что модуль преобразования Фурье является симметричной функцией, а фаза --антисимметричной функцией частоты, т.е.

На практике при расчете КИХ-фильтров часто требуется строго линейная фазовая характеристика. При этом фазовая характеристика и(щ) имеет вид:

где б -- постоянная фазовая задержка, выраженная через число интервалов дискретизации.

Условие (7) означает, что для каждого N существует только одна фазовая задержка б, при которой может достигаться строгая линейность фазовой характеристики фильтра. Из условия (8) следует, что при заданном б, удовлетворяющем условию (7), импульсная характеристика должна обладать вполне определенной симметрией.

В зависимости от значения N (нечетные или четные) и вида симметрии импульсной характеристики (симметричная или антисимметричная характеристика) возможны четыре различных вида КИХ-фильтров с линейными фазовыми характеристиками.

Таблица1. Различие четырех типов КИХ-фильтров с линейной фазовой характеристикой

цифровой обработка фильтр шум

Существует два основных типа цифровых фильтров, два программных алгоритма: фильтры с конечной импульсной характеристикой (КИХ) и фильтры с бесконечной импульсной характеристикой (БИХ). Как следует из терминологии, эта классификация относится к импульсным характеристикам фильтров.

КИХ-фильтры

Фильтр с конечной импульсной характеристикой (нерекурсивный фильтр, КИХ-фильтр) - один из видов электронных фильтров, характерной особенностью которого является ограниченность по времени его импульсной характеристики (с какого-то момента времени она становится точно равной нулю). Такой фильтр называют ещё нерекурсивным из-за отсутствия обратной связи. Знаменатель передаточной функции такого фильтра - некая константа. Изменяя веса коэффициентов и число звеньев КИХ-фильтра, можно реализовать практически любую частотную характеристику. КИХ-фильтры могут иметь такие свойства, которые невозможно достичь методами аналоговой фильтрации (в частности, совершенную линейную фазовую характеристику). Но высокоэффективные КИХ-фильтры строятся с большим числом операций умножения с накоплением и поэтому требуют использования быстрых и эффективных процессоров.

При нулевых значениях коэффициентов am уравнение (2.2) переходит в уравнение линейной дискретной свертки функции x(k) с оператором bn:

y(k) = bn x(k-n). (2.3)

Значения выходных отсчетов свертки (2.3) для любого аргумента k определяются текущим и "прошлыми" значениями входных отсчетов. Такой фильтр и называется нерекурсивным цифровым фильтром (НЦФ). Интервал суммирования по n получил название "окна" фильтра. Окно фильтра составляет N+1 отсчет, фильтр является односторонним каузальным, т.е. причинно обусловленным текущими и "прошлыми" значениями входного сигнала, и выходной сигнал не может опережать входного. Каузальный фильтр может быть реализован физически в реальном масштабе времени. При k

При обработке данных на ЭВМ ограничение по каузальности снимается. В программном распоряжении фильтра могут находиться как "прошлые", так и "будущие" значения входной последовательности отсчетов относительно текущей точки вычислений k, при этом уравнение (2.3) будет иметь вид:

y(k) =bn x(k-n). (2.4)

При N" = N фильтр называется двусторонним симметричным. Симметричные фильтры, в отличие от односторонних фильтров, не изменяют фазы обрабатываемого сигнала.

Реакция НЦФ на единичный входной импульс (а равно и на любой произвольный входной сигнал) всегда конечна и ограничена размером окна фильтра, поэтому такие фильтры и называют фильтрами с конечной импульсной характеристикой (КИХ-фильтры).

Техника выполнения фильтрации не отличается от техники выполнения обычной дискретной свертки двух массивов данных.

Представим, что на одной полоске бумаги выписаны по порядку сверху вниз значения данных x(k) ? sk (см. рис. 6). На второй полоске бумаги находятся записанные в обратном порядке значения коэффициентов фильтра bn ? hn (обозначение h для коэффициентов операторов НЦФ является общепринятым). Для вычисления yk ? y(k) располагаем вторую полоску против первой таким образом, чтобы значение h0 совпало со значением sk, перемножаем все значения hn с расположенными против них значениями sk-n, и суммируем все результаты перемножения. Результат суммирования является выходным значением сигнала yk. Сдвигаем окно фильтра - полоску коэффициентов hk, на один отсчет последовательности sk вниз (или массив sk сдвигаем на отсчет вверх) и вычисляем аналогично следующее значение выходного сигнала, и т.д.

Рис.6.

Описанный процесс является основной операцией цифровой фильтрации, и называется сверткой в вещественной области массива данных с оператором фильтра. Для математического описания наряду с формулами (2.3 и 2.4) применяются символические формы записи фильтрации:

y(k) = b(n) * x(k-n) b(n) ? x(k-n).

Сумма коэффициентов фильтра определяет коэффициент передачи (усиления) средних значений сигнала в окне фильтра и постоянной составляющей в целом по массиву данных (с учетом начальных и конечных условий). Как правило, сумма коэффициентов фильтра нормируется к 1.

Для операции фильтрации характерны следующие основные свойства:

  • · Дистрибутивность: h(n) ? = h(n) ? a(k)+h(n) ? b(k).
  • · Коммутативность: h(n) ? a(k) ? b(k) = a(k) ? b(k) ? h(n).
  • · Ассоциативность: ? h(n) = h(n) ? a(k) ? b(k).

Фильтрация однозначно определяет выходной сигнал y(k) для установленного значения входного сигнала s(k) при известном значении импульсного отклика фильтра h(n).

Имеется целый ряд методов обработки данных, достаточно давно и широко известных, которые по существу относятся к методам цифровой фильтрации, хотя и не называются таковыми. Например, методы сглаживания отсчетов в скользящем окне постоянной длительности. Так, для линейного сглаживания данных по пяти точкам с одинаковыми весовыми коэффициентами используется формула:

yk = 0.2(xk-2+xk-1+xk+xk+1+xk+2).

С позиций цифровой фильтрации это не что иное, как двусторонний симметричный нерекурсивный цифровой фильтр:

yk =bn xk-n, bn = 0,2. (2.5)

Пример: Дано уравнение НЦФ: bn=0.2.

Начальные условия - нулевые.

Входной сигнал - скачок функции (ступень): xk = {0,0,0,0,0,0,10,10,10,10,…}.

Выходной сигнал: yk = {0,0,0,0,2,4, 6, 8,10,10,10,10,…}.

Результат фильтрации приведен на рисунке 7:

КИХ-фильтры обладают рядом полезных свойств, из-за которых они иногда более предпочтительны в использовании, чем БИХ-фильтры. Например:

  • 1. КИХ-фильтры устойчивы.
  • 2. КИХ-фильтры при реализации не требуют наличия обратной связи.
  • 3. Фаза КИХ-фильтров может быть сделана линейной

Материал из Модулярная арифметики

Фильтр с конечной импульсной характеристикой (Нерекурсивный фильтр , КИХ-фильтр ) или FIR-фильтр (FIR сокр. от finite impulse response - конечная импульсная характеристика) - один из видов линейных цифровых фильтров, характерной особенностью которого является ограниченность по времени его импульсной характеристики (с какого-то момента времени она становится точно равной нулю). Такой фильтр называют ещё нерекурсивным из-за отсутствия обратной связи. Знаменатель передаточной функции такого фильтра - некая константа.

Динамические характеристики

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

Для того, чтобы найти ядро фильтра положим

где - дельта-функция. Тогда импульсная характеристика КИХ-фильтра может быть записана как:

Z-преобразование импульсной характеристики даёт нам передаточную функцию КИХ-фильтра:

Свойства

КИХ-фильтр обладает рядом полезных свойств, из-за которых он иногда более предпочтителен в использовании, чем БИХ-фильтр. Вот некоторые из них:

  • КИХ-фильтры устойчивы.
  • КИХ-фильтры при реализации не требуют наличия обратной связи.
  • Фаза КИХ-фильтров может быть сделана линейной

Прямая форма КИХ фильтра

КИХ фильтры могут быть реализованы с использованием трех элементов: умножитель, сумматор и блок задержки. Вариант, показанный на рисунке, есть прямая реализация КИХ-фильтров типа 1.

Пример программ

Построение КИХ-фильтров

Построение КИХ-фильтров заключается в выборе коэффициентов фильтра таким образом, чтобы полученная система имела требуемые характеристики. Чаще всего фильтр строят по заданной амплитудно-частотной характеристике. Существуют разные методы построения КИХ-фильтров:

Программные пакеты такие как MATLAB, GNU Octave, Scilab, и SciPy реализуют описанные выше методы.

Некоторые спецификации на фильтр представляют собой форму входного сигнала во временной области, которую фильтр должен "распознавать". Оптимальный согласованный фильтр для выделения сигнала любой формы из белого шума получается путём дискретизации требуемой формы сигнала и использования полученных коэффициентов в обратном порядке в качестве коэффициентов фильтра - импульсная характеристика полученного фильтра является зеркальным отражением по времени требуемой формы входного сигнала.

Построение методом окна

В данном методе сначала строится идеальный БИХ-фильтр, затем к нему применяется Функция окна – во временной области, умножением бесконечной импульсной характеристики на функцию окна. Затем выполняется свёртка полученного результата с откликом на функцию окна. Если идеальная АЧХ достаточно проста, например, как прямоугольный отклик, результат свёртки можно сравнительно легко определить. На самом деле обычно сначала определяют требуемый результат и решают обратную задачу определения подходящей функции окна. Для этого метода особенно хорошо подходят окна Кайзера.

Пример КИХ-фильтра

Примером простого КИХ-фильтра может служить скользящее среднее, используемое для обработки сигналов и изображений, системах автоматического управления и для других прикладных целей. Разностное уравнение, которое характеризует фильтр скользящее среднее, является уравнением КИХ-фильтра. Пусть - входной сигнал фильтра, - выходной сигнал. Тогда разностное уравнение будет иметь вид:

Отличительной особенностью скользящего среднего является равенство единице суммы коэффициентов .

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

БИХ-фильтр (фильтр с бесконечной импульсной характеристикой), или рекурсивный, - это фильтр, входной и выходной сигналы которого удовлетворяют многомерному разностному уравнению конечного порядка. Такие фильтры могут быть как устойчивыми, так и неустойчивыми, однако во многих случаях они оказываются проще в реализации, чем эквивалентные КИХ-фильтры. Синтез двумерного рекурсивного фильтра радикально отличается от синтеза одномерного фильтра. Отчасти это связано с возрастанием сложности обеспечения устойчивости. Разностные уравнения и БИХ-фильтры составляют предмет гл. 4 и 5.

Одно из важнейших преимуществ КИХ-фильтров перед БИХ-фильтрами заключается в возможности синтеза и практической реализации КИХ-фильтров с чисто вещественными частотными откликами. Такие фильтры называются фильтрами с нулевой фазой. В частотной области условие нулевой фазы можно выразить следующим образом:

Выполнив обратное преобразование Фурье от обеих частей равенства (3.1), для импульсного отклика фильтра с нулевой фазой получим требование симметрии в пространственной области

. (3.2)

Очевидно, что КИХ-фильтр может удовлетворять этому условию, если центр его опорной области совпадает с началом координат.

Фильтры с нулевой фазой важны для многих приложений цифровой обработки многомерных сигналов. Например, при обработке изображений фильтры с ненулевой фазой могут привести к разрушению линий и границ. Чтобы понять, почему это так, вспомним из нашего обсуждения преобразований Фурье, что любой сигнал можно представить в виде суперпозиции комплексных синусоид. Линейный инвариантный к сдвигу фильтр с нетривиальным частотным откликом будет избирательно усиливать или ослаблять некоторые из этих синусоидальных компонент, а также задерживать некоторые компоненты по отношению к другим. На любой частоте величина задержки зависит от значения фазового отклика. Нелинейный (разовый отклик приводит, таким образом, к рассеянию строго согласованных синусоидальных компонент сигнала, составляющих контрастные точки, линии и границы.

Фильтр с нулевой фазой имеет и другие преимущества. В силу вещественности его частотного отклика упрощается синтез фильтра. К тому же симметрию импульсного отклика фильтра можно использовать при его реализации для уменьшения требуемого числа умножений.

В этой статье на примере простого проекта цифрового фильтра с конечной импульсной характеристикой обсуждаются некоторые ключевые особенности архитектуры процессоров Blackfin, повышающие производительность в задачах цифровой обработки сигналов. А также рассмотрен вопрос интерфейса между отдельными частями кода, написанными на языке ассемблера и языке C/C++.

Все статьи цикла:

Цифровые КИХ-фильтры

Цифровая фильтрация является одной из самых распространенных операций в задачах цифровой обработки сигналов. Цифровые фильтры бывают двух типов - с конечной импульсной характеристикой (КИХ-фильтры) и с бесконечной импульсной характеристикой (БИХ-фильтры). Основное их отличие состоит в том, что выходной сигнал КИХ-фильтров определяется только входными отсчетами и набором коэффициентов, а выходной сигнал БИХ-фильтров зависит также от значений выходных отсчетов в предшествующие моменты времени. КИХ-фильтры более просты с точки зрения анализа и реализации, и именно этот тип фильтров мы будем рассматривать.

Структурная схема КИХ-фильтра изображена на рис. 1. Как можно видеть, выходной сигнал фильтра представляет собой взвешенную сумму конечного числа отсчетов входного сигнала. Весовые коэффициенты, определяющие импульсную характеристику фильтра, называются коэффициентами фильтра. Сигнал на выходе КИХ-фильтра во временной области описывается при помощи свертки входного сигнала с набором коэффициентов:

где у[к] - отсчет выходного сигнала в момент времени t = kT S ; x - отсчет входного сигнала в момент времени t = (k–n)T S ; h(n) - n-й коэффициент фильтра; N - порядок фильтра; а Т S - интервал дискретизации входного сигнала.

Из этой формулы следует, что вычисление отдельно взятого выходного отсчета КИХ-фильтра сводится к выполнению в цикле перемножения двух чисел (входного отсчета и коэффициента) и накопления результата. Наличие выделенного аппаратного блока, осуществляющего операцию умножения двух операндов и накопления результата в выходном регистре (Multiply-Accumulate, MAC) за один процессорный цикл, является характерным свойством любого цифрового сигнального процессора, однако помимо этого цифровые сигнальные процессоры имеют еще целый ряд свойств, направленных на дальнейшую оптимизацию вычисления свертки. К ним относятся циклическая адресация буферов в памяти, аппаратная поддержка циклов, наличие многофункциональных команд, возможность одновременной выборки нескольких операндов из памяти за один процессорный цикл и многофункциональные команды. Стоит отметить, чтообсуждаемые архитектурные особенности повышают эффективность не только при создании цифровых фильтров, но и во многих других задачах цифровой обработки сигналов. Далее мы подробно рассмотрим каждое из этих свойств на примере архитектуры процессоров Blackfin.

Рис. 1. Структурная схема КИХ-фильтра

Циклическая адресация

Циклическая адресация - это один из специализированных режимов адресации процессора, который может быть использован для организации цифровых линий задержки. Поддержка циклической адресации позволяет программисту настраивать в памяти процессора циклические (кольцевые) буферы и автоматически, без программного вмешательства выполнять адресацию их элементов со смещением указателя. Генератор адресов в процессоре может работать со смещениями, отличными от единицы, и, что более важно, автоматически выполняет возврат к началу буфера при выходе за его границу, как показано на рис. 2. В случае обычной линейной адресации для организации циклического буфера потребовалось бы при каждом положительном (отрицательном) приращении указателя сравнивать его значение с адресом последней (первой) ячейки буфера, что неизбежно привело бы к непроизводительным издержкам.

Рис. 2. Адресация циклических буферов

Для реализации циклических буферов в процессоре ВЪскйп имеется четыре набора специализированных регистров:

  • Индексные регистры (10-13), которые содержат значение, выдаваемое генератором адресов данных на шину адреса процессора.
  • Регистры модификации (М0-М3), которые определяют величину положительного или отрицательного приращения индексного регистра, выполняемого после каждого обращения к памяти.
  • Регистры длины L0-L3), которые определяют размер циклического буфера и диапазон адресов индексных регистров.
  • Регистры базового адреса (В0-В3), в которых хранится адрес первого элемента циклического буфера.

Каждая пара регистров В и L всегда используется только совместно с соответствующим регистром I (например, В0, L0, 10). На регистры М это правило не распространяется, и они могут быть использованы с любым из регистров I.

Рассмотрим, как этот режим адресации применяется для программной реализации КИХ-фильтров. В операции вычисления каждого выходного отсчета КИХ-фильтра участвует текущий входной отсчет и N-1 предыдущих входных отсчетов (N - порядок фильтра). То есть циклический буфер для линии задержки сигнала, равно как и буфер, в котором хранятся коэффициенты, должен иметь N элементов. Как показано на рис. 3, очередной принимаемый входной отсчет x[k], соответствующий моменту времени kТ S , записывается в ячейку буфера линии задержки (буфер А) с номером j поверх содержащегося в ней самого старого отсчета x, соответствующего моменту времени (k–N)T S . При этом указатель буфера А смещается на одну позицию, так что при первом чтении буфера А из памяти будет выбран отсчет x.

Указатель буфера коэффициентов (буфер В) на данном этапе не изменяется и должен указывать на первый элемент буфера, в котором хранится последний коэффициент фильтра, h[N]. После выполнения N операций чтения данных из буферов А и В, необходимых для вычисления выходного отсчета y[k], указатель В возвращается на исходную позицию (в начало буфера), а указатель А будет указывать на ячейку, где хранится отсчет x. Следует учесть, что, в общем случае, как показано на рис. 3, значения в буфер коэффициентов должны записываться в порядке, обратном реальному порядку следования коэффициентов фильтра. То есть в первой ячейке буфера должен храниться последний коэффициент фильтра, во второй ячейке - предпоследний коэффициент и т. д. Однако в большинстве ситуаций на практике предпочтительнее использовать КИХ-фильтры с симметричными коэффициентами, имеющие линейную фазовую характеристику, и в таком случае подобное упорядочивание не требуется.

Рис. 3. Буферы линии задержки и коэффициентов КИХ-фильтра

Аппаратные циклы

Еще одна особенность цифровых сигнальных процессоров в целом и процессоров Віаскйп в частности, которая используется для повышения производительности при реализации цифровых фильтров, - это аппаратная поддержка циклов. Для многих алгоритмов цифровой обработки сигналов характерно повторяющееся выполнение одинаковых операций над массивами данных. В случае применения КИХ-фильтра - это операции выборки из памяти отсчета входного сигнала и коэффициента фильтра, их перемножение и накопление результата в регистре.

Для организации программных циклов без непроизводительных издержек в процессоре Blackfin имеется два набора регистров адреса начала цикла (LT0, LT1), адреса конца цикла (LB0, LB1) и счетчика цикла (LC0, LC1). Наличие двух наборов регистров позволяет реализовывать не только одиночные, но и вложенные двухуровневые циклы. При этом цикл 1, настраиваемый при помощи регистров LT1, LB1 и LC1, имеет больший приоритет (внутренний цикл). При написании программ на языке ассемблера каждый из трех регистров цикла может быть инициализирован по отдельности, однако удобнее использовать для этой цели специальную команду LSETUP, которая имеет формат:

LSETUP(loop_start, loop_end) LCx = preg;

Здесь loop_start - метка, отмечающая начало цикла, или непосредственное значение смещения первой команды цикла относительно команды LSETUP; loop_end - метка, отмечающая конец цикла, или непосредственное значение смещения последней команды цикла относительно команды LSETUP; reg - один из регистров указателей P0-P5.

Пример настройки одиночного цикла без вложения:

LSETUP(lp_start, lp_end) LCO = P5;

... //Одна или несколько команд цикла

lp_end: ... //Последняя команда цикла

Дополнительное повышение производительности при выполнении циклов в процессоре достигается благодаря специальному буферу команд цикла глубиной четыре элемента. Если код цикла содержит не более четырех команд, то, независимо от количества итераций, обращений к памяти не потребуется, поскольку команды будут выбираться из буфера цикла.

Оптимальное размещение данных

Для максимально эффективного выполнения операции умножения с накоплением необходимо, чтобы процессор мог за один процессорный цикл выбирать из памяти команду и два операнда (в случае применения КИХ-фильтра - отсчет из линии задержки сигнала и коэффициент фильтра). В разных сигнальных процессорах эта возможность достигается по-своему. Так, например, в самых первых сигнальных процессорах Analog Devices ADSP-21xx (вплоть до ADSP-219x), имеющих классическую модифицированную гарвардскую архитектуру, данные могут храниться как в памяти данных, так и в памяти программ, а обращение к памяти программ происходит на удвоенной частоте (в первой половине процессорного цикла происходит выборка команды, а во второй - слова данных). Процессоры ADSP-219x и ADSP-2106x/2116x также основаны на модифицированной гарвардской архитектуре, однако вместо обращения к памяти программ на удвоенной частоте в них используется аппаратный кэш команд. Таким образом, за один процессорный цикл в этих процессорах может выполняться выборка одного операнда из памяти данных, одного операнда из памяти программ и команды из кэша.

В процессорах Blackfin в памяти программ могут содержаться только команды, однако память данных состоит из двух банков, каждый из которых, в свою очередь, разделен на несколько блоков. Сложная структура внутренних шин позволяет одновременно обращаться к любой паре таких блоков за один цикл. Таким образом, для оптимизации обращений к памяти при выполнении свертки в процессорах Blackfin следует разместить массивы линии задержки и коэффициентов фильтра в разных блоках памяти. Для этого необходимо сделать две вещи. Во-первых, при написании кода на языке ассемблера или языке C необходимо в явном виде указать, что массивы должны помещаться в разные секции генерируемого объектного кода (входные секции). Во-вторых, в файле описания линкера (Linker Description File, LDF) необходимо надлежащим образом установить соответствие между входными секциями и сегментами физической памяти процессора.

Размещением команд и данных во входные секции при написании программ на языке ассемблера управляет директива:

SECTION section_name;

Здесь section_name - это имя входной секции. Все переменные или команды, которые следуют в тексте программы за этой директивой, будут располагаться во входной секции с указанным именем. При создании программ на языках C/C++ для этих же целей используется квалификатор section("section_name"), который добавляется при объявлении переменной или функции перед указанием ее типа. По умолчанию компилятор C/C++ процессоров Blackfin использует следующие имена секций: program для кода программы, datai для глобальных и статических переменных, constdata для переменных, объявленных как const, bsz для глобальных переменных, инициализированных нулями, stack для хранения стека и, наконец, heap для «кучи» (динамически выделяемой памяти).

Файл описания линкера содержит управляющие директивы, которые используются на этапе компоновки для формирования исполняемого файла. Как и объектные файлы, исполняемые файлы разбиваются на выходные секции, привязанные к карте памяти процессора. В файле LDF определяется соответствие между входными и выходными секциями, а также приводится дополнительная информация, необходимая для компоновки.

Типовой файл LDF имеет следующую структуру (рис. 4).

  • Команда ARCHITECTURE{ADSP-xxxxx} задает архитектуру процессора, для которого формируется исполняемый файл. Эта команда естественным образом диктует возможную разрядность и диапазон памяти, набор регистров и другую информацию, используемую отладчиком, линкером и загрузчиком.
  • Команда SEARCH_DIR{} указывает пути для поиска библиотек и объектных файлов.
  • При помощи команды $LIBRARIES программист указывает набор библиотек и объектных файлов, в которых линкер будет осуществлять поиск символов, на которые существуют ссылки в исходных файлах.
  • С помощью макроса $OBJECTS задается список входных файлов, в которых линкер будет искать компонуемые объекты. Макросы упрощают чтение LDF-файла, позволяя вместо многократных перечислений одних и тех же имен файлов использовать более компактные записи. Например, запись вида:

$OBJECTS = main.doj, fft.doj;

dxe_program {INPUT_SECTIONS ($DOJS(program))} > mem_

эквивалентна следующей записи:

INPUT_SECTIONS (main.doj(program)

fft.doj(program))} > mem_program

  • Команда MEMORY{} описывает физическую память разрабатываемой системы. Каждая из строк, являющихся ее аргументами, задает имя, границы, разрядность и тип сегмента памяти. Имена сегментов образуют отдельное пространство имен и могут, в общем случае, пересекаться с именами входных или выходных секций. Команда PROCESSOR формирует исполняемый DXE-файл. Аргументами команды PROCESSOR являются команда OUTPUT, задающая имя выходного файла, и команда SECTIONS{}, которая непосредственно управляет размещением отдельных объектов из объектных и библиотечных файлов в физической памяти системы. Аргументы команды SECTIONS{} имеют следующий синтаксис:

имя_выходной_секции [тип_секции] {команды/выражения} [>сегмент_памяти]

В рассматриваемом примере используется команда INPUT_SECTЮNS, которая указывает линкеру, какие из входных секций необходимо поместить в конкретную выходную секцию и отобразить в заданный сегмент памяти.

Рис. 4. Структура файла LDF

В состав VisualDSP++ входят стандартные файлы LDF для каждого из процессоров, которые автоматически подключаются к проекту, если пользователь не добавил в него свой собственный LDF-файл, и определяют соответствие между упомянутыми выше входными секциями, используемыми по умолчанию, и выходными секциями/сегментами памяти.

Многофункциональные команды и вычисления в режиме SIMD

Для максимально эффективного использования аппаратных ресурсов процессора могут быть использованы многофункциональные команды. Процессор Blackfin не является суперскалярным, однако он допускает параллельный вызов до трех команд, с некоторыми ограничениями. Подобные составные многофункциональные команды, которые также называют векторными, имеют длину 64 бита и состоят из одной 32-битной и двух 16-битных команд. Время исполнения многофункциональной команды будет определяться временем исполнения самой медленной из них.

Первой командой, как правило, является команда умножителя или АЛУ. Иногда в качестве первой команды используется команда MNOP - 32-битная версия команды NOP (No Operation - «Нет операции»). В качестве 16-битных команд могут использоваться команды загрузки значения в регистр из памяти, сохранения значения регистра в память или модификации индексного регистра, а также обычная 16-битная команда NOP. На применение данных команд накладывается целый ряд ограничений, которые подробно описаны в руководстве по программированию процессоров Blackfin (Blackfin Processor Programming Reference). В тексте программы на языке ассемблера отдельные команды, входящие в состав многофункциональной, разделяются двумя вертикальными чертами ("11").

С точки зрения реализации цифрового КИХ-фильтра интерес представляет многофункциональная команда, совмещающая в себе операцию умножения с накоплением в регистре аккумулятора и две операции загрузки регистров данных из памяти с модификацией индексных регистров. Эта команда имеет общий вид типа:

Ax += Dreg_lo_hi * Dreg_lo_hi || Dreg = || Dreg = ;

Здесь Ax - это регистр аккумулятора (A0 или A1), Dreg - один из регистров регистрового файла данных (Ry, y = 0-7), Dreg_lo_hi - младшая или старшая половина регистра, Ireg - индексный регистр (Iz, z = 0-3). При использовании подобной многофункциональной команды для вычисления свертки удобно выполнить первую загрузку данных до входа в цикл, а последнюю операцию умножения с накоплением - после выхода из цикла. Тогда цикл будет включать в себя только указанную выше команду.

И наконец, поскольку в состав ядра процессора Blackfin входят два идентичных вычислительных блока, он может выполнять сразу две операции умножения-накопления за один процессорный цикл над четырьмя входными операндами в режиме SIMD (одна команда, разные данные). Такой режим позволяет в два раза уменьшить количество итераций, необходимых для вычисления одного выходного отсчета обычного КИХ-фильтра, или реализовать эффективную обработку двух потоков данных (например, комплексного сигнала и стереофонического аудиосигнала). Пример команды, осуществляющей одновременно две операции умножения-накопления:

A1 += R1.H * R2.L, A0 += R1.L * R2.H;

В первой операции старшая половина 32-битного регистра R1 умножается на младшую половину 32-битного регистра R2 и складывается с содержимым аккумулятора А1. Во второй операции младшая половина регистра R1 умножается на старшую половину R2 и складывается с содержимым аккумулятора АО.

Помимо рассмотренной выше команды, существует также много других векторных команд, сочетающих вычислительные команды АЛУ и умножителя с командами загрузки/сохранения или командами модификации индексных регистров.

Описанные выше архитектурные особенности будут использованы в проекте цифрового фильтра для платы EZ-KIT, который будет рассматриваться во второй части статьи.