4阶巴特沃斯带通滤波器C语言代码
时间: 2023-09-20 11:12:08 浏览: 211
以下是一个4阶巴特沃斯带通滤波器的C语言代码:
```c
#include <stdio.h>
#include <math.h>
#define PI 3.14159265358979323846
/* 巴特沃斯带通滤波器函数 */
void butterworth_bandpass_filter(double *input, double *output, int n_samples, double sample_rate, double cutoff_low, double cutoff_high)
{
// 计算通带和阻带的角频率
double omega_low = 2 * PI * cutoff_low / sample_rate;
double omega_high = 2 * PI * cutoff_high / sample_rate;
// 计算截止频率的比值
double alpha = omega_high / omega_low;
// 计算滤波器参数
double a0 = 1.0;
double a1 = -3 * cos(omega_low) / (1 + alpha);
double a2 = 3 / (1 + alpha);
double a3 = -a1;
double a4 = a0;
double b0 = alpha * sin(omega_low) / 2;
double b1 = 0;
double b2 = -b0;
// 初始化滤波器状态
double w0 = 0;
double w1 = 0;
double w2 = 0;
double w3 = 0;
double w4 = 0;
// 对每个输入样本进行滤波
for (int i = 0; i < n_samples; i++) {
// 更新状态变量
w0 = input[i] - a1 * w1 - a2 * w2 - a3 * w3 - a4 * w4;
output[i] = b0 * (w0 + 2 * w2 + w4) + b1 * (w1 + w3) + b2 * w2;
w4 = w3;
w3 = w2;
w2 = w1;
w1 = w0;
}
}
```
这个函数接受输入信号`input`和输出信号`output`的指针,以及信号长度`n_samples`、采样率`sample_rate`、带通滤波器的下限截止频率`cutoff_low`和上限截止频率`cutoff_high`。它会根据给定的参数计算出滤波器系数,并对输入信号进行滤波,将结果保存到输出信号中。注意,这个函数没有进行任何错误检查,使用时需要确保参数的合法性。
阅读全文