2015-05-05 81 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