如何实现低通滤波器?

6

我正在对陀螺仪和加速度计数据进行数学处理,并希望低通滤波处理结果数据。因此,能否有人发布一个通用的低通滤波器代码?


你想要代码生成系数还是仅执行过滤?它应该是IIR还是FIR滤波器? - Guy
我想要一个类似于苹果用来过滤加速度计数据的过滤器。但是他们的代码对我不起作用。 - Christian Gossain
它的哪个方面出了问题? - Guy
看起来我需要传入UIAccelerometer结构体(我没有使用),除非那只是一个保存当前加速度计值的结构体? - Christian Gossain
UIAcceleration只是一个结构体,包含加速度计每个轴的当前值。 - Guy
3个回答

8

一个一阶IIR低通滤波器可以表示为:

output_value = rate * input_value + (1.0 - rate) * previous_output_value;

这基本上就是苹果的AccelerometerGraph示例中的内容。你根据想要的频率(非常粗略的每秒晃动次数)选择速率参数,以便开始衰减或滚动以获得更平滑的输出结果,并且根据输入数据的采样率进行采样。


2
一个低通滤波器只是对结果进行平滑处理,以消除高频噪声。最简单的低通滤波器是一个盒式滤波器,通过对n个样本取平均值来完成。
对于将2个样本取平均值,只需执行以下操作即可:
sample[n] (sample[n] + sample[n + 1]) / 2;

2
如果您觉得苹果公司的AccelerometerGraph示例太过复杂,我为我的班级创建了一个更简单的加速度计示例,您可以在这里下载。该示例实现了对原始加速度计值的简单低通和高通滤波,然后将结果记录到屏幕上。
正如hotpaw2和Goz所描述的那样,这使用了一个非常简单的加权滚动平均值来进行滤波计算:
UIAccelerationValue lowPassFilteredXAcceleration = (currentXAcceleration * kLowPassFilteringFactor) + (previousLowPassFilteredXAcceleration * (1.0 - kLowPassFilteringFactor));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接