Программирование сигнальных процессоров компании Analog Devices в среде VisualDSP++.
Цифровая фильтрация
Цифровая фильтрация является важнейшей областью цифровой обработки сигналов. В первую очередь цифровые фильтры отличаются высоким качеством формирования частотной характеристики, стабильностью параметров, простотой изменения параметров амплитудно-частотной характеристики и возможностью адаптации параметров фильтра. Наиболее полно эти преимущества используются в таких областях, как подавление различного рода шумов и помех, распознавание речи, и в особенности для подавления эха в устройствах передачи данных. В рамках этой статьи будут кратко рассмотрены общие подходы к проектированию и реализации цифровых фильтров на базе процессоров ADSP фирмы Analog Devices, а также пример реализации адаптивного цифрового фильтра с использованием отладочного комплекта ADDS-2181-EZ-KIT-LITE. Эти программы были реализованы совместно специалистами лдной из групп, проходивших подготовку, и преподавателями центра.
Структура и реализация цифровых КИХ-фильтров
Различают два основных типа фильтров. Цифровые фильтры с конечной импульсной характеристикой (КИХ) реализуются путем весового суммирования N предшествующих отсчетов входного сигнала. Выходной сигнал фильтра y(n) имеет вид
где hk — весовые коэффициенты фильтра, x(n–k) — отсчеты входного сигнала.
Цифровые фильтры с бесконечной импульсной характеристикой (БИХ) используют входной x(n–k) и выходной y(n–k) сигналы. Выходной сигнал такого фильтра описывается уравнением
где bk и ak — весовые коэффициенты фильтра.
Цифровые фильтры БИХ требуют меньших вычислительных затрат по сравнению КИХ, однако они имеют нелинейную фазовую характеристику и при определенных условиях становятся неустойчивыми.
Фильтры КИХ при симметричном выборе весовых коэффициентов hk имеют линейную фазовую характеристику и поэтому находят широкое применение в высококачественной аппаратуре. Если фильтр КИХ используется для децимации (понижения) частоты дискретизации в n раз, то вычислительные затраты также снижаются в n раз.
Рассмотрим основные методы проектирования цифровых фильтров КИХ. Для обработки сигналов во многих случаях требуется иметь частотную характеристику, близкую к прямоугольной. Для получения прямоугольной амплитудно-частотной характеристики требуется фильтр с бесконечной импульсной характеристикой, которая физически не реализуема.
Для того чтобы ограничить длину импульсной характеристики фильтра, используется метод окна. В практике проектирования фильтров используются окна Хэннинга, Хэмминга, Блэкмана и Кайзера. Эти окна различаются скоростью спада на границах импульсной характеристики и достижимым уровнем ослабления в полосе задержания. Очень подробно этапы проектирования описываются в книге «Теория и применение ЦОС» (Рабинер Л., Голд Б. М. Мир. 1978).
Метод окна является эмпирическим и не гарантирует достижение оптимальных результатов. Используя методы линейного программирования, Ремеза или Паркс-мак-Клеллана можно получить частотные характеристики более высокого качества. Наиболее известные и описанные в литературе методы проектирования фильтров содержатся в пакете QED-2000. Это достаточно известный программный продукт, предназначенный для разработки цифровых фильтров и обладающий удобным пользовательским интерфейсом. Кроме него могут быть использованы и другие программы, например MatLab.
При проектировании цифрового фильтра необходимо задать следующие параметры:
- Неравномерность частотной характеристики в полосе пропускания фильтра. Обычно уровень пульсаций характеристики составляет десятые доли дБ.
- Ширину переходной области между границами полос пропускания и задержания. Эта ширина определяет крутизну ската характеристики фильтра и составляет десятки процентов от ширины полосы пропускания.
- Величину ослабления в полосе задержания, составляющую обычно десятки дБ.
Количество звеньев фильтра N возрастает при снижении пульсаций в полосе пропускания, повышении крутизны ската частотной характеристики и увеличении ослабления сигнала в полосе задержания.
Проектирование фильтра с помощью пакета QED-2000 начинается с выбора с помощью окна Design необходимого фильтра (КИХ или БИХ) и метода проектирования. Затем производится выбор вида характеристики (ФНЧ, ФВЧ, полосовой и т. д.), задание частот, пульсаций и ослабления. После задания параметров фильтра происходит вычисление числа звеньев фильтра N, его весовых коэффициентов и графиков частотной и фазовой характеристик, весовой функции и переходного процесса.
Сложность вычислительной реализации фильтра определяется числом звеньев N. В цифровых сигнальных процессорах фирмы Analog Devices для вычисления отсчета y(n) требуется приблизительно N команд. Поэтому следует проверить возможность реализации такого числа операций за период дискретизации сигнала. Например, при частоте дискретизации сигнала 8 кГц период составляет 125 мкс. При частоте выполнения команд 50 MГц число команд, выполненных за период дискретизации равно 6250 и необходимо выполнить условие N<6250. Практически требуется иметь некоторый запас команд для обработки прерываний при вводе и выводе данных из процессора. Если фильтр получается слишком сложным, приходится снижать одно из требований к частотной характеристике и проводить расчет заново.
После получения фильтра с необходимой характеристикой формируем файл коэффициентов с помощью окна Output и Create Coefficient Dataset. На этом этапе мы имеем набор коэффициентов, описывающих импульсную характеристику проектируемого нами фильтра.
Следующим этапом является практическая программная реализация этого фильтра. В данном примере для реализации алгоритма используется процессор серии ADSP-2181 компании Analog Devices. Этот выбор обусловлен тем, что на сегодня это один из массовых и доступных процессоров обработки сигналов. Кроме того, он имеет оптимизированную архитектуру ядра, в том числе для задач цифровой фильтрации. В данных примерах используются такие возможности процессора, как:
- Раздельная организация памяти данных и программ, то есть возможность выборки двух операндов за один цикл.
- Аппаратная поддержка организации циклических буферов.
- Возможность использования многофункциональных команд, которые в частности за один цикл позволяют выполнить следующие действия: умножение, сложение, выборку данных, обновление двух указателей на следующие данные и т. д.
Все эти возможности полностью использованы в приведенной ниже программе.
При программировании фильтра КИХ длиной N в памяти процессора организуются два буфера длиной N для хранения данных the_data (в памяти данных DM) и коэффициентов фильтра fir1_coefs (в памяти программы PM). В буфер коэффициентов вводятся данные из соответствующего файла fir4.dat. Благодаря использованию двух секций памяти считывание данных и коэффициентов выполняется одновременно в одном цикле процессора. Вычисление весовой суммы выполняется с помощью многофункциональной команды, состоящей из умножения с накоплением в аккумуляторе MR и двух обращений к памяти (данных и программы). Так как данные из регистров умножителя MX0 и MY0 считываются в начале выполнения команды, а новые данные поступают в конце выполнения команды, перед запуском цикла необходимо ввести первые значения данных и коэффициентов, а последнее умножение с накоплением выполняется дополнительной командой после завершения цикла. Таким образом, для получения весовой суммы из N слагаемых выполняется цикл из N-1 шага и дополнительное умножение с накоплением вне цикла.
.GLOBAL sub;
.GLOBAL in_out;
#define taps 121
.SECTION/DM buf_var2;
.var/circ the_data[taps]; /*буфер данных фильтра*/
.SECTION/PM pm_da;
.var/circ fir1_coefs[taps] = «fir4.dat»; /*буфер коэффициентов*/
.SECTION/PM seg_code;
sub: /* подпрограмма инициализации */
imask = b#0000100001; /*прерывание приема SPORT0 */
/* организация циклического буфера */
i0=the_data; m0=1; l0=taps;
i4=fir1_coefs; m4=1; l4=taps;
rts;
in_out:
/* основная программа обработки */
sr1 = dm (rx_buf + 1); /*прием сигнала*/
dm(i0,m0)=sr1; /*запись сигнала в буфер*/
cntr=taps-1; /*установка числа циклов*/
mr=0, mx0=dm(i0,m0), my0=pm(i4,m4);
/* основной цикл фильтра */
do firloop until ce;
firloop: mr=mr+mx0*my0(ss), mx0=dm(i0,m0), my0=pm(i4,m4);
mr=mr+mx0*my0(rnd); /*выполнение N-го
умножения-накопления*/
if mv sat mr;
dm (tx_buf + 1) = mr1;
rts;
|
Подпрограмма реализации КИХ-фильтра
Полная версия данного примера находится в каталоге примеров, созданном после установки VisualDSP++. Для начала работы с ним необходимо открыть файл проекта Fir.dpj из каталога \\Visualdsp\218x\EZ-KITs\2181\Examples\ FIRDEMO. Затем необходимо скомпилировать программу и загрузить
ее в отладочную плату. Запустив ее на выполнение и подав внешний сигнал с генератора, можно оценить амплитудно-частотную характеристику полученного фильтра. Необходимо хорошо разобраться в том, как реализованы и работают эти программы — это необходимо для правильного понимания последующих примеров.
Структура адаптивного фильтра
Структура КИХ-фильтра удобна для построения алгоритмов адаптивных фильтров. В качестве примера реализации адаптивного фильтра рассмотрим использование фильтра КИХ для коррекции искажений в канале связи при цифровой передаче данных. На рис. 1 представлена общая модель, использующаяся при проектировании алгоритмов адаптивной фильтрации.
Перед началом передачи данных и периодически в процессе передачи, при необходимости, производится настройка фильтра путем сравнения эталонного тестового сигнала с принятым сигналом и полученная разность e(n) используется для формирования адаптированных коэффициентов фильтра. Затем начинается прием информации и для адаптации используется сигнал на выходах декодера и адаптивного фильтра.
Алгоритм адаптации реализован с использованием алгоритма стохастического градиента. Ошибка адаптации e(n) определяется как разность тестового сигнала и выхода фильтра
Коррекция параметров фильтра выполняется по правилу
Скорость коррекции определяется параметром b. При определении значения b выбирают оптимум между скоростью адаптации и влиянием флуктуационных ошибок.
Формирование эталонного и искаженного сигналов
Для демонстрации возможностей этого алгоритма были составлены программы формирования тестовой последовательности, то есть входного сигнала с помехой типа переотражения и адаптивный фильтр на основе стохастического градиента. В качестве тестового сигнала используется сумма синусоидальных сигналов, моделирующих стандартные виды модуляции, используемые в современных модемах. Для формирования помехи использовался этот же сигнал, задержанный по фазе и уменьшенный по амплитуде. Изменение коэффициентов задержки и амплитуды позволило моделировать величину искажений, вносимых в эталонный сигнал, и оценивать возможности фильтра по их коррекции.
Программа формирования тестовой последовательности содержит в буфере string кодовую последовательность, задающую тестовый сигнал, которая проходит фильтр КИХ из 7 звеньев для устранения межсимвольной интерференции. Затем с помощью буфера filtr формируется задержанный на 4 такта сигнал помехи. С помощью прерывания IRQE в регистре AX1 записывается +1 или –1. В зависимости от значения AX1 включаются или выключаются помеха и флаг, зажигающий сигнальный диод. В передающие регистры кодека поступают опорный сигнал и сигнал с помехой типа переотражения. Ниже приведен фрагмент кода программы, формирующей эталонный и искаженный сигнал.
.GLOBAL in_out;
#define taps 200
.SECTION/DM buf_var2;
.var/circ the_data[7]; /*буфер данных формирующего
фильтра*/
.var/circ filtr[taps]; /*буфер данных*/
.SECTION/PM pm_da;
.var/circ fir1_coefs[7]= «sinf.dat»; /*буфер коэф-тов
формирующего фильт-
ра*/
.var/circ string[taps] = «string.dat»; /*буфер кодовой
последовательности*/
.SECTION/PM seg_code;
in_out:
/*обработка кодовой последовательности формирующим
фильтром для устранения межсимвольной интерференции*/
sr1 = pm (i7,m4);
dm(i0,m0)=sr1;
cntr=6;
mr=0, mx0=dm(i0,m0), my0=pm(i4,m4);
do fir1loop until ce;
fir1loop: mr=mr+mx0*my0(ss), mx0=dm(i0,m0),
my0=pm(i4,m4);
mr=mr+mx0*my0(rnd);
if mv sat mr;
dm(i3,m1) = mr1; /*запись сформированного кода
в буфер данных*/
/* формирование суммы сигнала и задержанной
на m1 помехи*/
si=dm(i3,m2);
sr=ashift si by (–1)(hi);
ay0=sr1;
ar=ax1; /*проверка включения помехи*/
ar=pass ar;
if gt jump jumper;
ar=mr1+ay0;
jump jumper2;
jumper: ar=mr1;
jumper2: dm (tx_buf + 1) = mr1; /*код без помехи*/
dm (tx_buf + 2) = ar; /*код с помехой*/
rts;
.GLOBAL in_out;
#define taps 121
.SECTION/DM buf_var2;
.var/circ the_data[taps]; /*буфер данных адаптивного фильтра*/
.var/circ the_data_1[taps_2]; /*буфер данных*/
.SECTION/PM pm_da;
.var/circ fir1_coefs[taps] = «fir4.dat»; /*буфер коэффииициентов
адаптивного фильтра*/
in_out:
dm (tx_buf + 1) = ax1; /*опорный код*/
dm (tx_buf + 2) = ay1; /*код на выходе адаптивного
фильтра*/
sr1 = dm (rx_buf + 1); /*прием кода с помехой*/
ax0 = dm(rx_buf+2); /*код без помехи*/
ay1=dm(i1,m1);
dm(i1,m0)=ax0;
/*обработка принятого сигнала адаптивным фильтром*/
dm(i0,m0)=sr1; /* store sample in data buffer (delay line) */
cntr=taps-1;
mr=0, mx0=dm(i0,m0), my0=pm(i4,m4);
do fir1loop until ce;
fir1loop: mr=mr+mx0*my0(ss), 0=dm(i0,m0), my0=pm(i4,m4);
mr=mr+mx0*my0(rnd);
if mv sat mr;
ar=mr1-ay1; /*сравнение отфильтрованного сигнала
с опорным кодом*/
ay1=ar;
/*использование вычисленного рассогласования для адаптивной
подстройки всех коэффициентов фильтра*/
ax1=mr1;
my1=0xff00; /*установка скорости адаптации*/
mf=ar*my1(rnd), mx0=dm(i0,m0);
mr=mx0*mf(rnd), ay0=pm(i4,m4);
cntr=taps;
do ad until ce;
ar=mr1+ay0, mx0=dm(i0,m0), ay0=pm(i4,m7);
ad: pm(i4,m6)=ar, mr=mx0*mf(rnd);
modify(i0,m2);
modify(i4,m7);
rts;
|
Реализация адаптивного фильтра
Программа адаптивного фильтра содержит алгоритм фильтра КИХ, в который первоначально вводятся коэффициенты ФНЧ из файла fir4.dat, вычисленные с помощью пакета QED-2000. При включении помехи на выходе разностного элемента появляется рассогласование и начинается адаптивная подстройка коэффициентов по минимуму рассогласования. Приведенный фрагмент кода программы показывает один из возможных вариантов практической реализации цифрового адаптивного фильтра.
На рис. 2–4, полученных с использованием встроенных средств отображения VisualDSP++, показана импульсная характеристика фильтра до подстройки коэффициентов и после работы алгоритма адаптивной подстройки. На рисунках видно, как изменяется импульсная характеристика фильтра в процессе работы алгоритма. На последнем рисунке представлены результаты работы фильтра. Синим цветом показан исходный сигнал, подаваемый на вход кодека, красным цветом — сигнал с внесенными в него искажениями, а желтым — полученный после включения адаптивного фильтра сигнал ошибки.
Заключение
Применение адаптивных фильтров выходит далеко за рамки приведенных примеров для задач передачи данных. Это может быть и обработка видеоизображений, и радиолокационные задачи, и различного рода телекоммуникационные приложения, объединенные общей задачей динамической фильтрации сигнала от вносимых в него шума и искажений. В рамках данной статьи были показаны лишь основные подходы к проблеме реализации адаптивных фильтров с использованием сигнальных процессоров компании Analog Devices и среды разработки VisualDSP++. Однако даже эти относительно несложные примеры достаточно успешно решают поставленные задачи, как и показано на приведенных рисунках. В рамках следующей статьи будет рассмотрено, каким образом на базе отладочного комплекта ADDS-2181-EZ-KIT-LITE с использованием среды разработки VisualDSP++ реализуются задачи получения спектра сигнала с использованием алгоритмов быстрого
преобразования Фурье.
Юрий Юрченко, Михаил Петров, Вадим Шатилов
|