简单C语言实现fir带通滤波器
时间: 2023-06-08 20:06:39 浏览: 114
好的,以下是一个简单的C语言代码实现fir带通滤波器的例子:
```c
#define N 100 // 输入信号的长度
#define M 31 // FIR滤波器的长度
// FIR滤波器的系数
double h[M] = {...};
// 输入信号
double x[N] = {...};
// 输出信号
double y[N];
// FIR滤波器的实现
for (int n = 0; n < N; n++) {
double sum = 0.0;
for (int k = 0; k < M; k++) {
if (n-k >= 0) {
sum += h[k] * x[n-k];
}
}
y[n] = sum;
}
// 输出结果
for (int n = 0; n < N; n++) {
printf("%f ", y[n]);
}
```
在这个例子中,我们实现了一个长度为31的FIR带通滤波器,输入信号的长度为100。我们创建了一个数组`h`来存储滤波器的系数,创建了一个数组`x`来存储输入信号,同时创建了数组`y`来存储输出信号。我们通过一个嵌套的for循环来实现FIR滤波器的计算。在外层循环中遍历输入信号的每一个采样点,对于每个采样点,内层循环遍历FIR滤波器的所有系数,计算它们的加权和,并将结果存储在输出信号数组中。最后,我们通过另一个for循环将输出信号打印出来。
希望这个例子可以帮助你更好地理解如何在C语言中实现FIR滤波器。
相关问题
fir带通滤波器c语言
FIR带通滤波器是一种常见的数字滤波器,可以在频域上选择一定范围内的频率进行滤波处理。其原理是通过对输入信号的每个采样点进行加权求和的方式实现滤波效果。
在C语言中实现FIR带通滤波器,可以按照以下步骤进行:
1. 定义滤波器的系数数组:根据设计要求,选择一组合适的FIR滤波器系数,可以通过一些滤波器设计工具或者使用经验公式得到。
2. 定义输入和输出的缓冲数组:根据实际应用场景的采样率和信号长度,定义输入和输出信号的缓冲数组。
3. 实现滤波器的计算过程:使用一个循环结构,对输入信号的每个采样点进行滤波计算。在每个采样点上,按照系数数组的长度,对输入信号和系数数组进行加权求和操作,得到输出信号的一个采样点。
4. 更新输入信号缓冲数组:在每次计算完一个采样点之后,需要更新输入信号缓冲数组,以便继续计算下一个采样点的输出。
5. 返回输出信号:当处理完所有输入信号的采样点之后,将输出信号返回给调用者。
需要注意的是,在实际的应用中,FIR带通滤波器的系数和输入信号的采样点可能会很大,因此需要优化算法的性能和效率,例如可以使用快速傅里叶变换(FFT)等技术来加速计算过程。
总的来说,用C语言实现FIR带通滤波器,需要定义滤波器系数、输入和输出缓冲数组,并通过循环结构对每个采样点进行滤波计算,最后返回输出信号。
用C语言实现一个FIR带通滤波器
```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。在实际应用中,可以根据需要调整截止频率和阶数。