有没有一种使用整数进行线性插值的优雅方法?(为了平均微控制器中的 ADC 测量值,ADC 测量值是 12 位,微控制器适用于 32 位整数)。系数 f 在 [0, 1] 范围内。
float lerp(float a, float b, float f)
{
return a + f * (b - a);
}
Run Code Online (Sandbox Code Playgroud)
好吧,由于您有这么多额外的整数位可以使用,因此使用整数的解决方案是:
对参数 F 使用整数,F 从 0 到 1024,而不是从 0 到 1 的浮点数。然后你可以这样做:
(A*(1024-F) + B * F) >> 10
Run Code Online (Sandbox Code Playgroud)
没有溢出的风险。
事实上,如果您需要更多的参数分辨率,您可以选择 F 的最大值作为 2 的任意幂2**19(如果您使用的是无符号整数;2**18否则)。
这在四舍五入方面做得不好(它会截断),但它只使用整数运算,并通过使用移位运算符来避免除法。它仍然需要整数乘法,许多 MCU 没有硬件,但希望它不会太糟糕。