以下代码来自Arduino tutorial on smoothing:
int smooth(int data, float filterVal, float smoothedVal) {
if (filterVal > 1) {
filterVal = .99;
}
else if (filterVal <= 0) {
filterVal = 0;
}
smoothedVal = (data * (1 - filterVal)) + (smoothedVal * filterVal);
return (int)smoothedVal;
}
以下声明来自同一个教程,让我思考:
如果您需要更高的速度或想要避免浮动,可以使用全整数来轻松地重写此函数。
事实是我确实想避免浮动并提高速度,但我想知道:如何将其转换为整数运算?比特打击解决方案是一个奖励; o)
答案 0 :(得分:3)
一种简单的技术是通过将输入值乘以例如10000
并将该结果放入int
来扩展,在int
中进行计算,然后将输出缩放回来通过除以相同因子进入float
。
在你的功能中,你还需要使用相同的因子来扩展所有内容。
因子的选择取决于值的可能范围;你想避免高端溢出,低端不准确。如果考虑一下,因子决定了小数点的位置:固定点,而不是浮点数。
因素可以是任何因素,不必是100
,1000
等等,但627
也可以。
如果你走这条路线,你想要将尽可能多的代码转换为int
,因为上述转换当然也需要时间。
为了说明我的观点,可以是以下内容:
#define FACTOR 10000 // Example value.
int smooth(int data, int filterVal, int smoothedVal)
{
if (filterVal > FACTOR)
{
filterVal = FACTOR - 100;
}
else if (filterVal <= 0)
{
filterVal = 0;
}
smoothedVal = (data * (FACTOR - filterVal)) + (smoothedVal * filterVal);
return smoothedVal;
}
您可能需要/想要检查溢出,...