Фиксированная точка для данных с плавающей точкой

Я получаю 24-битные данные с фиксированной точкой из кодека (АЦП) при передаче TDM. Затем данные сохраняются в буфере int (32 бита). Я хочу преобразовать это в данные с плавающей точкой.

Я старался:

g_analog_input_chL_mean = (((float)(*rx_block_pointer[buffer_cntr] << 8)) * (1.0/2147483648.0));

Каков наилучший способ сделать это преобразование?

Спасибо,
Costi

-4

Решение

Это зависит от масштаба ваших данных с фиксированной точкой, а также от того, подписаны они или нет. Когда вы используете float для представления 32-битных данных с фиксированной запятой, вы потеряете несколько цифр, так как некоторые биты используются для хранения показателя степени. Я не очень понимаю, почему вы делаете это 32-битное преобразование, так как вы могли бы пропустить этот шаг и написать

g_analog_input_chL_mean = (float)(*rx_block_pointer[buffer_cntr])/(float)(0x7FFFFF);

Если вы настаиваете на этом 32-битном преобразовании, используйте

g_analog_input_chL_mean = (float)(*rx_block_pointer[buffer_cntr] << 8)/(float)(0x7FFFFFFF);

Обратите внимание, что я всегда буду использовать шестнадцатеричное масштабирование, которое более безопасно для опечаток, чем запись десятичного числа. Ваш действительно неправ, так как максимальное целое число со знаком — 2147483647, а не 2147483648.

Если значение ADC имеет формат без знака, вы можете использовать те же выражения, но с включенным знаковым битом:

g_analog_input_chL_mean = (float)(*rx_block_pointer[buffer_cntr])/(float)(0xFFFFFF);

или же

g_analog_input_chL_mean = (float)(*rx_block_pointer[buffer_cntr] << 8)/(float)(0xFFFFFFFF);

Последний пункт: значение АЦП может быть не масштабировано до единицы. Поэтому может потребоваться умножить все выражение на максимальное значение с плавающей запятой.

РЕДАКТИРОВАТЬ

Теперь я вижу необходимость сдвинуть его на 32 бит. Компилятор сможет выполнить правильную интерпретацию знака при конвертации в float. Спасибо за исправление.

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector