使用快速更新的脉冲响应实现卷积混响

Implementing a convolution reverb with rapidly updated impulse responses

我正在做我关于声学光线追踪的硕士论文,使用 WebGL 作为 GPU 马力的访问点和 WebAudio 来驱动声卡。让我们假设,光线追踪器的实现使其每帧都提供更新的脉冲响应,而图形渲染引擎以每秒 30 帧的速度运行。因此屏幕上会显示一个房间,并且可以通过实时图形和声音信息在该房间内移动。

我知道脉冲响应 (IR) 以及要播放的音频信号 (x) 必须分成块以进行循环卷积。这需要扩展到动态卷积核。

现在出现了一个令人费解的部分:在当前帧开始的音频信号x的一个声音块是从当前IR开始的。在下一帧中,更新的 IR 可用,因此这个新的 IR 的一部分需要与 x 的第一个块进行卷积(因为它还在那个房间里响),并且 x 的第二个块也必须与新IR的开始。 (插图很快就会出现)

框架在浏览器中运行(Chrome),所以这个卷积的东西需要在javascript中完成。我是 WebAudio 的新手,但由于对 AudioWorkers 的支持仍然很出色,我需要以其他方式实现它。由于这是一项繁重的处理任务,有没有人想在 javascript 中解决这个问题以实时渲染音频链?

在 Audio Workers 联机向 Web Audio 添加线程之前,浏览器的单线程特性 javascript 严格限制了任何实时繁重的工作 - 我在使用浏览器渲染时遇到过这种情况Web Audio 在与 Node.js 服务器协商 Web Socket 流量以提供流式音频时 - 因为使用 Web Worker (WW) 解决了问题 - 查看 WW 的风格称为 Transferable Objects,它允许传输 HUGE 类型化数组 to/from WW - 如果需要,我可以 post 一个示例用法...祝你好运