用C语言实现一个FIR带通滤波器
时间: 2023-05-28 12:04:25 浏览: 97
```c
#include <stdio.h>
#include <math.h>
#define M 51 // 滤波器阶数
#define PI 3.14159265358979323846
int main()
{
double fc1 = 0.2; // 通带截止频率1
double fc2 = 0.4; // 通带截止频率2
double fs = 1; // 采样频率
double wc1 = 2 * PI * fc1 / fs; // 规格化通带截止频率1
double wc2 = 2 * PI * fc2 / fs; // 规格化通带截止频率2
double h[M]; // FIR滤波器系数
double sum = 0;
// 计算FIR滤波器系数
for (int n = 0; n < M; n++)
{
if (n == (M - 1) / 2)
{
h[n] = (wc2 - wc1) / PI;
}
else
{
h[n] = (sin(wc2 * (n - (M - 1) / 2)) - sin(wc1 * (n - (M - 1) / 2))) / (PI * (n - (M - 1) / 2));
}
sum += h[n]; // 求系数和,用于归一化
}
// 归一化
for (int n = 0; n < M; n++)
{
h[n] /= sum;
}
// 输出滤波器系数
for (int n = 0; n < M; n++)
{
printf("h[%d] = %f\n", n, h[n]);
}
return 0;
}
```
注:本程序实现了一个51阶的FIR带通滤波器,通带截止频率为0.2Hz~0.4Hz,采样频率为1Hz。在实际应用中,可以根据需要调整截止频率和阶数。