我试图制作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
//////是我想知道的。
我认为错了吗?
答案 0 :(得分:-1)
我拿了你的程序并重写了一下,使它成为MCVE并且更容易阅读:
#include <stdio.h>
#define flen 3
#define slen 10
int main(void)
{
int n,k;
double a[flen] = {1,-0.5,0}, b[flen]={1,0,0};
double input[slen]={0,0,1}; // 0s for flen-1 to avoid out of bounds
double output[slen]={0};
double acc, bcc;
for (n = flen-1; n < slen; n++) {
acc = 0;
bcc = 0;
for (k = 0; k < flen; k++) {
bcc += b[k] * (input[n-k]);
}
for (k = 0; k < flen; k++) {
acc += a[k] * (output[n-k]);
}
output[n] = bcc-acc;
printf("%f\t%f\t%f\t%f\n",input[n],acc,bcc,output[n]);
}
return 0;
}
我不完全确定这是正确的,因为我无法使用针对过滤器设计工具的不同过滤器设置进行测试。
给定系数的脉冲响应似乎没问题。但是我几年没有在这个主题上做过任何事情,所以我不确定。我认为一般的想法应该没问题。