c++实现巴特沃斯带通滤波器
时间: 2023-05-30 16:07:27 浏览: 87
巴特沃斯带通滤波器是一种常见的数字信号处理滤波器,它可以去除指定频率范围之外的信号,同时保留指定频率范围内的信号。它的实现基于巴特沃斯滤波器的设计方法,可以采用直接实现方法或者二阶级联实现方法。
以下是一个使用直接实现方法实现巴特沃斯带通滤波器的示例代码:
```c
#include <stdio.h>
#include <math.h>
#define PI 3.14159265358979323846
// 巴特沃斯带通滤波器设计函数
void butterworth_bandpass_filter(double *b, double *a, int n, double f1, double f2, double fs)
{
double c1 = tan(PI * f1 / fs);
double c2 = tan(PI * f2 / fs);
double a0 = c2 - c1;
double a1 = 0;
double a2 = -(c2 + c1);
double b0 = 1;
double b1 = (-2 * cos(PI * (f1 + f2) / fs)) / (1 + a0);
double b2 = (1 - a0) / (1 + a0);
for (int i = 0; i < n; i++) {
b[i] = 0;
a[i] = 0;
}
b[0] = b0 / b2;
b[1] = b1 / b2;
b[2] = 1 / b2;
a[0] = 1;
a[1] = a1 / a0;
a[2] = a2 / a0;
}
// 巴特沃斯带通滤波器实现函数
void butterworth_bandpass_filter_apply(double *b, double *a, int n, double *x, double *y, int len)
{
double w0 = b[0] * x[0];
double w1 = 0;
double w2 = 0;
double v0 = 0;
double v1 = 0;
double v2 = 0;
for (int i = 0; i < len; i++) {
w2 = w1;
w1 = w0;
w0 = b[0] * x[i] + b[1] * w1 + b[2] * w2;
v2 = v1;
v1 = v0;
v0 = a[0] * w0 + a[1] * v1 + a[2] * v2;
y[i] = v0;
}
}
int main()
{
// 采样频率
double fs = 1000;
// 设计带通滤波器
double b[3];
double a[3];
butterworth_bandpass_filter(b, a, 3, 50, 150, fs);
// 模拟输入信号
double x[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int len = sizeof(x) / sizeof(double);
// 应用滤波器
double y[len];
butterworth_bandpass_filter_apply(b, a, 3, x, y, len);
// 输出结果
printf("Input signal:\n");
for (int i = 0; i < len; i++) {
printf("%f ", x[i]);
}
printf("\n");
printf("Output signal:\n");
for (int i = 0; i < len; i++) {
printf("%f ", y[i]);
}
printf("\n");
return 0;
}
```
在上面的示例中,通过调用`butterworth_bandpass_filter`函数设计巴特沃斯带通滤波器,并将其系数存储在`b`和`a`数组中。然后,通过调用`butterworth_bandpass_filter_apply`函数将输入信号`x`作为滤波器的输入,输出信号`y`作为滤波器的输出。最后,将输入信号和输出信号打印到控制台上。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![docx](https://img-home.csdnimg.cn/images/20210720083331.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)