假设我有 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 滤波器,也许“动态”在频域中对那些静态滤波器进行零填充?如果是,如何?