用c语言设计一个二阶滤波器
时间: 2023-07-16 19:17:04 浏览: 82
下面是一个二阶低通滤波器的C代码示例:
```
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define PI 3.1415926
/* 定义二阶低通滤波器结构体 */
typedef struct {
double a0, a1, a2;
double b0, b1, b2;
double x1, x2;
double y1, y2;
} SecondOrderFilter;
/* 初始化二阶低通滤波器 */
void initFilter(SecondOrderFilter *filter, double f0, double fs) {
double w0 = 2 * PI * f0 / fs;
double cosw0 = cos(w0);
double sinw0 = sin(w0);
double alpha = sinw0 / (2 * 0.707);
filter->a0 = 1 + alpha;
filter->a1 = -2 * cosw0;
filter->a2 = 1 - alpha;
filter->b0 = (1 - cosw0) / 2;
filter->b1 = 1 - cosw0;
filter->b2 = (1 - cosw0) / 2;
filter->x1 = 0;
filter->x2 = 0;
filter->y1 = 0;
filter->y2 = 0;
}
/* 二阶低通滤波器处理 */
double processFilter(SecondOrderFilter *filter, double input) {
double output = filter->b0 / filter->a0 * input
+ filter->b1 / filter->a0 * filter->x1
+ filter->b2 / filter->a0 * filter->x2
- filter->a1 / filter->a0 * filter->y1
- filter->a2 / filter->a0 * filter->y2;
filter->x2 = filter->x1;
filter->x1 = input;
filter->y2 = filter->y1;
filter->y1 = output;
return output;
}
/* 测试代码 */
int main() {
double f0 = 100; /* 截止频率 */
double fs = 1000; /* 采样率 */
double t = 0; /* 当前时间 */
double dt = 1 / fs; /* 采样间隔 */
double input = 0; /* 输入信号 */
double output = 0; /* 输出信号 */
SecondOrderFilter filter;
initFilter(&filter, f0, fs);
/* 生成输入信号 */
for (int i = 0; i < 1000; i++) {
input = sin(2 * PI * 10 * t) + sin(2 * PI * 100 * t);
output = processFilter(&filter, input);
printf("%f,%f,%f\n", t, input, output);
t += dt;
}
return 0;
}
```
该代码中,我们定义了一个二阶低通滤波器结构体 `SecondOrderFilter`,包含了滤波器的系数和历史输入输出值。函数 `initFilter` 用于初始化滤波器,输入截止频率 `f0` 和采样率 `fs`,根据公式计算出滤波器的系数。函数 `processFilter` 用于处理输入信号,根据滤波器的差分方程计算出输出信号,并更新历史输入输出值。
在测试代码中,我们生成了一个由两个正弦波叠加而成的输入信号,并通过 `processFilter` 函数进行滤波处理,输出结果包含时间、输入信号和输出信号。