c - 如何制作 IIR 滤波器?

标签 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

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

我想错了吗?

最佳答案

通常 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/

相关文章:

c - 共享库函数未加载到同一内存位置

c - 我们如何在Linux 2.6 中从保护模式切换到实模式?

c - 为结构内部的指针赋值

filter - 过滤器是如何实现的?

authentication - Laravel 5 检查用户是否登录

python - Django 中不存在搜索

c - 如何在包含 char * 指针的结构**中存储动态字符串

c - 在socket编程c中,为什么我们使用memset将值0填充到结构体中?

python - 过滤功能-如何将外键对象属性作为关键字传递

elasticsearch - elasticsearch需要在 bool 中添加一个必须的查询