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


12

我是一位经验丰富的软件工程师,正在研究智能手机传感器。我已经学习了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进行平均?


好,它也困扰着我
西布斯(Sibbs)赌博

Answers:


11

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

H(z)=1α1αz1

对应于以下差分方程:

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

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

αα[0,1)α=0αα=1

α1α

α=0.8在此处输入图片说明

从示例中,我猜想该滤波器将用于平滑来自传感器的时间测量序列中的高频噪声,从而尝试找出相对感兴趣的低频信号。对于这种过滤器,这将是非常典型的应用。

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


谢谢!一些后续问题:(1)您说方程H(z)= ...是一个差分方程;这真的是传递函数,对吗?我认为差分方程严格来说是时域的。(2)在您的泄漏积分器中,1.0是否对应于ampling_frequency / 2(例如在Matlab中)?(3)关于FIR与IIR,我的理解是否正确,即可以将IIR差分方程应用于O(N),但基于FFT的卷积是O(N ^ 2)或O(N lgN)?(4)您能推荐一本面向软件程序员的书来实现这些DSP思想吗?就像Android代码示例所做的一样。
stackoverflowuser2010

π+πO(N)NN

我知道(i)应用差分方程是O(N)。但是我认为(ii)在基于FFT的实现中使用相加乘积运算(songho.ca/dsp/convolution/convolution.html)的卷积运算是O(N ^ 2)或O(N lgN) 。在所有情况下,N都是滤波器阶数-我假设滤波器阶数和时间信号长度是相同的数量级(例如均为256)。那么(i)和(ii)是否不同?此外,我确实在Lyon上看到了Lyons的书,但我希望能为C / Java软件程序员写更多的东西。
stackoverflowuser2010

1
O(N) NO(N2)MNO(MN)MN
詹森·R

O(M×(N+M))iNO(N2)O(NM)
stackoverflowuser2010

2

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

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

FIR滤波器通常通过与有限长度的脉冲响应进行卷积来实现(如果滤波器足够长以达到计算效率,则可以通过FFT快速卷积实现)。当人们可以用有限长度的脉冲响应来接近所需的频率响应规格时,而不是知道Z平面的极点和零点可能位于何处时,会更经常使用这类滤波器。

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


0

我发现自己一次又一次回到这篇文章。谢谢你问这个问题。这是用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;
}

希望能帮助到你。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.