用C语言写一段IIR滤波器代码
时间: 2024-01-27 19:04:22 浏览: 120
当然可以!下面是一个简单的IIR滤波器的C语言代码示例:
```c
#include <stdio.h>
#define N 10 // 滤波器阶数
float IIRfilter(float input, float* b, float* a, float* x, float* y) {
float output = 0.0;
// 更新输入缓冲区
for (int i = N - 1; i > 0; i--) {
x[i] = x[i - 1];
}
x[0] = input;
// 计算输出
for (int i = 0; i < N; i++) {
output += b[i] * x[i];
}
for (int i = 1; i < N; i++) {
output -= a[i] * y[i];
}
// 更新输出缓冲区
for (int i = N - 1; i > 0; i--) {
y[i] = y[i - 1];
}
y[0] = output;
return output;
}
int main() {
float b[N] = {0.5, 0.3, -0.2, 0.1, 0.4, 0.6, -0.3, 0.2, -0.5, 0.1}; // 分子系数
float a[N] = {1.0, -0.5, 0.8, -0.3, 0.2, 0.6, -0.4, 0.7, -0.2, 0.5}; // 分母系数
float x[N] = {0.0}; // 输入缓冲区
float y[N] = {0.0}; // 输出缓冲区
float input = 0.0;
// 模拟输入信号,计算滤波器的输出
for (int i = 0; i < 100; i++) {
input = i * 0.01; // 输入信号为0到1之间的线性增加序列
float output = IIRfilter(input, b, a, x, y);
printf("Input: %f, Output: %f\n", input, output);
}
return 0;
}
```
这个代码示例演示了一个10阶的IIR滤波器,你可以根据需要修改分子系数 `b` 和分母系数 `a` 的值,以及输入信号的生成方式。该代码使用了两个长度为N的缓冲区 `x` 和 `y` 分别存储输入和输出的历史数据。IIRfilter函数根据差分方程计算滤波器的输出,并更新缓冲区的值。主函数模拟了一个输入信号,计算并输出滤波器的输出结果。
阅读全文