使用 vDSP_biquad 作为单极滤波器

Posted

技术标签:

【中文标题】使用 vDSP_biquad 作为单极滤波器【英文标题】:Using vDSP_biquad as a one pole filter 【发布时间】:2017-02-28 22:27:02 【问题描述】:

我希望能够将 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;

这一杆效果很好,但当然它没有优化,这就是为什么我想使用 Accelerate Framework 来加速它。

因为 vDSP_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; 

但是,这不能用作单极过滤器。 (双二阶的实现很好,我将它用于许多其他滤波器类型,只是这些系数没有达到预期的效果)。

我做错了什么?

也愿意听取使用 Accelerate 或其他方式优化单极滤波器的其他方法。

【问题讨论】:

【参考方案1】:

公式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

【讨论】:

谢谢。我花了一分钟来整理,但有一个小错误。因为这里a1是负数,所以需要b0 = 1.0 + a1 @olynoise 已修复 :)

以上是关于使用 vDSP_biquad 作为单极滤波器的主要内容,如果未能解决你的问题,请参考以下文章

卡尔曼滤波器中的 dt

卡尔曼滤波器使用旋转矩阵平滑加速度计信号

OpenCV中导向滤波介绍与应用

python——对图像进行卷积操作,使用多个滤波器

卡尔曼滤波器实例:进一步讨论自由落体运动

均值滤波,中值滤波,最大最小值滤波