使用 FFT 进行串行滤波

信息处理 fft 卷积
2022-02-19 02:36:11

假设我有 3 个用于实时 DSP 应用程序的音频过滤器。为简单起见,每个长度为 256(以及输入信号)。过滤器应该串联工作。从滤波器 IR h1(n) 和输入 x(n) 开始,零填充到 512,FFT,然后是乘法和 IFFT,提供第一级输出 Y1(n)。

因为他们的输入向量被填充到 512,所以输出也有 512。

第二个滤波器阶段:这个阶段的输入是 y1(n),它已经有 512 个样本,并且必须与滤波器 h2(L=256) 进行卷积。所以 y1 和 h2 必须被零填充到 788、FFT、乘法、IFFT...输出 y2 的长度为 768

第三阶段:将添加另一个填充,因此最终输出向量的长度为 1024

由于我的应用程序是实时的,出于性能原因,我希望避免每个阶段使用多个 FFT->iFFT。此外,每个滤波器级的 FFT 输入长度都会增加。我宁愿为每个过滤器单独进行 FFT 以获得 H1、H2、H3,然后进行 X*H1*H2*H3,然后进行 IFFT。据我从上一篇文章中了解到,如果我将每个过滤器(和输入)在开始时已经零填充到长度 L=N+N1+N2+N3,这将起作用。不幸的是,我想避免这种情况,因为从应用程序开始,一些过滤器就已经预先放置在大缓冲区中以授予快速访问权限,而其他过滤器(例如均衡器)可以在运行时选择性地打开/关闭。所以我无法知道在程序开始时我需要将多少“填充”零应用于那些预 FFT 的过滤器。

有没有办法解决这个问题?如果应该在运行时添加例如另一个 EQ 滤波器,也许“动态”在频域中对那些静态滤波器进行零填充?如果是,如何?

1个回答

不,如果你做零填充H1在频域。

但是是的,如果你做零填充H1在时域。基本上你应该有两个 FFT 版本H1(H1,512H1,1024)。因为H1是静态的,您可以预先计算两者,也可以计算H1,1024仅在需要时。

一种=一世FF(FF(X)×H1,512)b=一世FF(FF(X)×H1,1024×H2×H3). a 的大小为 512,b 的大小为 1024。例如,使用重叠添加方法,我们可以在 512 和 1024 之间自由更改 fft-size,但它仍然每个 fft 处理 256 个输入。

===a====
     +
    ===a====
         +
        ===b============
             +
            ===b============
                 +
                ===a====