使用 vDSP_biquad 作为单极滤波器
Using vDSP_biquad as a one pole filter
我希望能够将 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;
但是,这不适用于单极滤波器。 (biquad 的实现很好,我将它用于许多其他滤波器类型,只是这些系数没有达到预期的效果)。
我做错了什么?
也乐于听取其他使用 Accelerate 或其他方式优化单极滤波器的方法。
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
我希望能够将 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;
但是,这不适用于单极滤波器。 (biquad 的实现很好,我将它用于许多其他滤波器类型,只是这些系数没有达到预期的效果)。
我做错了什么?
也乐于听取其他使用 Accelerate 或其他方式优化单极滤波器的方法。
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