我通过TDM传输从CODEC(ADC)中读取24位定点数据。然后将数据存储到int缓冲区(32位)。我想将其转换为浮动数据。
我试过了:
g_analog_input_chL_mean = (((float)(*rx_block_pointer[buffer_cntr] << 8)) * (1.0/2147483648.0));
进行此转换的最佳方式是什么?
谢谢, COSTI
答案 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时执行正确的符号解释。谢谢,为了纠正。