网络音频 API 均衡器

Web audio API equalizer

我一直在寻找使用网络音频创建音频均衡器的方法API:http://webaudio.github.io/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,64,125,250,500,1000,2000,4000,8000,16000]。 我为每个滑块创建一个过滤器并将其连接到源,如下所述:Creating a 10-Band Equalizer Using Web Audio API :

Audio.prototype.createFilter = function(index,frequency){
    if(this.filters == undefined) this.filters = [];
    var filter = this.context.createBiquadFilter();
    filter = this.context.createBiquadFilter();
    filter.type = 2;
    filter.frequency.value = frequency;
    // Connect source to filter, filter to destination.
    this.source.connect(filter);
    filter.connect(this.context.destination);
    this.filters[index] = filter;
};

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

Audio.prototype.updateFilter = function(index,newVal){
    this.filters[index].frequency.gain = this.gainScale(newVal);
};

注意:我的 this.gainScale 函数将 [0,1] 中的值作为输入,returns [-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 值应进行调整(见下文),滤波器增益决定 boost/cut。(对于平坦响应,所有滤波器增益应设置为零。)

3) filter.type 是一个枚举类型,您应该将其设置为字符串,而不是数字。 "lowshelf"、"highshelf" 和 "peaking" 是您在这里寻找的。

您可以在我的 DJ 应用程序中看到一个简单的三波段均衡器示例 - https://github.com/cwilso/wubwubwub/blob/MixTrack/js/tracks.js#L189-L207 sets it up. To modify this into a multiband equalizer, you'll need to tweak the Q value of each filter to get the bands to not overlap too much (it's not bad if they do overlap, but your bands will be more precise if you tune them). You can use http://googlechrome.github.io/web-audio-samples/samples/audio/frequency-response.html 以检查给定 Q 值和滤波器类型的频率响应。