文章目录
- 前言
- 一、传递函数
-
- 1.什么是传递函数
- 2.FIR与IIR在传递函数上的区别(FIR)
- 3.FIR与IIR在传递函数上的区别(IIR)
- 4.FIR的抽头系数/FIR的阶数
- 5.FIR滤波器的线性相位
- 二、CIC滤波器与滑动平均滤波器
-
- 1.CIC滤波器
- 2.滑动平均滤波器(=CIC单级滤波器)
- 3.多级CIC在FPGA中累加器溢出的问题
前言
本人常常使用matlab做数据处理,往往是会使用滑动平均滤波器,但是鉴于本人是做FPGA的,发现这个滑动平均滤波器和CIC滤波器极度相似,且自己在使用过程中对滑动平均滤波器的频响比较模糊,所以在参考了书本以及大量csdn、知乎的博主后,写一篇相关博客,来解释滑动平均滤波器与CIC滤波器的关系以及FIR滤波器的一些内容,如果想探究详细的数学推导还是看书最靠谱,本文尽可能使用简单的公式与结论。
一、传递函数
滑动平均滤波器与CIC滤波器都是FIR滤波器,也就是所谓的有限冲击响应滤波器,这里先简单介绍一下滤波器的相关概念。
1.什么是传递函数
matlab中的filter函数的标准使用方法就是y=filter(b,a,x),其中b和a共同构成了传递函数(也成为系统函数),x代表进入滤波器的数据,y代表滤波器输出的数据,例如下图中H(z)就是一个传递函数
传递函数往往用拉氏变换(复频域)或者z变换(圆频域)来表示,都是频域的一种表达形式,这个传递函数表示的就是系统的输出/输入的频响曲线。滤波器也属于一种系统,自然也有自己的传递函数来表征它的频响特点。
这个传递函数怎么来的呢,对于常见的线性时不变离散系统来讲(对于matlab处理信号的大部分情况默认是这个就可以了),其表现形式一般是下图
其中,y(n)是输出,x(n)是输入,y(n-k)是y(n)延迟k个时刻,x(n-r)是x(n)延迟r个时刻,带有角标的a和b就是系数,将上图两边进行z变换,就可以得到下图,
Y(z)就是输出的z变换,X(z)就是输入的z变换,将Y(z)/X(z),这就是传递函数H(z),表征了这个系统的输出/输入的z变换形式,也就是频响特征,再通过数学推导,并联立下图(时域的卷积)
最终可以得到下图
h(n)就是系统的冲击响应,也就是H(z)的逆z变换,在时域上表征系统的输出/输入。从上图可以看出H(z)就是一个z的有理分数式,这也就是传递函数的由来。
2.FIR与IIR在传递函数上的区别(FIR)
FIR,中文名是有限冲击响滤波器,其实就是滤波器传递函数的逆z变换,也就是上图中的h(n),是有限的,那么FIR的传递函数就是如下所示,
可以看到,求和上的∞变成了M,也就是这个FIR系统的冲激响应h(n)最多只有M个非零值,是有限的,其余必定是0,所以这就是有限冲击响应滤波器的由来。再回过头来看matlab中filter函数的定义,
所以在使用matlab的filter designer工具时,生成了一个一位数组,也就是b,根据FIR的传递函数的性质,a则可以直接为1。
3.FIR与IIR在传递函数上的区别(IIR)
IIR,中文名是无限冲击响滤波器,就是滤波器传递函数的逆z变换,也就是h(n),是无限的,IIR的传递函数如下图所示。
4.FIR的抽头系数/FIR的阶数
FIR的滤波器在频域上的体现就是传递函数,在时域上的体现是h(n)卷积x(n),h(n)毕竟是有限的,所以FIR的表现形式如下图所示,在a1与a(M)都不为0的情况下,滤波器的阶数就是M+1,抽头系数就是a,总计M+1个。
5.FIR滤波器的线性相位
FIR滤波器可以最突出的特点就是可以做到线性相位,而IIR的相位特性是非线性的,当FIR的有限冲击响应h(n),即抽头系数,满足偶对称或者奇对称,即h(n)=h(N-1-n)或h(n)=-h(N-1-n)时,FIR的相位特性是线性的,matlab中的众多FIR抽头系数设计函数或工具,都可以自动保持线性相位,例如工具filter designer,
得到的抽头系数,plot出来就是
可以看到就是偶对称的,自然可以做到线性相位。
关于FIR与IIR的优缺点,如果能够理解上述内容,随便百度一下,就能够看懂,如果不能理解原理,那知道优缺点的内容也没什么实质意义。
二、CIC滤波器与滑动平均滤波器
如果上面的东西已经理解了,那么现在就可以去研究一下CIC滤波器和滑动平均滤波器了。
第一章的内容多是参考书本,但第二章的内容很多就是参考众多带佬所提炼出来的了,出于传播知识的同时也要尊重知识的想法,会把链接放出来,希望想深究的可以自己亲自研究一下。
1.CIC滤波器
知乎关于CICl滤波器的解析
单级CIC的幅频响应推导
多级CIC的使用
CIC滤波器的硬件结构为积分器与梳妆FIR滤波器,共同构成了CIC滤波器,它的传递函数如下图所示,
把上图中的分子因式分解就可以约掉分母,得到
这也就满足了FIR滤波器的传递函数表达式。
设D=10,
在matlab画出这个CIC的幅频响应,为
可以看到它是一个低通滤波器,在2*pi/D,也就是Fs/D(Fs:采样率)的整数倍(最大只能到pi/D,也就是Fs/2D)上的抑制效果很明显,但是阻带衰减能力不足,只有13db左右。应当注意一点的是以上所讲的只是最简单的单级CIC,如果看了上面这些博客,会发现CIC很大的用处是级联使用,应用于抽取和内插,配合Noble等式,在硬件上,例如FPGA中,以非常低的资源消耗实现想要的滤波效果。
2.滑动平均滤波器(=CIC单级滤波器)
从上一节的传递函数约掉分母可以看出,滑动平均滤波器是CIC滤波器的一种,也就是单级CIC。滑动平均滤波器可以使波形变得更平滑,其实本质上,它是一个FIR低通滤波器。假设它的窗宽是DM,那么下图所示就是根据它的传递函数得出傅里叶变换表达式(圆频率下)
当w趋近于0时,这个滤波器有着最大的幅度增益,也就是窗宽DM,增益就是20log(DM)db,可以看到上图窗宽为10时,原点是20db,这就是为什么在滑动滤波器的实际使用中,抽头系数要用1/DM来表示,那么频率为0时,增益最大就是0db。
那如何根据实际需要设计滑动平均滤波器呢?其实就是设计低通滤波器的截止频率,至于你的截止频率设置在多少肯定要根据你自己的信号处理要求了。
下面对涉及采样定律的滑动平均滤波器的幅频响应进行推导,没有找到相似的内容,这里直接进行手写:
上图中,Fs代表采样率,f代表频率,D为窗宽,如果已知-3db时的截止频率,想计算窗宽,只需对sinc函数的值域了解一下,知道sinc函数在0.707左右时,x的值约等于0.443,然后根据x=f*D/Fs反推f的值就可以了,这里给一个一般性结论,即
3.多级CIC在FPGA中累加器溢出的问题
可以看到,CIC滤波器如果单级使用,在FPGA也可以不用累加器和梳妆FIR,就当成滑动平均来用,但如果级联CIC的情况下,必然要使用累加器和梳妆FIR,累加器就是无限加法,梳妆FIR就是减法,但是累加器有一个问题就是会因为不停加法而溢出,在数字信号处理的书中与上面的一篇知乎文章中都有提及,就是如果累加器位宽满足一定要求,并且采用补码进行运算的话,则不会有这个问题。
需要声明一点,关于这个内容的推导我并没有进行,也没有深究,只是疑惑累加器溢出的问题而找到了一些答案。