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

时间:2016-01-03 20:40:52

标签: filter filtering signal-processing

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

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

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

由于

3 个答案:

答案 0 :(得分:3)

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

开发一个具有足够平坦频率响应(在频段或频点之间)以及足够短的脉冲响应的窗口并非易事。

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

答案 1 :(得分:2)

FIR和IIR滤波器的实现和运行时开销的提供是最小的。它可以在不到20行的C中完成。

如果要在频域中执行相同操作,可以根据需要设计过滤器。但你必须

  1. 将信号转换为频域
  2. 应用过滤器
  3. 将其转换回时域
  4. 此外,还有多种设计选择:

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

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

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

答案 2 :(得分:2)

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

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

毫无疑问 - 当你这样做时,你正在实现一个FIR滤波器。 FFT用于加速信号与滤波器脉冲响应的卷积,但它仍然是一个卷积。

为什么不能一直这样做有两个重要原因:

  1. 它仅为非常长的脉冲响应提供显着的性能优势。对于实际使用的大多数FIR滤波器,通常的方法很好;也

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

  3. 实施起来也很棘手。

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

    注意:

    • 重叠加卷积不是在频域"中进行滤波的原因是因为你仍然将滤波器设计为时域脉冲响应。

    • 您实际上可以在频域中进行过滤"使用更好的(非矩形)重叠窗口,但是你的过滤器不是LTI,并且它实际上没有提供任何优于重叠加法的优点。