非 EE 软件 API 上下文中的“低通滤波器”

信息处理 过滤器 过滤器设计 软件实现
2022-01-05 08:15:08

我是一位经验丰富的软件工程师,正在研究智能手机传感器。我已经在 DSP 中学习了基础 EE 课程,并且正在尝试应用我的知识。我相信我了解卷积、传递函数、z 变换等。我对 FIR 和 IIR 滤波器有所了解。

现在,在阅读软件 API 和文档时,我看到人们正在将 LPF 应用于时域中的传感器数据。我知道你是通过使用差分方程来做到这一点的(例如 y[i] = y[i-1] + 2*x[i]),但我在我的 EE 课程中了解到 LPF 通常通过卷积运算应用您将时间信号与正弦波的系数(例如)和特定的截止频率进行卷积。所以“低通滤波器”的通俗用法对我来说不够准确。

例如,Google Android API 有这个文档:http: //developer.android.com/reference/android/hardware/SensorEvent.html#values

 public void onSensorChanged(SensorEvent event)
 {
      // alpha is calculated as t / (t + dT)
      // with t, the low-pass filter's time-constant
      // and dT, the event delivery rate

      final float alpha = 0.8;

      gravity[0] = alpha * gravity[0] + (1 - alpha) * event.values[0];
      gravity[1] = alpha * gravity[1] + (1 - alpha) * event.values[1];
      gravity[2] = alpha * gravity[2] + (1 - alpha) * event.values[2];

      linear_acceleration[0] = event.values[0] - gravity[0];
      linear_acceleration[1] = event.values[1] - gravity[1];
      linear_acceleration[2] = event.values[2] - gravity[2];
 }

我如何解释那个低通滤波器?截止频率是多少?什么是过渡带宽?他们是否仅使用此 LPF 进行平均?

3个回答

您示例中的滤波器是一阶无限脉冲响应 (IIR)滤波器。其传递函数为:

H(z)=1α1αz1

这对应于一个差分方程:

y[n]=αy[n1]+(1α)x[n]

其中是滤波器输入,是滤波器输出。x[n]y[n]

这种类型的滤波器通常用作低复杂度的低通滤波器,通常称为泄漏积分器它因其简单的实现、低计算复杂度和可调性而受到青睐:它的截止频率取决于的值。上的值根本不产生过滤(输出等于输入);随着的增加,滤波器的截止频率降低。您可以将视为截止频率无限低的边界情况(滤波器输出始终为零)。αα[0,1)α=0αα=1

您可以通过注意到滤波器输入由加权来直观地想到这一点,因此随着参数的增加,数量减少,因此每个输入样本对任何特定输出样本的值的比例影响较小。这会在较长时间内抹掉滤波器的脉冲响应。在较长时间内求和类似于计算长期移动平均线。随着移动平均线长度的增加,平均线的截止频率会降低。α1α

对于您的示例,其中,滤波器的频率响应如下: α=0.8在此处输入图像描述

从这个例子中,我猜想这个滤波器被用来从传感器的时间序列测量中平滑高频噪声,试图梳理出一个相对低频的感兴趣的信号。这将是这种过滤器的一个非常典型的应用。

在您的另一个子问题上,您是正确的,过滤通常是通过输入信号与滤波器的脉冲响应的卷积来实现的。在大多数情况下,这仅通过有限脉冲响应 (FIR)滤波器完成。像这样的 IIR 滤波器通常使用滤波器的差分方程来实现;由于 IIR 系统的脉冲响应是无限长的,因此您必须将其截断为某个有限长度以使其卷积易于处理,此时滤波器不再是 IIR。差分方程格式的计算实现几​​乎总是更便宜,尽管该结构中固有的反馈可能导致必须解决的数值问题(例如内部溢出和舍入误差累积)。

总而言之,基于简单理想化物理模型的 IIR 滤波器(例如 RC 滤波器)具有少量极点和零点,因此通常实现为差分方程,因为少量极点或零点意味着很少的算术运算每个样本使用差分方程。

由于 IIR 意味着无限长度的脉冲响应,卷积要么需要永远计算,要么使用近似值。

FIR 滤波器通常通过具有有限长度脉冲响应的卷积来实现(或者如果滤波器足够长以达到计算效率,则通过 FFT 快速卷积)。当人们可以用有限长度的脉冲响应来近似期望的频率响应规范时,更经常使用这些类型的滤波器,而不是知道 Z 平面极点和零点可能位于的位置。

然而,由于具有清晰规格的滤波器意味着长 FIR 卷积,因此 FIR 滤波器的实现可能会慢很多,并且设置可能涉及更多代码行,这可能是 FIR 滤波器可能不会在简单软件中经常使用的原因例子。

我发现自己一次又一次地回到这篇文章。感谢您提出问题。这是 C 中泄漏积分器的一个很好的、计算友好的实现(用于微控制器)。

首先,一些重新排列:y = α * x + (1 − α) * y_last = α * (x - y_last) + y_last

如果我们将 α 限制为大约 12%、25%、50%,(1/8, 1/4, 1/2,...)。我们可以利用一些有效的位移。以1/8为例,8 => 2^3 =>(降档3次)

= (x - y_last) / 8 + y_last

#define SMOOTHING_FACTOR       (3)

int16_t FilterSample(int16_t new_sample)
{
  static int16_t last_result = 0;

  // Each bit shift down is equivalent to dividing-by-two
  last_result = (new_sample - last_result) >> SMOOTHING_FACTOR) + last_result;

  return last_result;
}

希望能帮助到你。