我正试图通过this article在WebAudio中构建一个FDN混响器。
有一个Householder FDN的简化实现,它对所有延迟使用一个公共反馈增益,看起来非常稳定。
然而,当我试图实现由amatrix混合的更一般的情况时,我似乎无法使其稳定。
我已经内联了大部分代码来缩小问题的范围,并将其放入JSFiddle中。
编辑:警告,不稳定情况下音量大。
区别在于:

var feedback = context.createGain();
feedback.gain.value = gainValue;

for(var i=0; i<n; i++) {
    this.delays[i].connect(feedback);
    feedback.connect(this.delays[i]);
}

比较对象:
for(var i=0; i<n; i++) {
    for(var o=0; o<n; o++) {
        var feedback = context.createGain();
        feedback.gain.value = gainValue;

        this.delays[i].connect(feedback);
        feedback.connect(this.delays[o]);
    }
}

当我对所有的延迟使用一个通用的反馈GainNode时,它工作得很好当我为所有延迟创建单独的反馈增益节点时,使用相同的增益值,它就会变得不稳定。
我做错什么了?
编辑:来自the article的澄清。
如第3.4节所述,“理想”后混响脉冲响应应类似于指数衰减噪声[314]。因此,在设计混响器时,从无限混响时间开始(“无损情况”)并致力于使混响器成为良好的“噪声发生器”是很有用的。这样的起点[通常]被称为无损原型[153430]一旦在无损原型机的脉冲响应中听到平滑噪声,就可以在每个频带中获得期望的混响时间(如下文第3.7.4节所述)。

最佳答案

增益节点彼此增加体积。如果使用多个增益节点,则需要按活动增益节点的数量拆分它们的值。
因此,如果你有10个增益节点同时规划,你的增益节点的体积将是值/10(活动增益节点的数量)。您需要在将增益节点的值编辑为新值之前将其编辑为新值。所以最好将所有增益节点存储在一个数组中并在其上循环。
我没有试过,但我觉得应该有用。这在生理上完全没有意义,因为如果你有十个人在同一个房间里哭,分贝表仍然像一个人哭一样响。试着用数学的方法来考虑增益节点,它们将信号相加。
顺便说一句,你的混响很模糊。

关于javascript - 使用个人反馈增益时,WebAudio FDN无损原型(prototype)不稳定,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47490730/

10-09 18:24