реклама на сайте
подробности

 
 
> Из 64 бит floating point -> 16 bit fixed point, Имплементация алгоритма на реальной системе
Саша Z
сообщение May 26 2007, 20:06
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 921
Регистрация: 6-04-07
Из: Israel
Пользователь №: 26 822



Что-то похожее кажется уже спрашивал на форумах, по моему до конкретики не дошло...
Имеется алгоритм обработки сигнала, исползуются различные фильтры (банк фильтров - один длинный FIR и много коротких простых IIRов второго порядка). Система рассчитана и просимулирована в Матлабе, теперь нужно имплементировать на 16-bit, fixed point DSP. Матлаб ессно вычислает в 64 бита floating point, т.е. коеффициенты фильтров имеют до 15 десятичных знаков после запятой что дает практически абсолютную точность - нет проблем. Однако, при переводе на 16 бит - имеем 4 десятичные цифры на все-провсе, т.е. проблема квантизации, плюс fixed point.
Вопросы:

1. Для подгонки под данного типа DSP, беру рассчетные (в Матлабе) коеффициенты, умножаю их на 10^3 после чего делаю round на результат. Таким образом получаю целые числа размером до 4 десятичных цифр которые и намереваюсь использовать как коеффициенты фильтров. После обработки делю результаты на 10^3. Так ли в реальной практике "сражаются" с переводом рассчетных параметров из Матлаба на 16-битные, fixed point процессоры ?

2. В процессе рутин фильтрации возможны overflow промежуточных и конечного результатов. Как боремся с этим ? Проверяем ли на overflow condition каждые промежуточные результаты ? Если да, и в случае обнаружения overflow - просто обрезаем результат на максимально-допустимое число (для данной разрядности данных) или предварительно делаем scaling ? Кроме того, насколько понял может потребоваться scaling входных и выходных сигналов во избежание overflow ? Каким образом это делаем ?

Спасибо.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Stanislav
сообщение May 28 2007, 20:12
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 4 363
Регистрация: 13-05-05
Из: Москва
Пользователь №: 4 987



Цитата(Саша Z @ May 27 2007, 00:06) *
1. Для подгонки под данного типа DSP, беру рассчетные (в Матлабе) коеффициенты, умножаю их на 10^3 после чего делаю round на результат. Таким образом получаю целые числа размером до 4 десятичных цифр которые и намереваюсь использовать как коеффициенты фильтров. После обработки делю результаты на 10^3. Так ли в реальной практике "сражаются" с переводом рассчетных параметров из Матлаба на 16-битные, fixed point процессоры ?
Я почти так же делаю. Только коэффициенты сначала нормализую в смысле максимального модуля значения. То есть, умножаю их на такое число, чтобы максимальный или минимальный к-т были по модулю равны 32767 или -32768. После вычисления выходного отсчёта он домножается на обратное число. Потеря точности при таком подходе получается минимальной. Этот способ годится для КИХ-фильтров; для БИХ - не знаю, подумать надо, как отмасштабировать...
Впрочем, иногда достаточно просто "сдвинуть" к-ты (домножить на степень 2), а потом вых. отсчёт, в противоположную сторону. Это гораздо проще...

Цитата(Саша Z @ May 27 2007, 00:06) *
2. В процессе рутин фильтрации возможны overflow промежуточных и конечного результатов. Как боремся с этим ? Проверяем ли на overflow condition каждые промежуточные результаты ? Если да, и в случае обнаружения overflow - просто обрезаем результат на максимально-допустимое число (для данной разрядности данных) или предварительно делаем scaling ? Кроме того, насколько понял может потребоваться scaling входных и выходных сигналов во избежание overflow ? Каким образом это делаем ?
У DSP, как правило, есть "запасные" разряды аккумулятора, именно для того, чтобы избегать переполнения. А также режим "насыщения" (saturation), который при переполнении сохраняет хотя бы знак числа.


--------------------
Самонадеянность слепа. Сомнения - спутник разума. (с)
Go to the top of the page
 
+Quote Post
Саша Z
сообщение May 28 2007, 21:27
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 921
Регистрация: 6-04-07
Из: Israel
Пользователь №: 26 822



Цитата(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 не большие, но есть...

На самом деле - все это из теории, но вроде-бы по идее очень близкой к практике и ориенторованной на реализацию... smile.gif
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th August 2025 - 02:44
Рейтинг@Mail.ru


Страница сгенерированна за 0.0137 секунд с 7
ELECTRONIX ©2004-2016