为了在给定分数f
的情况下在两个变量a
和b
之间进行线性插值,我目前使用以下代码:
float lerp(float a, float b, float f)
{
return (a * (1.0 - f)) + (b * f);
}
我认为可能有一种更有效的方法。我使用的是没有FPU的微控制器,所以浮点运算是在软件中完成的。它们相当快,但仍然需要大约100个周期才能进行加法或乘法。
有什么建议吗?
注:为了使上面代码中的方程式清晰,我们可以省略将1.0
指定为显式浮点文字。
发布于 2010-12-04 20:43:57
忽略精度上的差异,该表达式等同于
float lerp(float a, float b, float f)
{
return a + f * (b - a);
}
这是2个加法/减法和1个乘法,而不是2个加法/减法和2个乘法。
发布于 2014-01-27 19:11:46
如果你在一个没有FPU的微控制器上,那么浮点运算将会非常昂贵。对于浮点运算来说,很容易就会慢20倍。最快的解决方案是使用整数来完成所有的数学运算。
固定二进制点(http://blog.credland.net/2013/09/binary-fixed-point-explanation.html?q=fixed+binary+point)后的位数是: XY_TABLE_FRAC_BITS。
下面是我使用的一个函数:
inline uint16_t unsignedInterpolate(uint16_t a, uint16_t b, uint16_t position) {
uint32_t r1;
uint16_t r2;
/*
* Only one multiply, and one divide/shift right. Shame about having to
* cast to long int and back again.
*/
r1 = (uint32_t) position * (b-a);
r2 = (r1 >> XY_TABLE_FRAC_BITS) + a;
return r2;
}
使用内联函数,它应该是近似的。10-20个周期。
如果你有一个32位微控制器,你将能够使用更大的整数,并在不影响性能的情况下获得更大的数字或更高的精度。此函数用于16位系统。
发布于 2010-12-04 21:12:30
如果您正在为不带浮点操作的微控制器编写代码,那么最好不要使用浮点数,而是使用fixed-point arithmetic。
https://stackoverflow.com/questions/4353525
复制相似问题