使用 FFT 的实时混响算法

Posted

技术标签:

【中文标题】使用 FFT 的实时混响算法【英文标题】:Realtime reverb algorithm with FFT 【发布时间】:2013-04-08 10:52:12 【问题描述】:

我正在尝试使用 FFT 创建/实现实时混响算法。我尝试过 FDN 和其他更简单的算法,但它们听起来还不够好。 因此,通过将变换后的信号和变换后的脉冲响应相乘来进行快速卷积是有效的,而且听起来很棒。

我看到的问题是,如果我想要一个持续几秒钟的混响,那么脉冲响应包含 100 000+ 个值,并且由于我的输入缓冲区是 256 个样本,所以卷积的结果是 100 255+ 个结果值这必须与之前的卷积结果相加,更不用说为 256 个输入样本的每个缓冲区计算 100 000+ 个值的 FFT。

这个问题一定有更好的解决方案。是否可以仅计算 256 个值的 FFT(+ 256 个填充零,因为它不是循环信号)。 混响不必绝对正确,只要听起来不错。

【问题讨论】:

【参考方案1】:

您可能希望考虑使用“频率延迟线”,或者称为分区卷积。简而言之,您可以将混响 IR 分成几个分区,进行 FFT,与输入信号进行卷积,然后以设置为相关分区延迟的延迟将其插入输出。对于几秒钟的完整 IR,这仍然是 CPU 密集型的,所以...

其他技巧包括将头部相关传递函数 (HRTF) 输入到更传统的混响合成算法中。这体现了房间的频率响应在第一组反射中表示的理念。然后可以将 HRTF 输入到更传统的平坦响应混响合成算法中,以创建多重反射。使用 HRTF 代替传统的梳状滤波器。

更具体地指出您的问题,请查看 Fons Adriaensen 的工作。 http://kokkinizita.linuxaudio.org/papers/aella.pdf http://kokkinizita.linuxaudio.org/papers/index.html(更多有趣的论文)

探索他的网站以获取其他有趣的插件和源代码。

CCRMA(斯坦福)的 Julius O Smith 也有很多很好的信息。

我无法在这里详细回答,但我希望 Fons 的论文能回答您的问题。

【讨论】:

读起来很有趣,我错过了那个网页。 “aella”算法看起来有点像这个:dvcs.w3.org/hg/audio/raw-file/tip/webaudio/convolution.html,正如你所说,它是 CPU 密集型的。我发现这个music.miami.edu/programs/Mue/Research/sbrowne/thesis.pdf 是一种混合算法。第一部分与短 IR 进行卷积,“抹掉”梳状滤波器无法很好处理的瞬态,并将结果馈送到传统的 FDN。那应该少很多CPU密集型。不过,我会检查 HRTF。要学的东西太多,时间太少:-)

以上是关于使用 FFT 的实时混响算法的主要内容,如果未能解决你的问题,请参考以下文章

音效处理Reverb 混响算法简介

音效处理Reverb 混响算法简介

fft窄带高分辨率算法

音频处理Fast Convolution 快速卷积算法简介

音频处理Fast Convolution 快速卷积算法简介

音频处理Fast Convolution 快速卷积算法简介