固定点指向浮点数据

时间:2017-06-28 10:55:16

标签: c++ floating-point codec fixed-point adc

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

我试过了:

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

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

谢谢, COSTI

1 个答案:

答案 0 :(得分:1)

这取决于定点数据的缩放,以及数据是有符号还是无符号的。当您使用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值可能不会缩放为1。因此,可能需要通过最大浮点值来覆盖整个表达式。

修改

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