Фиксированная точка развития - PullRequest
2 голосов
/ 22 июня 2011

В настоящее время я работаю над некоторым кодированием с фиксированной запятой.

Если у меня есть набор 16-битных выборок из АЦП, и я делаю умножение на 16-битный коэффициент фильтрации, результат может быть 32бит с фиксированной точкой, верно?Теперь это нормально, потому что я нацеливаюсь на 32-битный DSP с фиксированной точкой.Однако, если я хочу умножить это на другой 16-битный коэффициент с фиксированной запятой или что-то еще, я получу переполнение правильно?Значит ли это, что мне нужно сделать промежуточное усечение?В конце концов я все равно буду урезать, потому что мне нужно отправить результат в 16-битный ЦАП.

У кого-нибудь есть опыт работы с этим в MATLAB?

EDIT Iдействительно есть набор инструментов с фиксированной точкой.Чего я не понимаю, так это того, что если я сейчас установлю число с длиной слова 16 бит, затем установлю максимальную длину произведения равной 16, а затем умножу ее на другое 16-битное слово, это даст мне ошибку?Если мне нужно выполнить все усечения, чтобы предотвратить ошибку, как мне действительно помогает набор инструментов с фиксированной точкой?Я думаю, я ищу пример того, как использовать набор инструментов с фиксированной точкой, чтобы обеспечить наилучшие возможные условия округления / переполнения, учитывая, что мои входные данные - 16 бит, и у меня есть 32-битные регистры.

Спасибо

1 Ответ

4 голосов
/ 22 июня 2011

Как вы заметили, 16-битное умножение может привести к 32-битному результату.Продолжая, я предполагаю, что ваша запись с фиксированной запятой равна 16.16.

Чтобы выполнить ваше второе умножение, вы должны сначала сдвинуть результат исходного мул обратно на 16 бит.Поскольку результат теперь возвращается в желаемый формат 16.16, вы можете продолжить со вторым множителем («... если я хочу умножить это на другой 16-битный коэффициент с фиксированной точкой ...»).После этого второго умножения сдвиньте результат вниз на 16 бит, чтобы восстановить нотацию 16.16.

Перед отправкой значения из ЦАП, я ожидаю, что вам нужно оставить нотацию с фиксированной точкой и вернуться к целочисленной форме.Для этого просто сдвиньте значение на 16 бит.Прежде чем оставить запись с фиксированной запятой, вы можете рассмотреть округление результата.Предполагая положительное число с фиксированной запятой, это можно сделать, прибавив 0,5f к результату до последнего сдвига вправо.(В 16.16 0.5f равно 2 ^ 15.)

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

Что касается выполнения математики с фиксированной запятой в matlab, функции побитового сдвига достаточно просты в использовании: reference.Конечно, набор инструментов с фиксированной точкой делает это еще проще.

...