У меня в системе банка фильтров есть 15 коротких IIRов (второго порядка), transfer function каждого содержит в числителе только число (скажем gain). В алгоритме динамически играюсь IIR gain factors т.е. варьирую это gainы (не суть важно как именно - это - определяется в алгоритме), т.е. на каждом определенном этапе алгоритм вырабатывает 15 gain factors которые являются числителями каждого соотв. IIRа.
В Матлабе работает нормально, перевожу в имплементацию (16 бит fixed point). Грубо конвертирую полученные в Матлабе gain factors в 16 бит fixed point:
gain = int16(round(1024*gain)), получаю целочисленные факторы в 16-битном размере.
В оригинале (из Матлаба) все факторы меньше 1 (в диапазоне 0 - 1) и могут отличаться более чем на 3 порядка. Это приводит к тому что когда фактор меньше скажем 0.0005 - в результате вышеуказанной операции получаю 0, что фактически обнуляет конкретный фильтр.
Посему видимо нужна какая-то защита от обнуления когда реальный коеффициент ниже порога квантизации. Можно например вместо round использовать celing:
gain = int16(ceiling(1024*gain)), но тогда уравниваются например факторы в 2х смежных диапазонах (например все между 0.0001 и 0.001 идет в 1), что полуается весьма грубо.
Единственый вариант более правдоподобного разпределения после квантизации вижу в квантизации на большую разрядность, например 2^15:
gain = int16(round(2^15*gain)), но в таком случае мне кажется увеличивается вероятность переполнения промеж. результатов в процессе IIR фильтрации...
Что посоветуете ?