文章目录

  • 前言
  • 一、传递函数
    • 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就是减法,但是累加器有一个问题就是会因为不停加法而溢出,在数字信号处理的书中与上面的一篇知乎文章中都有提及,就是如果累加器位宽满足一定要求,并且采用补码进行运算的话,则不会有这个问题。
 需要声明一点,关于这个内容的推导我并没有进行,也没有深究,只是疑惑累加器溢出的问题而找到了一些答案。

滑动平均滤波器与CIC滤波器相关推荐

  1. 如何利用CIC滤波器、CIC补偿滤波器和半带滤波器设计一个高频数字抽取滤波器

    设计了采样频率为640 MHz.过采样率为64的高频数字抽取滤波器.该数字抽取滤波器由CIC(Cascaded Integrator Comb)滤波器(降16倍).CIC补偿滤波器(降2倍)和半带滤波 ...

  2. CIC滤波器的Matlab仿真与FPGA实现

    CIC滤波器 1.单级CIC滤波器: CIC滤波器的冲激响应为: h(n)=1,[0,M-1] h(n)=0,其他 可见CIC滤波器在时域上是一个矩形窗,是一个累加器(积分器). 用MATLAB仿真不 ...

  3. 【CIC滤波器】基于MATLAB/FPGA的数字CIC滤波器的设计

    FPGA代码: module down(i_clk,//输入时钟i_rst,//输入复位信号i_M, //抽取值i_data,//输入信号o_data,//输出信号r_clk);input i_clk ...

  4. 基于FPGA的CIC滤波器设计(2)——以数字上下变频为例讲解

    多级CIC滤波器理论与设计 项目简述 多级CIC滤波器 多级CIC滤波器的抽取操作 多级CIC滤波器的内插操作 多级CIC滤波器的抽取的MATLAB实现 多级CIC滤波器的抽取的MATLAB结果 多级 ...

  5. proteus仿真micropython_基于micropython的滑动平均滤波器

    滑动平均滤波也叫递推平均滤波. 把连续取得的N个采样值看成一个队列,队列的长度固定为N,每次采样到一个新数据放入队尾,并扔掉原来队首的一次数据(先进先出原则),把队列中的N个数据进行算术平均运算,获得 ...

  6. freqz()计算M点滑动平均滤波器的频率响应

    函数说明(建议参考官方文档) freqz(h,w)可以用来求指定的单位脉冲响应向量 h 在一组给定频率点 w 上的频率响应值 由这些频率响应值,可以用函数 real 和 imag 计算实部和虚部,函数 ...

  7. python 曲线平滑处理——方法总结(Savitzky-Golay 滤波器、make_interp_spline插值法和convolve滑动平均滤波)

    文章目录 1 插值法对曲线平滑处理 1.1 插值法的常见实现方法 1.2 拟合和插值的区别 1.3 代码实例 2 Savitzky-Golay 滤波器实现曲线平滑 2.1 问题描述 2.2 Savit ...

  8. matlab 滑动平均滤波,滑动平均滤波器实验报告

    滑动平均滤波器实验报告 所属分类:matlab例程 开发工具:matlab 文件大小:798KB 下载次数:19 上传日期:2018-01-27 16:12:36 上 传 者:玉玲珑 说明:  给出一 ...

  9. C语言实现滑动平均滤波器

    目录 前言 原理 代码 讨论 改进 参考文章 前言 使用电机速度做闭环控制时,发现传感器的数据受到了高频噪声的影响,于是想先对其进行滤波处理. 原理 滑动平均滤波器本质是一个低通滤波器,可以看成FIR ...

最新文章

  1. pytorch安装实录(win10+cuda8+pycharm+anaconda)
  2. c语言cin n1 n2,牛客等级之题N1 追债之旅 - N2 Rinne Loves Study(8.6场)
  3. 密码篇——对称加密—DES
  4. Git之常见的分支操作
  5. Python_ collections_defaultdict默认字典
  6. 解决LSP问题导致无法上网
  7. JavaScript 字符串属性和方法
  8. 精确打印程序的运行时间
  9. 【Python Programe】使用Python发送语音验证
  10. SCL编写的阀门块实例
  11. 查询数据表中重复数据及重复次数
  12. 人才缺口30万,市场需求每年涨20% ,这一 IT 岗位你知道嘛
  13. 不占广告位增加网站收入揭秘
  14. wps文档怎么做链接
  15. Java8新特性之空指针异常的克星Optional类
  16. 算法-数塔问题-c语言
  17. 中考使用计算机吗,中考计算机考试内容·中考信息技术要考哪些项目?
  18. aba会导致问题_浅谈 ABA 问题
  19. 解决msvcr120.dll文件丢失问题
  20. Joomla模板制作教程

热门文章

  1. delphi生成一个随机序列号
  2. visio2003无法找到加载项的解决办法
  3. 《乌合之众》60条基本观点
  4. C++ 中ASCII码转化
  5. CDH安装指南(Centos6)
  6. 红外传感器型号和参数_红外传感器参数
  7. 如何用css写回到顶部,css3 回到顶部书写
  8. AD入门学习—元件库的创建2
  9. CISSP一次通过指南(文末附福利)
  10. Xshell 5 配置跳板机 教程