簡體   English   中英

Web音頻API均衡器

[英]Web audio API equalizer

我一直在尋找使用Web音頻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]。 對於每個滑塊,我創建一個過濾器並將其連接到源,如下所述: 使用Web Audio API創建10波段均衡器

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]中的值作為輸入,並返回[-40,40]中的值,以便為每個頻率設置-40到40之間的增益。

非常感謝任何幫助!

這里有很多東西。

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和過濾器類型的頻率響應。

一個問題是您希望滑塊在給定頻率下控制濾波器的增益,而不是濾波器頻率本身。 根據規范,帶通濾波器的增益是不可控制的,這是一個小的限制。 幸運的是,您可以在每個過濾器的末尾添加一個增益節點。

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。 如果你想做到這一點,你真的需要做一些研究。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM