频域滤波器与 IIR 和 FIR 滤波器?

frequency domain filter vs IIR and FIR filter?

我是 DSP 新手,我对信号滤波有疑问。正如我在互联网上看到的那样,IIRFIR 过滤器通常用于过滤信号。此外,我还看到了另一种过滤信号的方法,即:频域滤波器(如在 Aquilca C++ 中),它应用矩形或砖墙 window 并对信号执行乘法。

我知道我们可以在时域(使用卷积)或频域(使用乘法)上进行滤波,但是我的问题是:

为什么我们不能简单地使用频域滤波方法而不是IIR或FIR?因为我认为生成 window 函数比生成 IIR 滤波器简单得多。

谢谢

FIR 和 IIR 滤波器的实施和运行时开销极小。它可以在不到 20 行的 C 中完成。

如果你想在频域做同样的事情,你可以设计你想要的滤波器。但是你必须

  1. 将信号转换到频域
  2. 应用过滤器
  3. 将其转换回时域

此外,还有多种设计选择:

  • 要使用哪个 window 尺寸进行转换? (512, 1024,...)
  • FFT 还是四个 DCT 之一?
  • window要使用的函数?
  • ...

我还没有实现这样的过滤器(还)。也许您会在途中遇到更多问题。

基线:频域中的滤波要复杂得多,但它仍然有其用途

您无法真正在频域中对实时信号进行滤波。 (好吧,这不完全正确,但它足够正确——见注释!)你可以做的是使用 overlap-add 方法来实现带有 FFT 的滤波器。

参见:https://en.wikipedia.org/wiki/Overlap%E2%80%93add_method

不过不要搞错了——当您这样做时,您正在实施一个 FIR 滤波器。 FFT用于加速信号与滤波器脉冲响应的卷积,但它仍然是一个卷积。

之所以没有一直这样做,有两个主要原因:

  1. 它只为非常长的脉冲响应提供显着的性能优势。对于实际中使用的大多数 FIR 滤波器,正常的方法就可以了;还有

  2. FFT 滤波会引入明显的延迟,因为您必须收集一整块样本(必须与脉冲响应一样长),然后进行 FFT 卷积,然后才能生成你的第一个输出。由于 FFT 卷积只对长脉冲响应有用,块总是很大,所以延迟总是很明显。

实施起来也很棘手。

有一些 super-clever 算法可以在不引入延迟的情况下进行 FFT 卷积。他们对脉冲响应的初始部分使用普通 FIR,然后对脉冲响应的其余部分使用增加长度的 FFT 卷积。这些实现起来非常棘手,我似乎记得该技术已获得专利。

备注:

  • 之所以overlap-add卷积不是"filtering in the frequency domain",是因为你还是把滤波器设计成time-domain脉冲响应

  • 您实际上可以 "filter in the frequency domain" 使用更好的 (non-rectangular) 重叠 windows,但是您的过滤器不是 LTI,它并没有真正提供overlap-add 方法的任何优势。

在频域中通过乘法应用window会导致循环卷积,这会污染结果。 (例如,卷积的结尾将环绕到过滤结果的开头。)

但是您可以通过滤波器脉冲响应的长度对信号进行零填充,并使用更长的 FFT 来获得线性滤波器卷积。但是矩形砖墙的脉冲响应很长(理论上是无限的),因此所需的 zero-padding 量接近无限。

砖墙滤波器在 FFT 区间或频率采样点之间也有令人讨厌的频率响应(巨大的波纹)。如果您想要一个接近平坦的频率响应滤波器,则无事可做。

开发具有足够平坦的频率响应(区间或频率点之间)以及足够短的脉冲响应的 window 并非易事。

IIR 滤波器通常需要比频域滤波器少得多的计算。但是重叠添加或重叠保存 FFT 快速卷积可以比长 FIR 滤波器卷积更快。

但首先,您需要生成一个频域滤波器,该滤波器的脉冲响应对于您的 FFT 大小来说太长(导致循环卷积 wrap-around 问题)。