2017-02-28 38 views
2

我希望能夠將vDSP_biquad功能用作單極濾波器。使用vDSP_biquad作爲單極濾波器

我的一個極濾波器是這樣的:

output[i] = onePole->z1 = input[i] * onePole->a0 + onePole->z1 * onePole->b1; 

其中

b1 = exp(-2.0 * M_PI * (_frequency/sampleRate)); 
    a0 = 1.0 - b1; 

此一個極的偉大工程,但當然這不是最優化,這就是爲什麼我想使用加速框架加快速度。

由於vDSP_biquad使用biquad實現的直接形式II,在我看來,我應該能夠設置係數以將其用作單極點濾波器。 https://en.wikipedia.org/wiki/Digital_biquad_filter#Direct_form_2

filter->omega = 2 * M_PI * freq/sampleRate; 
filter->b1 = exp(-filter->omega); 
filter->b0 = 1 - filter->b1; 
filter->b2 = 0; 
filter->a1 = 0; 
filter->a2 = 0; 

但是,這不起到單極濾波器的作用。 (biquad的實現很好,我用它來處理許多其他的濾波器類型,只是這些係數沒有所需的效果)。

我在做什麼錯?

同時開放聽取其他方法來優化加速或其他方式的單極濾波器。

回答

2

公式in the Apple docs是:

y[n] = b0*x[n] + b1*x[n-1] + b2*x[n-2] - a1*y[n-1] - a2*y[n-2]

在你上面的代碼中,你使用b1這是兩個輸入前。對於單極點,您需要使用之前的輸出y[n-1]

所以我想你想的係數爲:

a1 = -exp(-2.0 * M_PI * (_frequency/sampleRate))

b0 = 1.0 + a1

+0

感謝。花了我一分鐘解決,但有一個小小的錯誤。因爲a1在這裏是負的,它需要是b0 = 1.0 + a1 – olynoise

+1

@olynoise固定:) – Taylor