频域中的零填充,有什么加速技巧吗?

信息处理 fft 卷积 零填充
2022-02-25 13:42:20

在许多情况下,必须对光谱进行一些操作,例如将光谱 Z 宽分成两个 Z/2 光谱,反之亦然,将两个 Z 大小的光谱合并到一个 2Z 大小的光谱中。唯一不必回到时域然后再回到频域的解决方案(这是愚蠢的恕我直言)是在频域中操作卷积。

一个例子:我有两个 Z 大小的频谱,分别代表一个 STFT 信号帧和一个脉冲响应,它们不是从零填充开始的;我想对它们进行非圆形卷积,所以我必须将两个光谱转换为双倍光谱,零填充和左对齐;因此,我必须通过简单地将 bin 位置加倍而将奇数位置留空(导致 2Z 频谱表示第二半信号的重复副本),将两个频谱扩展为 2Z 大小的频谱;与代表单一频率二进制方波的狄利克雷核卷积(这里是重点),因此后半部分归零;然后我可以将两个 2Z 大小的光谱相乘以获得线性卷积;然后进行逆运算,将结果拆分为两个大小为 Z 的光谱,以供后续重叠保存。

我期待答案:为什么不简单地在原点获取适当大小的零填充帧?好吧,让我们假设我不能有很多原因。一个是我在已经采用标准帧格式的 STFT 上下文中工作,例如非零填充帧,我在其中获得给定格式的帧,并且期望返回与我的处理结果相同大小和格式的帧。

OTOH,如果我避免频域卷积,我将不得不在两个频谱上进行 IFFT,时域中的零填充,再次 FFT 以将频谱相乘,IFFT 用于拆分结果,然后再次 FFT,总共进行了七个傅立叶变换,这可能更愚蠢......

所以我想问是否存在一些数学技巧来进行诸如零填充和分裂之类的频谱操作,或者任何技巧来加速频域中的卷积而不必回到时域。谢谢

1个回答

看起来您的选择是基于(大约)5*NLogN(IFFTs+FFTs)是否大于或小于 N^2(线性卷积)。

您可以使用更粗略的插值方法(三次、样条等)来对光谱进行上采样,但错误可能会作为明显的质量损失而听得见。