高性能4阶巴特沃斯带通滤波器的C语言代码实现
时间: 2023-09-20 11:12:05 浏览: 320
以下是一个高性能4阶巴特沃斯带通滤波器的C语言代码实现,该代码使用了双倍精度浮点数进行计算。
```c
#include <math.h>
#define PI 3.14159265358979323846
typedef struct {
double b0, b1, b2, b3, b4;
double a1, a2, a3, a4;
double x1, x2, y1, y2;
} biquad;
void calc_biquad(biquad *bq, double fs, double f0, double Q, double db_gain) {
double K = tan(PI * f0 / fs);
double V0 = pow(10, db_gain / 20);
double V1 = sqrt(V0);
double V2 = sqrt(V1);
double norm;
if (db_gain >= 0) {
norm = 1 / (1 + V1 / Q * K + K * K);
bq->b0 = V1 * (1 + K * K) * norm;
bq->b1 = 2 * V1 * (K * K - 1) * norm;
bq->b2 = V1 * (1 - K * K) * norm;
bq->a1 = 2 * (K * K - 1) * norm;
bq->a2 = (1 - V1 / Q * K + K * K) * norm;
} else {
norm = 1 / (1 + V1 / Q * K + K * K);
bq->b0 = (1 + V1 / Q * K + K * K) * norm;
bq->b1 = 2 * (K * K - 1) * norm;
bq->b2 = (1 - V1 / Q * K + K * K) * norm;
bq->a1 = 2 * (K * K - 1) * norm;
bq->a2 = (1 - V1 / Q * K + K * K) * norm;
}
bq->b3 = 0;
bq->b4 = 0;
bq->a3 = 0;
bq->a4 = 0;
bq->x1 = 0;
bq->x2 = 0;
bq->y1 = 0;
bq->y2 = 0;
}
double process_sample(biquad *bq, double x0) {
double y0 = bq->b0 * x0 + bq->b1 * bq->x1 + bq->b2 * bq->x2 - bq->a1 * bq->y1 - bq->a2 * bq->y2;
bq->x2 = bq->x1;
bq->x1 = x0;
bq->y2 = bq->y1;
bq->y1 = y0;
return y0;
}
```
使用时,首先需要初始化一个 biquad 结构体,然后调用 calc_biquad 函数进行参数的设置,最后在处理每个采样点时调用 process_sample 函数即可。其中,参数 fs 表示采样率,f0 表示带通滤波器的中心频率,Q 表示品质因数,db_gain 表示增益或削弱量。
阅读全文