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