FIR 带通滤波器的C语言实现
时间: 2023-08-20 21:33:10 浏览: 121
FIR带通滤波器是一种数字滤波器,它可以通过消除低频和高频信号来提取中间频率信号,常用于音频处理、图像处理等领域。下面是一个简单的C语言代码示例,演示如何实现FIR带通滤波器:
```c
#include <stdio.h>
#include <math.h>
#define N_COEFFS 51
#define SAMPLING_RATE 8000
#define FREQ_LOW 500
#define FREQ_HIGH 1500
const float coeffs[N_COEFFS] = {0.000051, 0.000047, 0.000036, 0.000019, -0.000004, -0.000030, -0.000055, -0.000073, -0.000077, -0.000062, -0.000024, 0.000030, 0.000093, 0.000151, 0.000184, 0.000174, 0.000105, -0.000032, -0.000226, -0.000446, -0.000643, -0.000761, -0.000748, -0.000558, -0.000171, 0.000412, 0.001125, 0.001833, 0.002399, 0.002648, 0.002433, 0.001634, 0.000207, -0.002097, -0.004874, -0.007447, -0.009191, -0.009490, -0.007967, -0.004484, 0.000828, 0.006219, 0.011637, 0.016053, 0.018491, 0.018172, 0.014658, 0.007966, -0.003303, -0.017031, -0.030680, -0.041114};
float input_samples[] = {0.1, 0.3, 0.5, 0.7, 0.9};
float output_samples[5-N_COEFFS+1];
int main() {
int i, j;
for (i = N_COEFFS - 1; i < 5; i++) {
float output = 0;
for (j = 0; j < N_COEFFS; j++) {
output += input_samples[i - j] * coeffs[j];
}
output_samples[i - N_COEFFS + 1] = output;
}
for (i = 0; i < 5-N_COEFFS+1; i++) {
printf("%f ", output_samples[i]);
}
return 0;
}
```
在这个示例中,我们定义了一个长度为51的FIR带通滤波器,采样率为8000Hz,通带频率为500-1500Hz。我们还定义了一个长度为5的输入信号数组input_samples和一个长度为1的输出信号数组output_samples。
在主函数中,我们通过两个嵌套的循环来计算每个输出信号样本。外层循环从第N_COEFFS个输入信号样本开始,内层循环计算该输入信号样本和它之前的N_COEFFS-1个输入信号样本与系数的乘积之和,得到输出信号样本。然后将输出信号样本存储到输出信号数组中。最后,我们打印输出信号数组中的所有元素。
需要注意的是,这个示例中定义的FIR滤波器系数是经过离线计算得到的。在实际应用中,我们需要根据需要设计并计算出FIR滤波器的系数。可以使用MATLAB等软件进行计算。
阅读全文