Перейти к содержанию
    

Помогите разобраться с БИХ фильтром

Доброго времени суток !

 

Я пытаюсь разобраться как работает фильтр баттерворта 1-го порядка.

Использую Matlab и компоненты DspBuilder (что это такое могу пояснить, если необходимо)

 

Фильтр целочисленный

Для определенности: структура фильтра - Direct form I

ФВЧ частота дискр = 256000 Гц, f_-3дБ = 18000

 

Коэффициенты - 16 бит (b0=32767, b1=-32767; a1=21000)

Входные значения 13 бит

 

Разрядность линий задержек - 18 бит

 

В настройках компонентов указываю signed integer, хочу все сделать в целых числах.

 

при умножении и коэффициенты и входные значения подвергаются sign extension до 18 бит

 

Никак не могу понять как формируется линия обратной связи

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

разрядности линий задержек. Причем обычно - это старшие биты.

 

У меня же фильтр начинает корректно работать если брать эти 18 старших бит со сдвигом в 4 бита вправо.

т.е. если выходная разрядность сумматора 18+18+1=37 бит [36..0], то мне приходится делать так:

feedback[17..0] = adder_out[32..15]

 

Никак не могу понять почему именно 4 бита и какова общая закономерность?

 

Заранее спасибо за ответы.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Igor657, прошу прощения за задержку с ответом..

 

обратите внимание на эту тему. Возможно Вам тоже будет проще найти несостыковку отлаживая фильтр сначала в m-коде?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Igor657, прошу прощения за задержку с ответом..

 

обратите внимание на эту тему. Возможно Вам тоже будет проще найти несостыковку отлаживая фильтр сначала в m-коде?

 

Спасибо, Doka.

 

Могли бы Вы пояснить почему делите именно на 2^14 ?

 

Я попробовал изменить разрядность линий задержки. Уменьшил их до 16 бит.

В этом случае оказалость что мне нужно делать смещение 2 бита вправо, чтобы фильтр работал корректно.

 

Коэффициенты оставил 16-ти битные.

 

Мое смещение вправо эквивалентно умножению.

 

т.о. если бы я ограничивал разрядность на выходе своего сумматора (пусть его разрядность 32) я бы брал старшие 16 бит (что эквивалентно делению на 2^16),

а потом умножал бы на 2^2 (смещение вправо).

 

В итоге получается, что это эквивалентно делению на 2^14.

 

Хочу понять принцип.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...