Найти тему
IT. Как это работает?

Коэффициенты КИХ-фильтра. Гид по дробям в ПЛИС

Оглавление

Всем привет! Мы продолжаем разбираться с весьма полезным инструментом в цифровой обработке сигналов (КИХ-фильтр). Довольно частым вопросом при работе с цифровыми фильтрами является само существование дробных коэффициентов. Какие мысли возникают при необходимости ввести в качестве коэффициента нечто вроде -0,203454 ? Вероятно, хочется воспользоваться числами с плавающей точкой и писать как в языках программирования ровно то, что требуется -2,03454Е-01.

Есть две новости, плохая - в языке описания аппаратуры Verilog такая и ей подобные записи чисел с плавающей точкой не синтезируется, и хорошая - требовательная к ресурсам ПЛИС арифметика чисел с плавающей точкой не потребуется. Целочисленное умножение вполне справится с поставленной задачей.

Что за фильтр строим?

В качестве решаемой задачи предлагаю рассмотреть довольно простой фильтр с конечной импульсной характеристикой (КИХ), имеющий каноничный вид:

Каноническая форма КИХ-фильтра
Каноническая форма КИХ-фильтра

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

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

АЧХ режекторного фильтра
АЧХ режекторного фильтра

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

Рассчитанные коэффициенты режекторного фильтра
Рассчитанные коэффициенты режекторного фильтра
Рассчитанные коэффициенты режекторного фильтра
Рассчитанные коэффициенты режекторного фильтра

И вот тут чаще всего и возникает вопрос - что с этим делать?

Немного про числа с фиксированной точкой

С целыми числами в двоичной системе счисления (и даже отрицательными) учат обращаться еще в школе на уроках информатики (вероятно не везде).

Числа в двоичной и десятичных системах счисления
Числа в двоичной и десятичных системах счисления

Числа с фиксированной точкой это ровно такие же числа, но с четко проведенной границей между целой и дробной частями. Каждый бит в дробной части после запятой (точки) имеет дробный вес (степень двойки): 0.1000 = 1/2, 0.0100 = 1/4, 0.0010 = 1/8, 0.0001 = 1/16. Значение двоичного дробного числа подсчитывается аналогично, как и в целочисленном варианте: 0.1111=1/2+1/4+1/8+1/16 = 0.9375. Перевод двоичного числа в отрицательную форму (дополнительный код) происходит по несложному правилу:

  • 1) инверсия всех разрядов,
  • 2) сумма получившегося числа с 1.

Если нам нужно было преобразовать в двоичный вид -0,9375, то у нас бы получилось 1.0001. Самый старший бит показывает знак числа.

Посчитаем коэффициенты

Для определенности отведем под целую часть у чисел 3 бита. В зависимости от величин сигналов и помех в обрабатываемом сигнале результат умножений и сложений может превысить разрядную сетку и тогда будет ошибка. Только из этих соображений диапазон чисел в выбираемой арифметике (-4..4). Самое маленькое число будет 100.0000000000000, а самое большое 011.1111111111111.

Начнем с первого коэффициента фильтра -0.10232542829587375. Оно отрицательное, а значит мы затронем все практические моменты в преобразовании его в двоичный вид. Сперва определим как будет выглядеть его модуль и делается это при помощи простого инструмента пропорции:

Пропорция чисел
Пропорция чисел

Максимальное число это 4, в двоичном виде представляет собой пятнадцать единиц или 32767. Тогда искомое число это:

Вычисление кода числа с помощью пропорции
Вычисление кода числа с помощью пропорции

Остается преобразовать его в отрицательную форму:

Перевод числа в отрицательную форму
Перевод числа в отрицательную форму

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

Вычисленные коэффициенты фильтра
Вычисленные коэффициенты фильтра

По итогу мы получили все коэффициенты фильтра и готовы к эксперименту.

Испытательный стенд

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

Испытательный стенд для фильтра
Испытательный стенд для фильтра

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

Гармонический сигнал с увеличивающейся частотой
Гармонический сигнал с увеличивающейся частотой

Сигнал на выходе фильтра имеет различную амплитуду и зависит она от того, какая частота сигнала на входе:

Гармонический сигнал на выходе фильтра
Гармонический сигнал на выходе фильтра

Сравним результат с АЧХ фильтра и увидим много сходств:

АЧХ фильтра
АЧХ фильтра

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

Надеюсь, теперь для интересующихся читателей в этом в вопросе стало меньше магии, а гораздо больше понимания.

Поддержите статью лайком если понравилось и подпишитесь чтобы ничего не пропускать.

Также не обойдите вниманием канал на YouTube. Подписки и лайки будут приятным ответом от аудитории.