浮点数据的固定点

Fixed point to floating point data

本文关键字:数据      更新时间:2023-10-16

i从TDM传输中从编解码器(ADC(中恢复24位固定点数据。然后将数据存储到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);

最后一点:ADC值可能不会缩放到一个。因此,可能有必要通过您的最大浮点值来误解整个表达式。

编辑

我现在看到将其转移到32位的必要性。然后,在转换为Float时,编译器将能够执行正确的符号解释。谢谢您的更正。