简单C语言实现fir带通滤波器
时间: 2023-06-08 17:06:39 浏览: 293
好的,以下是一个简单的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语言实现
A:
以下是FIR带通滤波器的C语言实现示例代码:
```c
#define M 101 // 滤波器的长度
float h[M]; // FIR滤波器的系数数组
void fir_bandpass_filter(float in[], float out[], int len, float fs, float f1, float f2)
{
int i, j;
float sum;
float omeg1 = 2 * M_PI * f1 / fs; // 左折点频率角
float omeg2 = 2 * M_PI * f2 / fs; // 右折点频率角
// 生成FIR滤波器的系数数组h[],滤波器类型为带通滤波器
for (i = 0; i < M; i++)
{
if ((i - (M - 1)/2) == 0) // 零点处的值
{
h[i] = (omeg2 - omeg1) / M_PI;
}
else // 非零点处的值
{
h[i]= (sin(omeg2 * (i - (M - 1)/2)) - sin(omeg1 * (i - (M - 1)/2))) / (M_PI * (i - (M - 1)/2));
}
}
// 对输入信号in[]进行滤波
for (i = 0; i < len; i++)
{
sum = 0;
for (j = 0; j < M; j++)
{
if (i - j >= 0) // 判断数组下标是否越界
{
sum += h[j] * in[i - j];
}
}
out[i] = sum;
}
}
```
其中,函数参数说明如下:
- `in[]`:输入的信号数组。
- `out[]`:输出滤波后的信号数组。
- `len`:输入信号数组的长度。
- `fs`:采样频率。
- `f1`:带通滤波器的左折点频率,单位为Hz。
- `f2`:带通滤波器的右折点频率,单位为Hz。
使用该函数时,需要定义好输入、输出信号数组,调用该函数即可对输入信号进行带通滤波处理。
FIR 带通滤波器的C语言实现
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等软件进行计算。
阅读全文