如何实现低通滤波器?

Posted

技术标签:

【中文标题】如何实现低通滤波器?【英文标题】:How to implement a LowPass Filter? 【发布时间】:2010-11-24 22:16:08 【问题描述】:

我正在对陀螺仪和加速度计数据进行一些数学运算,我想对结果数据进行低通滤波。那么有人可以发布一些低通滤波器的通用代码吗?

【问题讨论】:

您希望代码生成系数还是只执行过滤?应该是 IIR 还是 FIR 滤波器? 好吧,我想要一个类似于 Apple 用于过滤加速度计数据的过滤器。只有他们的代码对我不起作用。 在什么情况下不起作用? 好吧,看来我需要传入 UIAccelerometer 结构(我没有使用),除非那只是一个保存当前加速度计值的结构? UIAcceleration 只是一个包含加速度计每个轴的当前值的结构。 【参考方案1】:

一阶 IIR 低通滤波器可以是以下形式:

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

这几乎就是 Apple 的 AccelerometerGraph 示例中的内容。您可以根据想要滚降或开始衰减以获得更平滑的结果输出的频率(非常非常粗略地每秒抖动)以及输入数据的采样率来选择速率参数。

【讨论】:

【参考方案2】:

低通滤波器只是对结果进行平滑处理以去除高频。最简单的低通滤波器是箱式滤波器,它通过对 n 个样本进行平均来完成。

为了将 2 个样本平均在一起,这很简单:

sample[n] (sample[n] + sample[n + 1]) / 2;

【讨论】:

【参考方案3】:

如果 Apple 的 AccelerometerGraph 示例太复杂,您无法理解,我为我的课程创建了一个更简单的加速度计示例,您可以下载 here。这为原始加速度计值实现了一个简单的低通和高通滤波器,然后将结果记录到屏幕上。

正如 hotpaw2 和 Goz 所描述的,这使用了一个非常简单的加权滚动平均值来进行过滤器计算:

UIAccelerationValue lowPassFilteredXAcceleration = (currentXAcceleration * kLowPassFilteringFactor) + (previousLowPassFilteredXAcceleration * (1.0 - kLowPassFilteringFactor));

【讨论】:

以上是关于如何实现低通滤波器?的主要内容,如果未能解决你的问题,请参考以下文章

使用核心音频实现后处理低通滤波器

联系matlab用双线性变换法设计Butterworth低通滤波器m

matlab 低通滤波器设计

一阶低通滤波算法

如何创建一个没有舍入误差的简单 iir 低通滤波器? (16 位 pcm 数据)

什么是高通和低通滤波器?