2016-01-03 160 views
0

我是DSP新手,在过滤信号时遇到问题。正如我在互联网上看到的,IIRFIR滤波器通常用于滤波信号。另外我还看到了另一种滤波信号的方法,即:应用矩形或砖墙窗口的频域滤波器(如在Aquilca C++中)并对信号进行乘法运算。频域滤波器vs IIR和FIR滤波器?

我知道,我们可以借此在在任时域(使用卷积)或频域(用乘法)的过滤,但我的问题是:

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

感谢

回答

2

通过在频域中乘法应用窗口会导致循环卷积,这会污染结果。您可以通过滤波器的脉冲响应长度来对滤波器进行零点归零,并使用更长的FFT来获得线性滤波器卷积,但矩形的砖墙会有很长的(无限?)脉冲响应。砖墙滤波器在FFT频点或频率采样点之间也有令人讨厌的频率响应(巨大的波纹)。如果您想要一个接近平坦的频率响应滤波器,则无需做。

开发一个足够平坦的频率响应窗口(频率点或频率点之间)和足够短的脉冲响应的窗口并非无足轻重。

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

+0

谢谢@ hotpaw2。 – bienle

2

FIR和IIR滤波器的实现和运行时开销的负担是最小的。它可以用C语言在20行以内完成。

如果您想在频域中执行相同的操作,您可以根据需要设计滤波器。但是你要

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

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

  • 要使用哪种窗口大小进行转换? (512,1024,...)
  • FFT或四个DCT中的一个?
  • 使用窗口函数?
  • ...

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

基线:在频域滤波要复杂得多,但它仍然有用武之地

+0

谢谢@Peter Schneider。 – bienle

2

你不能真正做到实时信号的滤波在频域。 (好吧,这并不完全正确,但它足够正确 - 请参阅注意!)您可以执行的操作是使用overlap-add方法来实现FFT的滤波器。

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

没有错,虽然 - 当你做到这一点,要实现一个FIR滤波器。 FFT用于加速信号与滤波器脉冲响应的卷积,但它仍然是卷积。

这里有两大原因,这是没有完成所有的时间:

  1. 它只提供显著的性能优势非常长的脉冲响应。对于实践中使用的大多数FIR滤波器,常规方法很好;因为您必须收集整个样本块(必须与脉冲响应一样长),然后进行FFT卷积,才能生成第一个输出,所以FFT滤波会引入显着延迟。由于FFT卷积仅对长冲激响应有用,因此块总是很大,所以延迟总是很大。

它也可能是棘手的实施。

有一些超级聪明的算法可以在不引入延迟的情况下进行FFT卷积。他们使用正常的FIR作为脉冲响应的初始部分,然后在脉冲响应的其余部分增加长度的FFT卷积。这些实施起来相当棘手,我似乎记得这项技术已获得专利。

注:

  • 为什么重叠相加卷积不是“在频域滤波”究其原因,是因为你还设计滤波器的时域脉冲响应。

  • 实际上,您可以使用更好的(非矩形)重叠窗口来“过滤频域”,但是您的过滤器不是LTI,并且与叠加方法相比,它确实没有任何优势。

+0

感谢@Matt Timmermans。 – bienle