1---FIR滤波器简介

来源:互联网 发布:网络测试仪杉木林 编辑:程序博客网 时间:2024/05/16 04:55

1. FIR滤波器特性

Markdown中数学公式整理
FIR(Finite Impulse Response)Filter:有限冲激响应滤波器,又称为非递归线性滤波器,与IIR对应。

FIR滤波器,顾名思义,其脉冲响应由有限个采样值构成。长度(抽头数)为N、阶数为N1的FIR系统的转移函数、差分方程和单位冲激响应分别如下列三式所示。

H(z)=n=0N1h(n)zn

y(n)=k=0N1$h(k)x(nk)

h(n)=h(0)δ(n)+h(1)δ(n1)+...h(N1)δ[n(N1)]

IIR(Infinite Impulse Response)Filter:无限冲激响应滤波器,又称为递归线性滤波器。
FIR与IIR相对的
优点:

  • 可以具备线性相位特性
  • 易于设计

缺点:

  • 同样指标的滤波器,FIR需要更多的参数,即实现时消耗更多的计算单元,产生更大的延迟。

详细可参考:IIR滤波器和FIR滤波器的区别与联系
线性相位的概念:
如果滤波器的N个实值系数为对称或者反对称结构,该滤波器具有线性相位。

W(n)=±W(N1n)

特性:通过线性相位滤波器的信号的所有频率部分具有相同的延迟量。

2. FIR滤波器是怎么滤波的

信号通过一个FIR滤波器其实就是信号与FIR滤波器的系数进行卷积(即乘累加)的过程。
简单信号模型
低频信号:即在时域上变化慢的信号,如1 1 1 1 2 2 2 2,还有直流信号1 1 1 1 1 1 1
高频信号:即在时域上变化快的信号,如1 2 1 2 1 2 1 2
简单的滤波器模型
低通滤波器:1 1
高通滤波器:1 -1

想象一下上面的信号与下面的信号做卷积的过程。

3. FIR滤波器的设计

可以通过下面两句话理解FIR滤波器的设计

  • FIR滤波器的设计比较简单,就是要设计一个数字滤波器去逼近一个理想的低通滤波器。通常这个理想的低通滤波器在频域上是一个矩形窗。
  • 在数字信号处理中,傅里叶变换用来求取时域信号的频率成分。因此,通过对特定频率幅度和相位的响应,求取傅里叶变换的逆变换(IDFT),就可以求出满足要求的数字滤波器。

逼近一个理想的滤波器 —-> 获得的序列是无限长的 —-> 需要截断 —-> 加窗

使用窗函数设计FIR滤波器

设计FIR滤波器需要提供的参数:
1)滤波器的类型:低通、高通、带通、带阻
2)滤波器的采样频率
3)滤波器的系数个数
4)阻带衰减(dB)
5)通带纹波(dB)
6)过渡带带宽(Hz)

4. FIR滤波器的实现

作者高亚军《基于FPGA的数字信号处理》中将FIR滤波器的实现讲的非常详细
FIR滤波器的实现很简单,根据其结构,其实就是延迟乘累加。
实现FIR滤波器这么简单,为什么各种数字信号处理教材堆砌那么多公式、引入那么多复杂概念,让人望而却步?

但在实现时可以对延迟乘累加结构进行变形,以获得不同的资源消耗效果。

  • 转置结构


    标准的FIR结构是先延迟,再乘累加,而转置的结构是先乘,在延迟累加。转置结构相当于改变了延时单元的位置,这就是所谓的重定时(Retiming)技术。
    转置结构的好处是:每两个加法器之间都插入了之前的延时器,缩短了关键路径,电路可以跑到更高的速度。

  • MAC实现(串行结构FIR)

    Multiply Accumulation Cell,乘累加模块
    设计思想:只用一个乘法器和一个累加器按时间顺序依次完成一次滤波运算所需的N次乘法和N-1次加法。
    关于累加器位宽的考虑,怎样保证累加运算不溢出,一般我们从乘法和加法的角度来考虑,但为了节省硬件资源,还可以从另一个角度来考虑:
    滤波运算输出的最大值为

    |y|max=2B1n=0N1|h(n)|

    所以加法器位宽只要满足|y|max的需求即可
    基于FPGA MAC FIR滤波器的实现
    优劣势:
    串行结构占用极少的资源(只用了一个乘加器),这是它的优势,而其吞吐量不会太高,这是它的不足。它正是“以速度换资源”思想的体现,在某些场合灵活使用会体现其应有的价值。如在滤波器的采样率较低时,可以采用这样结构,使用高频时钟处理,在不增加处理延时的情况下节省硬件资源。

  • DA实现

    分布式算数(Distribute Arithmetic, DA)是实现滤波器的一种方法,其基本思想是将数字滤波器内的乘法和加法运算用查找表和一个移位累加器来实现。
    DA的结构挺复杂的,但简单来讲可以说是利用了乘法运算可以使用移位相加来实现这么一个特性。

    42=8

    0b100log22=0b1000

    使用DSP资源实现乘法运算可以达到更高的运行速度,如果不是DSP不够用,现代滤波器实现应该不会再使用古老的DA实现了吧??