基于C语言 实现iir2阶滤波器
时间: 2024-01-27 16:03:49 浏览: 248
以下是一个IIR二阶滤波器的C语言实现:
```c
#include <stdio.h>
#define N 2 // 系数数量
void iir2_filter(float *x, float *y, float *b, float *a, int n, int len);
int main(void) {
// 输入信号
float x[10] = {1.0, 2.0, 3.0, 4.0, 5.0, 4.0, 3.0, 2.0, 1.0, 0.0};
// 输出信号
float y[10] = {0.0};
// IIR二阶滤波器系数
float b[N+1] = {0.5, 0.5, 0.0}; // 分子系数
float a[N+1] = {1.0, -0.8, 0.16}; // 分母系数
iir2_filter(x, y, b, a, N, 10);
for (int i = 0; i < 10; i++) {
printf("y[%d] = %f\n", i, y[i]);
}
return 0;
}
void iir2_filter(float *x, float *y, float *b, float *a, int n, int len) {
float v[N+1] = {0.0}; // 中间变量
for (int i = 0; i < len; i++) {
y[i] = b[0] * x[i] + v[0];
v[0] = b[1] * x[i] - a[1] * y[i] + v[1];
v[1] = b[2] * x[i] - a[2] * y[i];
}
}
```
其中,`x`为输入信号,`y`为输出信号,`b`为分子系数,`a`为分母系数,`n`为IIR滤波器的阶数,`len`为信号的长度。
具体实现中,利用`v`数组来存储中间变量,以便在滤波器计算过程中复用。在`iir2_filter`函数中,使用差分方程进行滤波器计算。
阅读全文