整数或定点数学的lerp

时间:2015-12-04 22:49:52

标签: math fixed-point

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

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

1 个答案:

答案 0 :(得分:3)

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

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

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

没有溢出的风险。

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

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