• FPGA信号处理系列文章——窗函数法FIR滤波器设计


    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

    FPGA信号处理系列文章——窗函数法FIR滤波器设计


    前言

    根据具体的滤波要求,计算出FIR滤波器的系数,或者说滤波器的单位冲激响应,是FIR滤波器设计的主要内容之一。计算滤波器系数的方法多种多样,最常用的是窗函数法、频率采样法及最优化方法。我们这里主要理解一下窗函数法的实现。

    基本概念

    窗函数法的基本思想是要选取某一种合适的理想频率选择滤波器,这种滤波器的单位冲激响应为非因果、无线长;然后对理想的冲激响应加窗,可以得到一个线性相位和因果的FIR滤波器。这种方法的重点在于选择某种恰当的窗函数和一种合适的理想滤波器。
    若用在这里插入图片描述表示理想的频率选择滤波器,它在整个通带内有单位幅度的增益和线性相位特性,并且在阻带内具有零响应。理想低通滤波器的频率响应用数学公式可以表示为:
    在这里插入图片描述
    式中,wc为截止频率,a为滤波器的群延时。其对应的单位冲激响应hd (n)为
    在这里插入图片描述

    很明显,上式所示的理想低通滤波器的单位冲激响应是非因果的,并且长度无限,而且 还关于a对称。

    为了从hd (n)得到一个长度为N的线性相位FIR滤波器,必须在hd (n)两边将它截断,并且保证a=(N-1)/2。截断运算在信号处理中常称为加窗。经过截断后,无限长、非因果的理想滤波器hd (n)变为因果的FIR滤波器h(n) ,用数学公式表示为:
    在这里插入图片描述
    其中窗函数 w(n)定义为:
    在这里插入图片描述
    常用的窗函数有矩形窗(Rectangle)、汉宁窗(Hanning)、海明窗(Hamming)、布莱克曼窗(Blackman)及凯塞窗(Kaiser)等

    hd(n)加窗以后,其频率响应也不再是理想的频率选择滤波器了。根据卷积定理,加窗后的频率响应等于理想频率响应与窗函数频率响应的卷积。对于如图所示的典型的窗函数响应在这里插入图片描述,理想滤波器时域加窗后的频率响应如图所示。

    在这里插入图片描述
    仔细观察下图可以发现如下特点:
    1、 由于窗函数 w(n)的长度有限,所以它的响应有一个峰值主瓣,其宽度与窗函数长度N成反比,并有较小的多个旁瓣。
    2、理想滤波器时域加窗后,频率响应Hd (e^jw )不再是理想的,而是有明显的失真。这种失真一方面表现为通带和阻带都有起伏,另一方面表现为有一个明显的过度带。
    3、Hd (e^jw )的过度带和阻带起伏是由窗函数的主瓣引起的,其宽度由窗函数主瓣宽度所决定。主瓣越宽,过度带也越宽。
    4、Hd (e^jw )的通带和阻带起伏称为吉布斯现象。这是由窗函数的旁瓣引起的,并且通带的起伏和阻带的起伏形状相同。

    因此,在给定滤波器要求的情况下,用窗函数方法计算滤波器系数,就是要选择合适的窗函数类型和确定所选窗函数的长度N,使得滤波器在满足性能要求的条件下,具有尽可能小的过渡带和通带阻带起伏。

    常用窗函数

    常用的窗函数,如矩形窗、三角窗、汉宁窗、海明窗及布莱克曼窗,这些窗函数与滤波器系数计算有关的主要参数都小结在下表中
    在这里插入图片描述
    从上表可以看出,窗函数的过度带宽与阻带衰减成正比,也即是过度带宽越小,对应的阻带衰减也越小。而对滤波器而言,则是希望过度带宽越小的情况下阻带衰减越大。因此,用窗函数计算滤波器系数的时候,必须要在各项参数之间进行折中选择。另外,对于表中的前4种窗函数来说,其阻带衰减、旁瓣峰值等参数是固定的,而且窗函数的通带起伏和阻带衰减相等,这些都会对滤波器性能产生一些不利的影响。

    实现步骤

    用窗函数方法设计滤波器系数通常包括如下步骤:
    1、 根据给定的滤波器性能参数,确定对应理想滤波器的频率响应
    2、 通过傅里叶反变换求理想滤波器的单位冲激响应
    3、 根据通带起伏、阻带衰减等性能参数确定窗函数的类型
    4、 根据过度带宽参数确定滤波器长度
    5、 计算所选取得窗函数的值
    6、 根据式子 在这里插入图片描述,求得实际的FIR系数h(n)
    7、由h(n)计算实际滤波器的频率响应Hd (e^jw ),并与给定的性能参数相比较。若不满足要求,则要重复上面的步骤,直到满足要求为止。

    窗函数方法的优缺点

    根据前面的讨论过程,可以总结窗函数方法的优缺点如下:
    1、 窗函数方法最主要的优点在于其简单性,不仅原理简单,而且应用也简单
    2、 窗函数方法所需的运算量非常小,即便是对于最复杂的凯塞窗也是如此
    3、 窗函数方法最大的缺陷是缺乏灵活性。由于通带偏差和阻带偏差近似相等,使得窗函数很难同时满足通带起伏和阻带衰减的要求
    4、 由于窗函数频谱与理想的频率响应之间的卷积效应,使得滤波器的通带边沿频率和阻带边沿频率难以精确指定
    5、 对于大部分的窗函数,无论其长度多少,滤波器响应中的阻带衰减是固定不变的。只有凯塞窗的阻带衰减可以随滤波器的长度有所变化
    6、 用窗函数方法计算出来的滤波器,通常系数数目较多,从而导致滤波器的运算效率降低
    7、 在某些应用中,例行滤波器响应的表达式过于复杂,计算冲激响应非常困难

    算法仿真

    1、 设计一个FIR滤波器,首先需要得到其频率响应,并且希望设计的结果尽可能与其接近

    假设采样率为100KHz,要求带宽内幅频响应(-25K ~ +25K)如下图,其他频率无要求,采样步进100Hz。

    在这里插入图片描述
    dB转化为幅度:
    在这里插入图片描述

    因为采样率为100KHz,将前面一个点和最后一个点进行延拓,构造整个分辨带宽内的幅频响应

    在这里插入图片描述
    2、 根据频率响应做傅里叶反变换,得到理想冲激响应

    mycoe = ifftshift(ifft(fftshift(AmpFrq)));
    %AmpFrq为上图幅频响应图
    
    • 1
    • 2

    得到了1001个系数
    3、 根据需要的滤波器阶数进行加窗处理(两端截断)
    虽然理想滤波器应该是系数无限个,得到的1001个系数相当于加了矩形窗了,只不过由于系数多的话也就逼近于理想的了
    在这里插入图片描述

    假设我们只要21个系数,那么从中间进行截取加矩形窗后,得到的幅频响应:
    在这里插入图片描述

    如果是加hamming窗,则曲线有所平滑,但不一定是我们所期望的,因此需要多加几个窗进行对比
    在这里插入图片描述

    4、 最终得到结果,和预期进行对比

    在这里插入图片描述
    因为只有中间50k是我们关心的,因此只显示50k内的带宽的话

    在这里插入图片描述
    矩形窗和理论的波动差距还是较小的。
    其他窗的效果就不贴到这里了,总之几个常用的窗都可以试一下,然后选取最优的一个

  • 相关阅读:
    EasyExcel的简单读取操作
    一下明白@GetMapping、@PostMapping、@PutMapping、@DeleteMapping注解
    EFT脉冲群的解决路径
    Python编程入门--第九章 类
    数据库----- 数据库高级
    认识Java中的类和对象(上)
    PAT 1045 Favorite Color Stripe(DP)
    DAY39:横向渗透
    java获取时间相差多少天
    三十九、Fluent时间步长的估算与库朗数
  • 原文地址:https://blog.csdn.net/gzy0506/article/details/125354662