二阶低通滤波器代码
时间: 2023-07-02 14:04:48 浏览: 104
以下是一个简单的二阶低通滤波器的代码实现(使用巴特沃斯滤波器设计):
```
#include <math.h>
#define PI 3.1415926
typedef struct {
double a1;
double a2;
double b0;
double b1;
double b2;
double x1;
double x2;
double y1;
double y2;
} FilterState;
void initFilter(FilterState *state, double cutoffFreq, double sampleRate) {
double Q = 0.7071; // 滤波器的品质因数,这里取0.7071
double w0 = 2 * PI * cutoffFreq / sampleRate; // 角频率
double alpha = sin(w0) / (2 * Q);
double a0 = 1 + alpha;
state->a1 = -2 * cos(w0) / a0;
state->a2 = (1 - alpha) / a0;
state->b0 = (1 - cos(w0)) / 2 / a0;
state->b1 = 1 - cos(w0)) / a0;
state->b2 = (1 - cos(w0)) / 2 / a0;
// 初始化状态变量
state->x1 = 0;
state->x2 = 0;
state->y1 = 0;
state->y2 = 0;
}
double filter(FilterState *state, double input) {
double output = state->b0 * input + state->b1 * state->x1 + state->b2 * state->x2 - state->a1 * state->y1 - state->a2 * state->y2;
// 更新状态变量
state->x2 = state->x1;
state->x1 = input;
state->y2 = state->y1;
state->y1 = output;
return output;
}
```
使用方法:
1. 初始化滤波器状态:`FilterState state; initFilter(&state, cutoffFreq, sampleRate);`
2. 在每个采样点上调用 `filter` 函数:`double output = filter(&state, input);`
其中,`cutoffFreq` 是滤波器截止频率,`sampleRate` 是采样率,`input` 是输入信号的当前采样值,`output` 是滤波器的输出值。