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

Posted

技术标签:

【中文标题】使用快速更新的脉冲响应实现卷积混响【英文标题】:Implementing a convolution reverb with rapidly updated impulse responses 【发布时间】:2015-01-25 20:20:35 【问题描述】:

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

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

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

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

谢谢。我和我的主管决定暂时忽略这个繁重的处理部分,每秒只更新一次。您是否有关于何时在浏览器中实现音频工作者的信息?我还在 ScriptProcessorNode 中尝试使用 WebWorkers,但它一直在点击。我想看看你的解决方案,因为我担心我把可转让的东西搞砸了。问候,托马斯 我的代码在github上,可以从npmjs.com/package/websockets-streaming-audio获得 谢谢,斯科特。这在主线程中运行 WebAudio,不是吗? 是的,它在浏览器线程中运行 Web Audio,该线程使用 Transferable Objects 调用 Web Workers 以使用 Web Socket 调用 Node.js ...如果这还不够,请查看类似的我将 WebGL 投入到混合中以在时域和频域中可视化 Web 音频的项目:npmjs.com/package/webgl-3d-animation 在这一次全屏 F11 上,点击按钮播放 jam loop 并使用带有左/右箭头的键 w/a/s/d向上/向下和向上/向下翻页加鼠标左键+中间滚轮... PS。该项目是我的 javascript 世界,所以不要评判我 ;-) 享受 谢谢。我已经调查过了,但最近我决定停止这项任务。新方案将脉冲响应拆分为更经常更新的早期反射部分和漫反射部分,两者都实现为 convolverNodes。我还尝试使用几十个延迟节点来模拟早期反射,但从长远来看,这对我的机器来说太多了。无论如何,感谢您的帮助:)

以上是关于使用快速更新的脉冲响应实现卷积混响的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Juce 为脉冲响应加载音频文件

在 Juce 中使用 AudioFormatReader 加载脉冲响应

音效处理Reverb 混响算法简介

音效处理Reverb 混响算法简介

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

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