巴特沃斯滤波器 C/C++代码
时间: 2023-11-03 10:05:56 浏览: 174
c++巴特沃斯数字滤波器
以下是一个简单的巴特沃斯滤波器的C/C++代码:
```c++
#include <cmath>
// 巴特沃斯滤波器函数
void butterworthFilter(double* input, double* output, int length, double fc, int order, double fs) {
double w0 = 2.0 * M_PI * fc / fs; // 角频率
double c = 1.0 / tan(w0 / 2.0); // 系数
double a[order+1], b[order+1]; // 系数数组
double w[order+1], w_prev[order+1]; // 存储上次的状态变量
// 计算巴特沃斯滤波器的系数
for (int i = 0; i <= order; i++) {
double alpha = sin((2.0 * i + 1.0) * M_PI / (4.0 * order + 2.0));
double beta = c * c + 1.0 - 2.0 * c * alpha;
a[i] = c * c / beta;
b[i] = 2.0 * c * c / beta;
if (i > 0) {
a[i] *= -1.0;
}
}
// 初始化状态变量
for (int i = 0; i <= order; i++) {
w[i] = 0.0;
w_prev[i] = 0.0;
}
// 应用滤波器
for (int n = 0; n < length; n++) {
double xn = input[n];
double yn = 0.0;
for (int i = 0; i <= order; i++) {
yn += b[i] / (1.0 + a[i]) * xn + a[i] / (1.0 + a[i]) * w[i] - a[i] / (1.0 + a[i]) * w_prev[i];
w_prev[i] = w[i];
w[i] = yn - xn * b[i] / (1.0 + a[i]);
}
output[n] = yn;
}
}
```
这个函数接受一个输入数组,一个输出数组,输入和输出数组的长度,滤波器的截止频率,滤波器的阶数,和采样率作为参数。它返回一个经过滤波器处理后的输出数组。在函数内部,它首先计算出巴特沃斯滤波器的系数,然后初始化状态变量,最后应用滤波器来处理输入信号并产生输出信号。
阅读全文