2015-11-17 31 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 :铬 –