如何制作IIR滤波器?

时间:2018-05-29 13:12:46

标签: c filter

我试图制作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

//////是我想知道的。

我认为错了吗?

1 个答案:

答案 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;
}

我不完全确定这是正确的,因为我无法使用针对过滤器设计工具的不同过滤器设置进行测试。

给定系数的脉冲响应似乎没问题。但是我几年没有在这个主题上做过任何事情,所以我不确定。我认为一般的想法应该没问题。