2015-05-05 160 views
6

我一直在四处寻找使用Web音频API创建音频均衡器:http://webaudio.github.io/web-audio-api/网络音频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; 
}; 

最后,当我改变滑块的值I更新滤波器:

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

注意:我的this.gainScale函数将[0,1]中的值作为输入,并返回[-40,40]中的值以将增益设置为-40至40之间的每个频率。

将不胜感激任何帮助!

回答

9

这里有很多东西。

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

2)您需要的方法是在底端有一个低架滤波器,在顶端有一个高架滤波器,在中间有任何数量的峰化滤波器。这些应该串联连接(即输入信号连接到一个滤波器,它连接到另一个滤波器,它连接到另一个滤波器等,只有最后的滤波器应该连接到audiocontext.destination。Q值应该是(对于平坦响应,所有滤波器增益应该设置为零)。

3)filter.type是一个枚举类型,您应该设置它(请参阅下文),并且滤波器上的增益决定了增强/作为一个字符串,而不是一个数字。 “lowshelf”,“highshelf”和“峰值”是你在这里寻找的。

你可以在我的DJ应用程序 - https://github.com/cwilso/wubwubwub/blob/MixTrack/js/tracks.js#L189-L207中看到一个简单的三频均衡器的例子。要将其修改为多波段均衡器,您需要调整每个滤波器的Q值以使波段不会重叠太多(如果它们重叠,这并不坏),但是如果您调整它们,它们会更精确) 。您可以使用http://googlechrome.github.io/web-audio-samples/samples/audio/frequency-response.html来检查给定Q和滤波器类型的频率响应。

+1

嗨,非常感谢,它解决了我的大部分问题,并开始听起来像是不是太糟糕。 基本上,我现在只是创建没有类型的过滤器,而不连接它们。 然后,我根据过滤器索引给出一个类型(0:lowshelf,0 Charles

+0

结合每个频率的低架和高架滤波器怎么样? –

+0

例如,如果您想修改250赫兹的增益,将350减少到350以上,将第二个高架减少到150,从而将所有的部分切割到150以下。连接两个增益并一次修改它们的值?您认为这样会起作用吗? –

0

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

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左右。如果你想正确的做到这一点,你真的需要做一些研究。

+0

感谢您的回复。你是对的,有一个错误。但在我身边没有改进 – Charles

+0

@Charles。查看我的编辑。 – jaket

+0

实际上,它似乎能够正常工作。我只是做了@cwilso建议的修改,它工作得很好,没有使用额外的增益节点 – Charles