Javascript 网络音频API均衡器

Javascript 网络音频API均衡器,javascript,filter,web-audio-api,equalizer,Javascript,Filter,Web Audio Api,Equalizer,我一直在寻找使用Web audio API创建音频均衡器的方法: 我找到了很多关于创建可视化工具的线索,但这当然不是我想要做的。我只是想能够改变声音使用频率滑块。我发现biquadFilter应该可以完成这项工作,但是我没有得到一个好的结果。当我改变任何频率值时,声音会一直改变,但它只是降低了声音的质量,而它应该改变频率 我首先加载一个声音: Audio.prototype.init = function(callback){ var $this = this; this.gai

我一直在寻找使用Web audio API创建音频均衡器的方法:

我找到了很多关于创建可视化工具的线索,但这当然不是我想要做的。我只是想能够改变声音使用频率滑块。我发现biquadFilter应该可以完成这项工作,但是我没有得到一个好的结果。当我改变任何频率值时,声音会一直改变,但它只是降低了声音的质量,而它应该改变频率

我首先加载一个声音:

Audio.prototype.init = function(callback){
    var $this = this;
    this.gainScale = d3.scale.linear().domain([0,1]).range([-40,40]);
    this.context = new AudioContext();
    this.loadSounds(function(){
        $this.loadSound(0);
        $this.play();
        callback.call();
    });
};
一切正常,准备好后声音就会播放

我有10个频率滑块[32,6412525050010002000800016000]。 对于每个滑块,我创建一个过滤器并将其连接到源,如下所述:

最后,当我更改滑块的值时,我会更新过滤器:

Audio.prototype.updateFilter = function(index,newVal){
    this.filters[index].frequency.gain = this.gainScale(newVal);
};
注意:my this.gainScale函数将[0,1]中的一个值作为输入,并返回[-40,40]中的一个值,以将每个频率的增益设置在-40和40之间


非常感谢您的帮助

一个问题是,您希望滑块以给定频率控制滤波器的增益,而不是滤波器频率本身。根据规范,带通滤波器的增益是不可控的,这是位限制。幸运的是,您可以在每个过滤器的末尾放置一个增益节点

var filter = this.context.createBiquadFilter();
filter = this.context.createBiquadFilter();
filter.type = 2;
filter.frequency.value = frequency;

var gain = this.context.createGainNode();

// Connect source to filter, filter to the gain, gain to destination.
this.source.connect(filter);
filter.connect(gain);
gain.connect(this.context.destination);
this.filters[index] = filter;
this.gains[index] = gain;
接下来,您需要将滑块连接到增益控件的增益参数。我真的不知道网络音频,所以我把它留给你。最后一件事是您需要指定过滤器的Q。我从你的频率列表中得到的印象是,你正在尝试创建倍频程宽的滤波器,所以Q因子可能在1.414左右。如果你想做到这一点,你真的需要做一些研究。

这里有很多东西

1) 您不应该并行使用带通滤波器来实现均衡器。在其他问题中,双四阶滤波会改变信号不同部分的相位,因此不同的频带将以不同的相位结束,并且当声音重新组合时,会对声音产生一些潜在的非常糟糕的影响

2)你想要的方法是在底端有一个低架子过滤器,顶端有一个高的搁板过滤器,中间有任何数量的调峰过滤器。这些滤波器应串联连接(即,输入信号连接到一个滤波器,该滤波器连接到另一个滤波器,该滤波器连接到另一个滤波器等,并且只有最终的滤波器应连接到audiocontext.destination。应调谐Q值(见下文),滤波器上的增益决定升压/截止。(对于平坦响应,所有滤波器增益应设置为零。)

3) type是一种枚举类型,您应该将其设置为字符串,而不是数字。“lowshelf”、“highshelf”和“peaking”是您在此处查找的类型


你可以在我的DJ应用程序中看到一个简单的三波段均衡器示例-设置。要将其修改为多波段均衡器,你需要调整每个滤波器的Q值,以使波段不会重叠太多(如果它们重叠也不错,但是如果你调整它们,你的波段会更精确)。您可以使用来检查给定Q和滤波器类型的频率响应。

谢谢您的回复。您是正确的,有一个错误。但我这边没有任何改进。实际上它似乎可以正常工作。我只是做了@cwilso建议的修改,它工作得很好,没有使用额外的gainNodeHi,非常感谢,它修复了我的问题基本上,我现在只创建没有类型的过滤器,不连接它们。然后,我根据过滤器索引给出一个类型(0:lowshelf,0对于每个频率,如何组合lowshelf和highshelf滤波器?例如,如果要修改250赫兹增益,请在350处添加lowshelf,将所有频率削减到350以上,在150处添加second highshelf,将所有频率削减到150以下。将两个增益连接起来,并立即修改其值?您认为这样做有效吗?这可以创建一个单个带通滤波器,但要重新组合每个频带的输出,您需要并行连接它们(即,将所有自定义带通滤波器连接到单个输出节点)。这不太好用-每个滤波器都会改变不同的相位,而且你不能仅仅将输出相加,因为波形会分开。你可以用它来创建一个隔离的带通,但不能创建一个均衡器。这与我使用峰值而不是带通来创建上面的均衡器的原因相同-你需要一个单一的串行信号链,即不要重新组合不同的频率分量。
var filter = this.context.createBiquadFilter();
filter = this.context.createBiquadFilter();
filter.type = 2;
filter.frequency.value = frequency;

var gain = this.context.createGainNode();

// Connect source to filter, filter to the gain, gain to destination.
this.source.connect(filter);
filter.connect(gain);
gain.connect(this.context.destination);
this.filters[index] = filter;
this.gains[index] = gain;