2017-02-28 91 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