如何实现低通滤波器?
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