用C语言设计一个IIR
时间: 2023-12-18 17:02:05 浏览: 152
IIR(Infinite Impulse Response,无限脉冲响应)滤波器是一种数字滤波器,它的输出是输入信号和滤波器的历史输出值的加权和。设计IIR滤波器需要确定滤波器的传递函数和滤波器的阶数,然后根据传递函数和阶数设计滤波器系数。
以下是一个用C语言实现IIR滤波器的示例代码,这里使用的是二阶巴特沃斯滤波器:
```c
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define PI 3.14159265358979323846
typedef struct {
double b0, b1, b2; // 分子系数
double a1, a2; // 分母系数
double x1, x2; // 输入历史值
double y1, y2; // 输出历史值
} iir_filter;
void iir_filter_init(iir_filter *filter, double fc, double Q, double fs) {
double w0 = 2.0 * PI * fc / fs;
double alpha = sin(w0) / (2.0 * Q);
double cosw0 = cos(w0);
double a0 = 1.0 + alpha;
filter->b0 = (1.0 - cosw0) / 2.0 / a0;
filter->b1 = 1.0 - cosw0 / a0;
filter->b2 = filter->b0;
filter->a1 = -2.0 * cosw0 / a0;
filter->a2 = (1.0 - alpha) / a0;
filter->x1 = 0.0;
filter->x2 = 0.0;
filter->y1 = 0.0;
filter->y2 = 0.0;
}
double iir_filter_apply(iir_filter *filter, double x) {
double y = filter->b0 * x + filter->b1 * filter->x1 + filter->b2 * filter->x2
- filter->a1 * filter->y1 - filter->a2 * filter->y2;
filter->x2 = filter->x1;
filter->x1 = x;
filter->y2 = filter->y1;
filter->y1 = y;
return y;
}
int main() {
// 设计一个二阶低通巴特沃斯滤波器,截止频率为800Hz,通带增益为1,阻带衰减为40dB,采样率为8kHz
iir_filter filter;
iir_filter_init(&filter, 800.0, 0.707, 8000.0);
// 生成一个测试信号,包含1000Hz和2000Hz两个正弦波
double f1 = 1000.0;
double f2 = 2000.0;
double fs = 8000.0;
double duration = 1.0;
int length = (int)(fs * duration);
double *signal = (double*)malloc(length * sizeof(double));
for (int i = 0; i < length; i++) {
double t = (double)i / fs;
signal[i] = sin(2.0 * PI * f1 * t) + sin(2.0 * PI * f2 * t);
}
// 将信号输入到滤波器中进行滤波
for (int i = 0; i < length; i++) {
signal[i] = iir_filter_apply(&filter, signal[i]);
}
// 输出滤波后的信号
for (int i = 0; i < length; i++) {
printf("%f\n", signal[i]);
}
free(signal);
return 0;
}
```
在这个示例代码中,我们定义了一个iir_filter结构体,用于存储IIR滤波器的状态以及滤波器系数。iir_filter_init函数用于初始化滤波器的系数,iir_filter_apply函数用于对输入信号进行滤波。在main函数中,我们首先生成一个测试信号,然后将信号输入到滤波器中进行滤波,最后输出滤波后的信号。
阅读全文