如何用C语言写巴特沃斯高通滤波器
时间: 2023-09-24 20:11:31 浏览: 265
巴特沃斯高通滤波器可以使用C语言进行实现。下面是一段示例代码,可以实现一个二阶巴特沃斯高通滤波器。
```c
#include <math.h>
#define PI 3.14159265358979323846
typedef struct {
double a0, a1, a2;
double b1, b2;
double x1, x2;
double y1, y2;
} biquad;
void init_biquad(biquad *f, double Q, double fc, double fs) {
double K = tan(PI * fc / fs);
double norm = 1 / (1 + K / Q + K * K);
f->a0 = K * K * norm;
f->a1 = 2 * f->a0;
f->a2 = f->a0;
f->b1 = 2 * (K * K - 1) * norm;
f->b2 = (1 - K / Q + K * K) * norm;
f->x1 = 0;
f->x2 = 0;
f->y1 = 0;
f->y2 = 0;
}
double apply_biquad(biquad *f, double x) {
double y = f->a0 * x + f->a1 * f->x1 + f->a2 * f->x2
- f->b1 * f->y1 - f->b2 * f->y2;
f->x2 = f->x1;
f->x1 = x;
f->y2 = f->y1;
f->y1 = y;
return y;
}
void biquad_highpass_filter(double *input, double *output, int length,
double Q, double fc, double fs) {
biquad f;
init_biquad(&f, Q, fc, fs);
for (int i = 0; i < length; i++) {
output[i] = apply_biquad(&f, input[i]);
}
}
```
在上面的示例代码中,我们定义了一个 `biquad` 结构体,用于存储滤波器的状态,包括系数和历史输入输出值等。`init_biquad` 函数用于初始化滤波器,输入参数包括滤波器的品质因数 `Q`、截止频率 `fc` 和采样频率 `fs`。`apply_biquad` 函数用于对一个输入样本进行滤波,并返回输出样本。最后,`biquad_highpass_filter` 函数用于对一组输入样本进行滤波,并将输出结果保存到另一个数组中。
在上面的示例代码中,我们实现了一个二阶巴特沃斯高通滤波器。如果需要实现更高阶的滤波器,可以将多个二阶滤波器级联起来,以实现更高的阶数。
阅读全文