Цитата(Stanislav @ May 29 2007, 00:12)

Я почти так же делаю. Только коэффициенты сначала нормализую в смысле максимального модуля значения. То есть, умножаю их на такое число, чтобы максимальный или минимальный к-т были по модулю равны 32767 или -32768. После вычисления выходного отсчёта он домножается на обратное число. Потеря точности при таком подходе получается минимальной. Этот способ годится для КИХ-фильтров; для БИХ - не знаю, подумать надо, как отмасштабировать...
Впрочем, иногда достаточно просто "сдвинуть" к-ты (домножить на степень 2), а потом вых. отсчёт, в противоположную сторону. Это гораздо проще...
У DSP, как правило, есть "запасные" разряды аккумулятора, именно для того, чтобы избегать переполнения. А также режим "насыщения" (saturation), который при переполнении сохраняет хотя бы знак числа.
Спасибо Станислав. В принципе ежели подгонка коеффициентов фильтра делается в Матлабе (т.е. не в самом DSP) для переноса в реализацию в DSP, но тогда наверно не имеет значения умножать на 10^3 (для 16-бит ессно) или на 2^10, я ошибаюсь ?
С другой стороны, в плане нормализации до маскимального модуля коеффициентов - тут у меня есть некоторые НО: в принципе - говориться об маштабировании в целях избежания overflow выхода. Это можно делать либо маштабируя (ограничивая) входной сигнал что неприемлимо ибо вносит искажения (ограничение сигнала по амплитуде ведь нелинейная операция - вносит искажения), либо соотв. образом маштабируя коеффицеинты фильтра (т.е. его impulse response с которым и деламе конволюцию). Маштабирование фильтра не искажает сигнал, при том дает scaling factor такой что одновременно избегает overflow на выходе и более полное использование диапазона разрядности.
К чему я это ? Я имею ввиду что мне кажется в свете изложенного что нормализация коеффициентов (т.д. подбирая фактор) целесообразно из вышеприведенного расчета, но не просто с целью разтянуть сами коеффициенты до максимума разрядности (без учета максимума входного сигнала).
Насколько понял, обычно стараются нормализовать например входной сигнал вгоняя его в range [-1 1], что дает нам всегда знание максимально-возможного входного сигнала |Xin|max = 1, что в свою очеред позволяет определить scaling factor коеффициентов фильтра.
Насчет запасной разрядности DSP - тут вы правы. У того что у меня (TI C5402) - аккумулятор имет 40 бит (при том что сам процессор - 16-битный), старшие 8 бит - quard bits как раз для предотварщения overflow накопления. Т.е. что произошло его переполнение, нужно что было 256 последовательных сумм каждая из которых давала-бы overflow, что наверно редкость в реальности. И что тоже верно, я читал что у большинства DSP процессоров есть режим saturation, пока не в курсе как он включается у C5402 который у меня... (может он автоматически включен как default ?).
Наверно такая разрядность аккумулятора впридачу с режимом saturation позволяет избежать головной боли поиска и устранения overflow промежуточных результатов, но вероятно что не заменяет output scaling коеффициентами фильтра...хотя может я и не прав...
Насчет IIRов (БИХ это IIR ?), 4x и более порядковые IIRы обычно вроде как реализуются парными каскадами (4х порядковый IIR раскладывается на 2 последовательных 2х порядковых каскада), каждый такой каскад реализуется в coupled form что дает равномерное распределение полюсов по площади единичного круга). И тогда, делается маштабирование коеффициентов каждого их 2х порядковых фильтров, т.е. получаем scaling factor для каждого каскада. Затем вычисляются доп. факторы которые умножают выходы каждого каскада с тем чтобы получить общие gains всех каскадов равным тому что было в оригинале (до маштабирование коеффициентов). Т.е. отличия в подходе к FIR и к IIR не большие, но есть...
На самом деле - все это из теории, но вроде-бы по идее очень близкой к практике и ориенторованной на реализацию...