Math 整数或定点数学中的lerp

Math 整数或定点数学中的lerp,math,fixed-point,Math,Fixed Point,有没有一种优雅的方法可以使用整数进行线性插值?(为了平均微控制器中的ADC测量值,ADC测量值为12位,微控制器使用32位整数工作良好)。系数f在[0,1]范围内 float lerp(float a, float b, float f) { return a + f * (b - a); } 既然有这么多额外的整数位可供使用,那么使用ints的解决方案是: 为参数F使用整数,F从0到1024,而不是从0到1的浮点。然后你可以做: (A*(1024-F) + B * F) >&g

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

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

既然有这么多额外的整数位可供使用,那么使用ints的解决方案是:

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

(A*(1024-F) + B * F) >> 10
没有溢出的风险

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


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

这个答案中的a和B是整数还是浮点?