用c语言设计一个三阶滤波器
时间: 2023-11-19 17:06:44 浏览: 165
三阶滤波器可以使用巴特沃斯滤波器实现,其具有平滑响应和无纹波特性,可以用于信号滤波和降噪。以下是一个使用C语言实现的三阶低通滤波器的示例代码:
```
#include <stdio.h>
#include <math.h>
#define PI 3.1415926
//设计滤波器
void butterworth(int n, double Wc, double *b, double *a)
{
double c1 = 1.0 / tan(Wc * PI / 2.0);
double c2 = c1 * c1;
double c3 = c2 * c1;
double c4 = 1.0 + sqrt(2.0) * c1 + c2;
double c5 = 1.0 + sqrt(2.0) * c1 + c3;
double c6 = 1.0 + sqrt(2.0) * c1 + c2 + sqrt(2.0) * c1 * c4;
double c7 = 1.0 + sqrt(2.0) * c1 + c3 + sqrt(2.0) * c1 * c5;
double c8 = c2 / c6;
double c9 = c3 / c7;
b[0] = c8;
b[1] = 2.0 * c8;
b[2] = c8;
a[0] = 1.0;
a[1] = -2.0 * (c1 * c4 - 1.0) / c6;
a[2] = -(c5 - sqrt(2.0) * c1 * c4 + 1.0) / c6;
if (n == 3) {
b[0] *= c9;
b[1] *= c9;
b[2] *= c9;
a[1] *= c9;
a[2] *= c9;
}
}
//滤波函数
void filter(double *x, double *y, int n, double *b, double *a)
{
int i, j;
double sum;
for (i = 0; i < n; ++i) {
sum = 0.0;
for (j = 0; j <= 2; ++j) {
if (i - j >= 0) {
sum += b[j] * x[i - j];
}
}
for (j = 1; j <= 2; ++j) {
if (i - j >= 0) {
sum -= a[j] * y[i - j];
}
}
y[i] = sum / a[0];
}
}
//测试函数
int main()
{
int i, n;
double Wc = 0.1; //截止频率
double b[3], a[3];
double x[10] = {1.0, 1.2, 1.4, 1.6, 1.8, 2.0, 2.2, 2.4, 2.6, 2.8};
double y[10];
n = 10;
butterworth(3, Wc, b, a);
filter(x, y, n, b, a);
for (i = 0; i < n; ++i) {
printf("%f\n", y[i]);
}
return 0;
}
```
在这个代码示例中,我们使用巴特沃斯滤波器设计了一个三阶低通滤波器。首先通过 `butterworth` 函数计算出滤波器的系数 `b` 和 `a`,然后在 `filter` 函数中对输入信号 `x` 进行滤波得到输出信号 `y`。在测试函数中,我们使用一个简单的输入信号 `x`,并打印出滤波后的输出信号 `y`。
请注意,这只是一个简单的示例代码,实际应用中可能需要根据具体需求进行修改和调整。此外,在实际应用中还需要考虑滤波器的性能指标(如截止频率、通带和阻带衰减等)和滤波器类型的选择(如低通、高通、带通、带阻等)。
阅读全文