2015-11-17 46 views
0

我正在做下采樣48hkz到16khz。要做到這一點,我需要一個過濾器來防止混淆。 WebAudio API已經filters,而這正是我要尋找:BiQuadFilters vs MyOwnFilter - Javascript WebAudio API

biquadFilter = context.createBiquadFilter(); 
biquadFilter.type = "lowpass"; 
biquadFilter.frequency.value = 12000; 
biquadFilter.Q.value = 3; 

,但我可以用這個簡單的算法使這個:

//Order 3 - Indirect form 2 
var a_coef = [1.000000000000000, -0.965779713179161, 0.582644165984302 , -0.106017056545330]; 
var b_coef = [0.063855924532476, 0.191567773597429, 0.191567773597429, 0.063855924532476]; 

var z1 = 0; var z2 = 0; var z3 = 0; var z0 = 0; 
for (var i = 0; i < buffer.length; i++) { 
    z0 = buffer[i] + a_coef[1] * z1-a_coef[2] * z2-a_coef[3] * z3; 
    buffer[i] = b_coef[0] * z0 + b_coef[1] * z1+b_coef[2] * z2 + b_coef[3] * z3; 
    z3 = z2; z2 = z1; z1 = z0; 
}; 

哪種方式消耗更多的資源? BiquadFilters在本地代碼中被翻譯?是最有效的方法嗎?

回答

1

BiquadFilters實際上是用本地代碼編寫的,你可能更適合在99.9%的可能情況下使用它們。

JavaScript引擎可以做一些驚人的優化,可以把JS放在本地實現的大局中,但可能不是這種情況。你真的需要知道如何用可優化的代碼「提供」引擎來獲得你需要的各種提升,這本身就是一門完整的科學(一個好的起點是永遠不要在循環內聲明一個var)。

+0

所以儘管「myownfilter」的操作簡單。 WebAudioAPI的過濾器將始終在「結果與資源消耗」關係中做得更好。 – carduh

+0

你能否給我一些鏈接,我可以證明WAAPI的哪些部分是用本機代碼寫的? @OskarEriksson – carduh

+0

當然可以! BiquadNode(以及其他API)可以在這裏找到:https://code.google.com/p/chromium/codesearch#chromium/src/third_party/WebKit/Source/modules/webaudio/BiquadFilterNode.cpp&sq=package :鉻 –