FIR 滤波器设计和实现 - 采样率和抽头数

信息处理 过滤器 自由度 DSP核心 有限脉冲响应
2022-02-09 20:09:48

我一直在设计和使用 IIR 滤波器来处理音频,但我想设计一些 FIR 滤波器来进行延迟均衡。我使用以下方法做了一些初步工作:

  1. 我从所需的“群延迟 EQ”曲线开始。这从零开始,然后在更高(音频)频率处具有增加的延迟。

  2. 我使用群延迟的定义通过积分来计算相应的相位滞后。这仍然在音频对数频率网格上。

  3. 在下一步中,我将相位插值到将用于离散变换处理的等线性间距频率网格上。这一步我使用了 32768 个样本。

  4. 然后我生成这个相位角的复数的实部和虚部,响应的幅度等于 1.0。我确保 H(k) = H*(Nk)。

  5. 我采用实部和虚部的逆 DFT 将响应转换到时域。尽管输出产生实部和虚部,但虚部基本上为零。冲动存在于短暂的正负时间(在数据集的开始和结束),但仅跨越整个数据集的约 20%。

  6. 我将虚部值全部设置为零。我操纵时域响应的实部(脉冲),将其“向右”移动,以将处于较小负时间(“结束”)的脉冲部分移动到正时间。然后我将一个矩形窗口应用于数据,将窗口外的所有内容设置为零。据我了解,剩余的非零值是 FIR 滤波器系数。

  7. 为了找出滤波器响应的样子,我对移位的加窗脉冲执行前向 DFT,以将数据带回频域。然后我计算并绘制滤波器幅度 (SPL)、相位,最后是群延迟。


上述过程似乎给了我想要实现的 FIR 滤波器响应。当我将更少或更多抽头设置为零时,我可以看到频域中的权衡。所以我的方法似乎奏效了。现在开始执行和问题:

因为我是 FIR 滤波的新手,所以我对上面计算的数据采样率和系数数量以及我想要实现 FIR 滤波器时这些因素的影响感到困惑。我可以编写自己的代码,也可以使用一些现有的代码或包来执行过滤器和音频数据流之间的关联。

问题:

A.我在逆 DFT(上面的第 5 步)中使用的 bin 数量将如何影响生成的滤波器?使用更多的 bin 是否有助于适应更清晰的特征,反之亦然?在设计过滤器时通常会优化 bin 的数量以在实现过滤器时保持较低的计算开销?

B.假设采样率为 48kHz,我执行了上述所有步骤。采样率发挥作用的唯一一次是当我为 iDFT 和 DFT 计算计算每个 bin(例如 df)的频率时。给定我最后一组非零滤波器系数(在上面的步骤 6 中获得),滤波器是否简单地(天真地)计算为y(n) = SUM_over_m[h(m)*x(n-m)] 其中“x”是我的音频数据流中以相同 48kHz 采样率的样本?这似乎太容易/简单了......(我知道实际的 FIR 滤波器实现不会以这种方式进行计算,而是会使用 FFT 等)

真正让我困惑的是:可以将任意数量的系数设置为零以近似滤波器,但您可以改变 iDFT/DFT 操作中的 bin 数量(更改分辨率),然后将生成的滤波器截断为相同数量的水龙头。即使它们的数量相同,系数也会不同,并且系数值是“编码”滤波器设计中使用的采样率和选择的分辨率的唯一东西,这是否正确?

请帮助我更清楚地理解这些概念。谢谢!

1个回答

我无法可视化您在步骤 5 中描述的实值逆 DFT FIR 滤波器系数。但没关系。我对 A 的回答:当您使用大量 DFT 箱来产生所需频率响应的频域表示的精细粒度时,在对逆 DFT 的输出进行窗口化后剩余的非零系数的数量将越大。并且非零系数的数量越大,每个滤波器输​​入样本所需的滤波器计算次数就越多。只有您可以决定每个过滤器输入样本愿意执行多少次乘法和加法。顺便说一句,我想知道您此时正在考虑多少个非零系数。

我对 B 的回答:我不确定星号在 y(n) = SUM_over_m[h(m)*x(nm)] 表达式中的含义。在任何情况下,您通常通过将滤波器的输入序列与滤波器的非零系数进行卷积来实现 FIR 滤波器。如果您有 100 个非零系数,那么每个滤波器输​​入样本必须执行 100 次乘法和 99 次加法。(根据您的计算硬件,可能有一种方法可以将每个输入样本的乘法次数减少到 50。问我如何。)现在,如果您有数百个非零系数,那么在这种情况下,是的,您将使用称为“快速卷积”滤波方法,它涉及正向和逆向 DFT。但是 CA Charlie,所有这些讨论都取决于您的过滤是“实时”还是“离线”。至于 48 kHz 数据速率,它会影响两件事:(1)这意味着您的输入信号的频谱不能包含大于 48/2 = 24 kHz 的频谱分量;(2) 在实时实现中,您必须在不到 1/48,000 秒的时间内执行所有“每个样本”过滤计算。(对不起 CA Charlie,我不明白你最后一段中的问题。)