我正在尝试制作 IIR 滤波器。我做了FIR滤波器,但是我觉得IIR比FIR难。
我认为 IIR 与 FIR 类似,但它让我感到困惑。
我觉得过滤器是这样的
FIR : y(n) = b0(x[n]) + ... +bM-1(x[n-M+1])
IIR : y(n) = {b0(x[n]) + ... +bM-1(x[n-M+1])} - {a1(y[n-1]) + ... +aN(y[n-N}
在这种情况下,a0 怎么样?是只有1吗?
y[n-1]..... 的部分是问题所在。我不知道怎么做。
这是我的代码。
for (n = 0; n < length; n++) {
coeffa = coeffs_A;
coeffb = coeffs_B;
inputp = &insamp[filterLength - 1 + n];
acc = 0;
bcc = 0;
for (k = 0; k < filterLength; k++) {
bcc += (*coeffb++) * (*inputp--);
}
for (k = 0; k < filterLength; k++) {
acc += (*coeffa++) * (////////);
}
output[n] = bcc-acc;
}
在这种情况下,filterLength 为 7,n 为 80
//////是我想知道的。
我想错了吗?
最佳答案
通常 IIR 滤波器是使用直接 form I 实现的或直接form II拓扑。每种形式都需要内存状态。这些内存状态将输出和输入的历史记录保存在其中。这使得 IIR 滤波器的实现变得更加简单。 gtkiostream implements a direct form II approach并且可能是有用的引用。
在解决您的问题时,我喜欢直接从输入和输出估计过滤器的方法,使用输入和输出缓冲区作为内存状态。由于系数总是对输出进行操作,因此使用输出作为缺失变量,如下所示:
acc += (*coeffa++) * output[n-k];
关于c - 如何制作 IIR 滤波器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50585322/