定点到浮点数据
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 位的必要性。然后,编译器将能够在转换为浮点数时执行正确的符号解释。谢谢指正。
我通过 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 位的必要性。然后,编译器将能够在转换为浮点数时执行正确的符号解释。谢谢指正。