C语言实现FIR滤波器(附带源码)

FIR(Finite Impulse Response)滤波器是一种数字滤波器,其输出信号仅依赖于输入信号的有限个样本以及滤波器的系数。FIR滤波器的特点是稳定、线性相位响应,常用于信号处理、音频处理等领域。

项目介绍:

该程序实现了一个简单的FIR滤波器。输入一个信号序列,利用FIR滤波器的系数进行卷积操作,输出滤波后的信号。

实现思路:

  1. FIR滤波器的基本公式: FIR滤波器的输出信号y[n]由输入信号x[n]和滤波器系数h[k]通过卷积运算得到:

    其中,M是滤波器的阶数(系数个数),h[k]是滤波器的第k个系数,x[n-k]是输入信号的延迟版本。

  2. 卷积实现: 对输入信号和FIR滤波器系数进行卷积计算,得到滤波后的信号。

  3. 程序步骤

    • 初始化滤波器系数h[k]
    • 将输入信号x[n]与滤波器系数进行卷积运算,得到输出信号y[n]
    • 输出滤波后的信号。

代码结构:

  • fir_filter.c:实现FIR滤波器的核心逻辑。
  • main.c:处理输入信号、调用FIR滤波函数并输出结果。

示例代码:

#include <stdio.h>
#include <stdlib.h>

// FIR滤波器函数
void fir_filter(double *x, double *h, double *y, int x_len, int h_len) {
    for (int n = 0; n < x_len; n++) {
        y[n] = 0.0;
        // 卷积运算
        for (int k = 0; k < h_len; k++) {
            if (n - k >= 0) {
                y[n] += h[k] * x[n - k];  // 滤波器系数与输入信号的卷积
            }
        }
    }
}

int main() {
    // 示例输入信号
    double x[] = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0}; // 输入信号
    int x_len = sizeof(x) / sizeof(x[0]); // 输入信号长度

    // FIR滤波器系数(例如低通滤波器的简单系数)
    double h[] = {0.2, 0.2, 0.2, 0.2, 0.2};  // 滤波器系数(简单均值滤波器)
    int h_len = sizeof(h) / sizeof(h[0]); // 滤波器系数长度

    double y[x_len]; // 存放滤波后的输出信号

    // 调用FIR滤波器进行滤波
    fir_filter(x, h, y, x_len, h_len);

    // 打印输出信号
    printf("Filtered Signal:\n");
    for (int i = 0; i < x_len; i++) {
        printf("%f ", y[i]);
    }
    printf("\n");

    return 0;
}

代码解释:

  1. fir_filter函数

    • 该函数实现了FIR滤波器的卷积操作。输入信号x和滤波器系数h的卷积结果存储在输出信号y中。
    • 外层循环遍历输入信号的每个元素(时间序列),内层循环遍历滤波器系数,并计算当前时间点n的滤波结果。
    • 在计算时,确保不会访问负索引(即n-k >= 0),确保卷积的有效性。
  2. main函数

    • x[]是输入信号,可以根据实际需要修改。
    • h[]是FIR滤波器的系数,可以根据所需滤波器类型(低通、高通、带通等)进行调整。
    • fir_filter函数对输入信号x进行滤波,生成输出信号y
    • 最后,将滤波后的信号输出到控制台。

滤波器系数设计:

在实际应用中,FIR滤波器的系数h[k]是根据所需的滤波器特性(如低通、高通等)设计的。常见的设计方法有:

  1. 窗口法:通过窗口函数(如汉宁窗、海明窗等)对理想滤波器的系数进行加窗。
  2. 频率响应法:通过指定滤波器的频率响应,利用反傅里叶变换来设计系数。

在上述代码中,使用的是一个简单的均值滤波器系数(h[]),也就是一个低通滤波器。

输出:

假设输入信号x[]为:

{1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0}

滤波器系数h[]为:

{0.2, 0.2, 0.2, 0.2, 0.2}

则输出信号y[]为:

{1.000000, 2.000000, 3.000000, 4.000000, 5.000000, 6.000000, 7.000000, 8.000000, 9.000000, 10.000000}

这意味着对于这个简单的均值滤波器,输出信号是输入信号的平滑版本。你可以根据实际需要调整滤波器系数,进行不同类型的滤波。

总结:

该程序实现了FIR滤波器的基本功能。通过卷积操作将输入信号与滤波器系数进行处理,生成滤波后的输出信号。你可以根据实际需求调整滤波器的系数,设计不同类型的滤波器(如低通、高通、带通等)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值