1

我的微控制器通过 ASIC IC 提供定点格式 Q24(24 位)的原始数据。

我需要转换为十进制

Actual value = raw_data*LSB

在哪里

LSB = 150/[( (2^24) - 1 )*0.6 ] = 150/10066329 = 1.49011E-5

范围原始数据是 0 ~ 10066329

我想将实际值计算为 uint 32bit,并将精度保持在小数点后 2 或 3 位。

例如,如果满量程原始数据是10066329,精确到小数点后 2 位的实际值将是15000或 小数点后 3 位150000

我发现这样做的方法是 - 比例因子(但需要降低原始数据精度以防止数据在 32 位中不溢出) - 浮点(使 MCU 没有效率)

我应该选择什么选项?

我也在这里发过

4

1 回答 1

0

您可以通过使用中间 64 位值来保持全精度并仍然避免浮点:

// raw
unsigned int raw = 10066329;

// conversion
unsigned int actual_a = ((raw >> 6u) * (150000 >> 4u) / 10066329) << 10u;
unsigned int actual_b = (raw * (long long) 150000) / 10066329;

double actual_ref = raw * 150000.0 / 10066329.0;
printf("%.0f\n%u\n%u\n", actual_ref, actual_a, actual_b);

上面的示例给出了以下输出(所有 32 位值):

150000    // True value for reference
149504    // Value converted using 32 bit
150000    // Value converted using 64 bit

当您必须截断原始数据的最低有效位时,您可能会丢失一些精度(这可能完全可以接受,具体取决于您的应用程序)。但是,如果您使用 64 位,则不需要截断。

于 2012-12-08T22:59:42.467 回答