定点到浮点数据

Fixed point to floating point data

我通过 TDM 传输从 CODEC (ADC) 接收 24 位定点数据。然后将数据存储到 int 缓冲区(32 位)中。我想将其转换为浮点数据。

我试过了:

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

进行此转换的最佳方法是什么?

谢谢, 科斯蒂

这取决于定点数据的缩放比例,以及数据是有符号的还是无符号的。当您使用 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 位的必要性。然后,编译器将能够在转换为浮点数时执行正确的符号解释。谢谢指正。