【发布时间】: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
有没有一种优雅的方法来使用整数进行线性插值? (要平均微控制器中的 ADC 测量值,ADC 测量值是 12 位,微控制器可以正常使用 32 位整数)。系数 f 在 [0, 1] 范围内。
float lerp(float a, float b, float f)
{
return a + f * (b - a);
}
【问题讨论】:
标签: math fixed-point
好吧,既然你有这么多额外的整数位可用,使用整数的解决方案是:
使用整数作为参数 F,F 的范围是 0 到 1024,而不是从 0 到 1 的浮点数。然后你可以这样做:
(A*(1024-F) + B * F) >> 10
没有溢出的风险。
事实上,如果您需要更高的参数分辨率,您可以选择 F 的最大值作为 2 的任意幂,直到 2**19(如果您使用无符号整数;否则为 2**18)。
这并不能很好地进行舍入(取而代之的是截断),但它只使用整数运算,并通过使用移位运算符来避免除法。它仍然需要整数乘法,许多 MCU 没有硬件,但希望不会太糟糕。
【讨论】: