【FIR窗函数滤波器】C语言实现并与Matlab window+fir1对比

文章详细介绍了C语言实现的低通、高通、带通、带阻滤波器的理想单位冲击响应函数,以及各种窗函数(如矩形、三角、汉宁、汉明、布莱克曼等)的实现,以及Matlab代码示例,展示了如何使用这些函数设计FIR滤波器。

参考文档

主要参考资料来源数字信号处理 基于计算机的方法 4版(中文版)和Matlab窗函数【Matlab帮助中心】加窗法两部分

分类

滤波器类型分类

  • 低通
  • 高通
  • 带通
  • 带阻
    不同滤波器类型对应不同理想单位冲击函数hd(n)

窗函数分类

C语言实现

理想单位冲击响应函数

根据数字信号处理 基于计算机的方法 4版(中文版)中关于理想单位冲击响应函数介绍(如下图)实现。
理想单位冲击响应函数

  • 低通
// wc为截至频率,N为窗口长度
double *IdealLp(double wc, int N) //低通
{
   
   
    double M = (N - 1) / 2.0;
    double *hd = (double *)malloc(N * sizeof(double));
    for (int n = 0; n < N; n++)
    {
   
   
        if (n == M)
        {
   
   
            hd[n] = wc / PI;
        }
        else
        {
   
   
            hd[n] = sin(wc * (n - M)) / (PI * (n - M));
        }
    }

    return hd;
}
  • 高通
// wc为截至频率,N为窗口长度
double *IdealHp(double wc, int N) //高通
{
   
   
    double M = (N - 1) / 2.0;
    double *hd = (double *)malloc(N * sizeof(double));
    for (int n = 0; n < N; n++)
    {
   
   
        if (n == M)
        {
   
   
            hd[n] = 1.0 - wc / PI;
        }
        else
        {
   
   
            hd[n] = -sin(wc * (n - M)) / (PI * (n - M));
        }
    }

    return hd;
}
  • 带通
// wcl为低频截至频率,wch为高频截至频率,N为窗口长度
double *IdealBp(double wcl, double wch, int N) // 带通
{
   
   
    double M = (N - 1) / 2.0;
    double *hd = (double *)malloc(N * sizeof(double));

    hd = IdealLp(wcl, N);
    hd = subtract(IdealLp(wch, N), hd, N);

    return hd;
}

带通理想单位冲击响应函数可由低频和高频截至频率的低通理想单位冲击响应函数相减得到。

其中subtract为封装的double数组运算库中的减法函数,IdealLp为低通理想单位冲击响应函数。

  • 带阻
// wcl为低频截至频率,wch为高频截至频率,N为窗口长度
double *IdealBs(double wcl, double wch, int N) // 带阻
{
   
   
    double M = (N - 1) / 2.0;
    double *hd = (double *)malloc(N * sizeof(double));
    for (int n = 0; n < N; n++)
    {
   
   
        if (n == M)
        {
   
   
            hd[n] = 1.0 - (wch - wcl) / PI;
        }
        else
        {
   
   
            hd[n] = (sin(wcl * (n - M)) - sin(wch * (n - M))) / (PI * (n - M));
        }
    }

    return hd;
}

至此,低通、高通、带通和带阻的理想单位冲击响应函数已全部实现。

窗函数

矩形窗
//全为1的数组
double *RectangleWindow(int n)
{
   
   
    double *result = (double *)malloc(n * sizeof(double));

    for (size_t i = 0; i < n; i++)
    {
   
   
        result[i] = 1.0;
    }

    return result;
}
</
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值