Я получаю 24-битные данные с фиксированной точкой из кодека (АЦП) при передаче TDM. Затем данные сохраняются в буфере int (32 бита). Я хочу преобразовать это в данные с плавающей точкой.
Я старался:
g_analog_input_chL_mean = (((float)(*rx_block_pointer[buffer_cntr] << 8)) * (1.0/2147483648.0));
Каков наилучший способ сделать это преобразование?
Спасибо,
Costi
Это зависит от масштаба ваших данных с фиксированной точкой, а также от того, подписаны они или нет. Когда вы используете 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. Спасибо за исправление.
Других решений пока нет …