我使用以下算法在 c 中实现了一个非常简单的一阶递归低通滤波器:
double a, b, prevOutput;
double lowPassFilter(double input)
{
double output = a * input + b * prevOutput;
prevOutput = output;
return output;
}
在哪里:
a = 1.0 - b
根据 The Scientist and Engineer's Guide to Digital Signal Processing,滤波器的截止频率由以下关系定义:
是作为采样频率一部分的 -3db 截止频率。使用,我计算出(大约)并将其插入我的过滤器。我想验证我的过滤器,所以我通过它传递了一个脉冲函数并记录了输出:
double result[128];
for (int i = 0; i < 128; ++i)
{
if (0 == i) result[i] = lowPassFilter(1.0);
else result[i] = lowPassFilter(0.0);
}
然后我对结果执行 FFT 以找到频率响应:
complex_t fftResult* = fft(result);
for (int i = 0; i < 65; ++i)
{
double amplitude = fftResult[i].real * fftResult[i].real;
amplitude += fftResult[i].img * fftResult[i].img;
amplitude = sqrt(magnitude);
printf("f = %.3f: %f\n", i / 128.0, amplitude );
}
我看到的结果在某种程度上是预期的,但也不完全是我的预期。在 DC bin ( ) 中,我看到一个非常接近 1 的幅度,并且我看到幅度在接近 0.5 时衰减。但是,我还预计在时,幅度应该在左右(即 -3db)。但幅度却在左右:
...
f = 0.242: 0.782501
f = 0.250: 0.774971
f = 0.258: 0.767380
...
除了效率低下的代码之外,我用来获取频率响应的方法是否有问题,或者我是否错误地解释了截止频率关系或其他原因?