【问题标题】:lerp for integers or in fixed point mathlerp 用于整数或定点数学
【发布时间】:2023-03-09 17:49:01
【问题描述】:

有没有一种优雅的方法来使用整数进行线性插值? (要平均微控制器中的 ADC 测量值,ADC 测量值是 12 位,微控制器可以正常使用 32 位整数)。系数 f 在 [0, 1] 范围内。

float lerp(float a, float b, float f)
{
    return a + f * (b - a);
}

【问题讨论】:

标签: math fixed-point


【解决方案1】:

好吧,既然你有这么多额外的整数位可用,使用整数的解决方案是:

使用整数作为参数 F,F 的范围是 0 到 1024,而不是从 0 到 1 的浮点数。然后你可以这样做:

(A*(1024-F) + B * F) >> 10

没有溢出的风险。

事实上,如果您需要更高的参数分辨率,您可以选择 F 的最大值作为 2 的任意幂,直到 2**19(如果您使用无符号整数;否则为 2**18)。

这并不能很好地进行舍入(取而代之的是截断),但它只使用整数运算,并通过使用移位运算符来避免除法。它仍然需要整数乘法,许多 MCU 没有硬件,但希望不会太糟糕。

【讨论】:

  • 这个答案中的 A 和 B 是整数还是浮点数?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-14
  • 2015-02-08
  • 1970-01-01
  • 2011-06-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多