今天开始,本专栏将开通一个关于滤波的新专题。

数字滤波器中最基础的莫过于FIR和IIR这两个类型,而且这两类方法也有着系统的理论基础。相关课程中虽然对其有着非常详尽且专业的讲解,但是对于部分同学可能不那么容易理解。

本篇将从FIR入手,形象地讲解有限冲激响应数字滤波的理论知识,相信跟着阅读完,你一定能有所收获。

一、任务描述

如下图,我们仿真生成了两段信号。其中一条是未加入噪声的纯净信号,另外一条是加入白噪声后的含噪声信号。其中纯净信号使用了一段正弦信号。我们的目的就是将含噪声信号中的噪声部分滤除,得到一条尽量还原纯净信号的滤波结果。

图1. 纯净信号和含噪声信号

二、一种直观的解决方案

从上图容易看出,含噪声信号是在纯净信号上下波动的,所以很容易想到,如果取某几个含噪声信号的平均值,作为滤波结果,则可以抵消掉噪声在上下随机波动中的干扰效果。假如我们每3个点做一次平均,实现过程见下图(为了便于观察,使用前0.25秒数据演示):

图2. 每三个红点求平均得到一个蓝点

能够看出,经过该方法处理后的数据相对于纯净信号的波动幅值得到了一定程度的抑制,也就是可以取得一定程度的滤波效果。

这是一种最简单的FIR滤波器,也可以叫做滑动平均滤波方法。

三、另外一种理解角度——引入权重系数概念

上边讲到的滑动平均,是将3个相邻信号求取平均值,这也可以理解为这3个值分别乘以权重系数1/3再求和,那么上述滤波过程可以用下边这张动图来演示,应该是比较直观的了:

图3. 选取了前10个数据点作为演示

看到这里大家想到什么了吗。是的——是卷积

四、重温卷积的概念

这里大家可能存在两个疑问:为什么上图能联系到卷积?卷积怎样影响到滤波算法的构造?

1.先解答第一个疑惑,为什么上图能联系到卷积。

在之前的文章里比较详细地讲解了卷积的概念:Mr.看海:这篇文章能让你明白卷积,大家在读完本篇文章后如果感兴趣可以再跳转过去看,现在我们继续讲。

在那篇文章里,我引用了一个形象的例子:

比如说老板命令张三干活,张三却到楼下打台球去了,后来被老板发现,他非常气愤,扇了张三一巴掌(注意,这就是输入信号,脉冲),于是张三的脸上会渐渐地(贱贱地)鼓起来一个包,张三的脸就是一个系统,而鼓起来的包就是张三的脸对巴掌的响应,好,这样就和信号系统建立起来意义对应的联系。下面还需要一些假设来保证论证的严谨:假定张三的脸是线性时不变系统,也就是说,无论什么时候老板打张三一巴掌,打在张三脸的同一位置(这似乎要求张三的脸足够光滑,如果张三长了很多青春痘,甚至整个脸皮处处连续处处不可导,那难度太大了,我就无话可说了哈哈),张三的脸上总是会在相同的时间间隔内鼓起来一个相同高度的包来,并且假定以鼓起来的包的大小作为系统输出。好了,那么,下面可以进入核心内容——卷积了!
如果张三每天都到地下去打台球,那么老板每天都要扇张三一巴掌,不过当老板打张三一巴掌后,一天后就消肿了,所以时间长了,张三甚至就适应这种生活了……如果有一天,老板忍无可忍,以0.5秒的间隔开始不间断的扇张三的过程,这样问题就来了,第一次扇张三鼓起来的包还没消肿,第二个巴掌就来了,张三脸上的包就可能鼓起来两倍高,老板不断扇张三,脉冲不断作用在张三脸上,效果不断叠加了,这样这些效果就可以求和了,结果就是张三脸上的包的高度随时间变化的一个函数了(注意理解);如果老板再狠一点,频率越来越高,以至于都辨别不清时间间隔了,那么,求和就变成积分了。可以这样理解,在这个过程中的某一固定的时刻,张三的脸上的包的鼓起程度和什么有关呢?和之前每次打张三都有关!但是各次的贡献是不一样的,越早打的巴掌,贡献越小,所以这就是说,某一时刻的输出是之前很多次输入乘以各自的衰减系数之后的叠加而形成某一点的输出,然后再把不同时刻的输出点放在一起,形成一个函数,这就是卷积,卷积之后的函数就是张三脸上的包的大小随时间变化的函数。本来张三的包几分钟就可以消肿,可是如果连续打,几个小时也消不了肿了,这难道不是一种平滑过程么?反映到剑桥大学的公式上,f(a)就是第a个巴掌,g(x-a)就是第a个巴掌在x时刻的作用程度,乘起来再叠加就ok了,大家说是不是这个道理呢?我想这个例子已经非常形象了,你对卷积有了更加具体深刻的了解了吗?
转自GSDzone论坛
来源:人人网

看一下下图,红线的方波代表“打了一巴掌”,蓝线是肿起来的鼓包的高度。假设鼓包一天的时间(24小时)可以完全回复,也就是高度会变为0。

图4. 上图为冲激信号,下图为响应信号

需要注意,“鼓包的高度”不是随着时间的推移无限趋近于0,而是在1天后就变成了0,也就是对于巴掌这个“冲激”的响应是“有限的”,这就是有限冲激响应。在这里我们假设“鼓包的高度”随时间的推移用g(t)表示,很明显g(0)=1,而g(1)=0。

如果进一步增加扇巴掌的频次,如果时间间隔小于24小时,那么第二次的鼓包就会叠加上上一次没有消除的鼓包高度,对应鼓包高度会像下图这样:

图5. 可见鼓包的趋势越来越高,这就是叠加效应的影响

假如我们只求整时刻(即0.1的整数倍)的鼓包情况,为了更便于理解,干脆将“鼓包的高度”这个冲激响应也离散化,这并不影响我们对于整时刻的求解:

图6. 冲激响应离散化前

图7. 冲激响应离散化后

对于每一个时刻,其鼓包高度的计算是前几次为消除鼓包高度的叠加,对于0.3天这个时刻,此时鼓包的高度就是:

0.3天这一刻刚刚打了一巴掌,刚刚出炉的鼓包高度很明显是1,用公式表示就是g(0)
0.2天这一刻打的巴掌,距离0.3天已经过去0.1天,鼓包高度还残余g(0.1)
0.1天这一刻打的巴掌,距离0.3天已经过去0.2天,鼓包高度还残余g(0.2)
0天这一刻打的巴掌,距离0.3天已经过去0.3天,鼓包高度还残余g(0.3)
所以第0.3天这一刻的鼓包高度就是 g(0)+g(0.1)+g(0.2)+g(0.3)

现在再贴近现实一些,老板也很难控制每次巴掌力度的一致,如果他用了两倍的力气,那鼓包的高度很容易理解就是2了(因为是线性时不变系统),这里我们引入一个变量f(t),表示t时刻老板的力度。那么对于0.3天这个时刻,此时鼓包的高度就变成:

0.3天这一刻刚刚打了一巴掌,此时力气值是f(0.3),用鼓包高度就是f(0.3)g(0)
0.2天这一刻打的巴掌,此时力气值是f(0.2),距离0.3天已经过去0.1天,鼓包高度还残余f(0.2)g(0.1)
0.1天这一刻打的巴掌,此时力气值是f(0.1),距离0.3天已经过去0.2天,鼓包高度还残余f(0.1)g(0.2)
0天这一刻打的巴掌,此时力气值是f(0),距离0.3天已经过去0.3天,鼓包高度还残余f(0)g(0.3)
所以第0.3天这一刻的鼓包高度就是 f(0.3)g(0)+f(0.2)g(0.1)+f(0.1)g(0.2)+f(0)g(0.3)

如果老板2天之内使用了如下的“连环掌”:

图8. 此时力度不在恒定为1,而是函数f(t)

那张三脸上的鼓包将会是怎样呢。

请开始表演:

图9. 每个紫色数据点更新时,都是将所有红色、蓝色点相乘再求和

看完上图有没有觉得有点眼熟,是的!和图3简直一毛一样!

所以综上可以得到一个直观的结论:当一组数像滑窗一样滑过另外一组数时,将对应的数据相乘并求和得到一组新的数,这个过程必然和卷积有着莫大的关系。

在后边可能会讲到的卷积神经网络中,只是将一维数据扩展到了二维平面,但这种滑窗求和的基本思想是一脉相承的,乃至于该卷积思想可以推广到多维空间当中。就像下图:

图10. 来源:https://mlnotebook.github.io/post/CNN1/

不过这里我们不做过多扩展了。

我们只需要知道:FIR滤波就是在时域上卷积的过程。

2.再解答第二个疑惑,上述卷积怎样影响到滤波算法的构造。

卷积有一个重要性质:时域的卷积等于频域相乘。

这个性质可以说和滤波是息息相关的,因为滤波的目的就是想要得到某特定的频率段。

而频域相乘恰恰能够实现这个筛选的目的。

回到文章最开始的例子,想要对含噪声信号滤波,那我们不妨先看看他的频谱:

图11. 含噪声信号及其对应频谱

可以看到我们想要保留的频率段范围基本在3Hz以下,高于3Hz的都可以抛弃,很自然地,我们可以想到一个办法,即构造如下一组频域信号:

图12. 构造的低通滤波器

此时将图11中的频谱和图12相乘,高于3Hz的数值就全部变为了0,此时频谱就成了:

图13. 高于3Hz的分量全部被滤除

再将此频域数值进行傅里叶逆变换,得到时域数值:

图14. 傅里叶逆变换后结果

可以看到我们近乎完美的实现了滤波。一句话表述上述滤波过程:设计一个频域滤波器(将想要保留的频率段赋值为1,其他频率段赋值为0),将其与含噪声信号的频谱在频域上相乘,再将乘积做傅里叶逆变换,即可实现滤波,这种滤波器叫频域滤波器。

虽然得到了较好的滤波结果,但是事情到这里还没完,不要忘记这篇文章是讲FIR滤波器的~

注意看上边那段话中的加黑字体:在频域上相乘。回想起来了吗?

时域的卷积等于频域相乘!

所以,上述在频域空间的一大堆操作,可以简单地转化成在频域上的卷积操作,具体来说,就是将含噪声信号与低通滤波器的傅里叶逆变换值进行卷积,这个过程就是FIR滤波。

我用一张图表示他们之间的关系:

图15. FIR滤波器实现逻辑

到这里你应该已经理解了,FIR滤波器的本质是设计一组系数,这组系数实际就是滤波器的IFFT(冲激响应,还记得张三的鼓包吗)离散化以后的结果。

至此,FIR到底是怎样一个概念应该明白了吧。FIR相关的基础理论介绍完了,专栏后续还会讲到FIR的用法以及在MATLAB的实现方法,感兴趣的话请关注专栏吧!

end.关于滤波专题

目前计划要讲到的包括:

-1.FIR有限冲激响应、IIR无限冲激响应数字滤波算法的理论讲解、滤波器设计方法和MATLAB代码实现
-2.滤波器滤波效果的评价指标
-3.“类EMD”方法(即包括EMD、EEMD、CEEM、VMD等一系列方法)的滤波算法讲解与实现
-4.“类EMD”方法与ICA结合的滤波算法讲解与实现
-5.小波阈值滤波方法讲解与实现
-6.卡尔曼滤波方法讲解与实现
...(其他方法随时补充)

【滤波专题-第1篇】数字滤波器快速入门——FIR有限冲激响应滤波讲解相关推荐

  1. 【滤波专题-第3篇】IIR无限冲激响应和FIR有限冲激响应数字滤波器有什么区别?

    该文章在之前编写并发布过,现在重新编辑一下并纳入到滤波专题中. 之前已经讲过FIR和IIR的概念: Mr.看海:[滤波专题-第1篇]数字滤波器15分钟入门!--这可能是最简单的FIR有限冲激响应滤波讲 ...

  2. Redis学习笔记①基础篇_Redis快速入门

    若文章内容或图片失效,请留言反馈.部分素材来自网络,若不小心影响到您的利益,请联系博主删除. 资料链接:https://pan.baidu.com/s/1189u6u4icQYHg_9_7ovWmA( ...

  3. 【滤波专题-第6篇】小波阈值去噪方法看这一篇就明白了~(附MATLAB实现)

    小波阈值去噪的算法是近些年比较流行的一种滤波方法,由于其阈值函数有着众多的改进方式和改进空间,改进阈值函数也往往可以作为创新点和亮点写到论文中,所以对于正在搞相关研究的同学们写论文是比较友好的(轻松水 ...

  4. (Java每日一谈:第四日——幸福的四象限)主流框架:Dubbo基础实战篇--Dubbo快速入门

    在昨天的Dubbo基础篇中,小编对Dubbo的相关基础理论知识进行了一个详细的解释,如果大家对这一块的知识感到好奇,推荐大家可以去阅读一下小编昨天写的Dubbo相关知识点,今天小编会进行Dubbo实用 ...

  5. IIR无限冲激响应和FIR有限冲激响应数字滤波器有什么区别?

    从名字上看,"无限冲激响应"和"有限冲激响应"的区别一定在"冲激响应"上.在之前的文章里我们讲到了冲激响应的概念,文章里用被打了一巴掌(单位 ...

  6. Yocto系列讲解[入门篇] 1 - 快速入门熟悉Yocto的构建

    By: fulinux E-mail: fulinux@sina.com Blog: https://blog.csdn.net/fulinus 喜欢的盆友欢迎点赞和订阅! 你的喜欢就是我写作的动力! ...

  7. springboot基础篇(快速入门 + 完整项目案例)

    目录 1.springboot简介 2.REST风格 1.简介 2.RESTful 3.复制工程 4.属性配置 1.application.properties 2.application.yml.. ...

  8. Java-Spring-使用篇之快速入门

    1.概述 spring-5.0.1 官方文档 2.XML 与 XSD 2.1 XML <?xml version="1.0" encoding="UTF-8&quo ...

  9. Spring框架快速入门(Spring超全面讲解)

    Spring是一个开放源代码的设计层面框架,他解决的是业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿整个系统应用. 本课程将深入浅出讲解Spring的核心技术IoC.AOP,剖析框架 ...

  10. Redis快速入门学习(基于狂神讲解)

    一.NoSQL简介 1.1.为什么要使用NoSQL? 1.单机Mysql时代 90年代,一个网站的访问量一般不会太大,单个数据库完全够用.随着用户增多,网站出现以下问题 数据量增加到一定程度,单机数据 ...

最新文章

  1. Spring Cloud Alibaba到底坑不坑?反正是解放了部分使用的繁琐!
  2. C语言编译报错:incompatible pointer type [-Wincompatible-pointer-types](传参类型不匹配)
  3. luogu P1007 独木桥
  4. c++中基类与派生类中隐含的this指针的分析
  5. easyPOI基本用法详解
  6. ARMV8 datasheet学习笔记5:异常模型
  7. 使用TikZ绘制Ferrers图
  8. 图像处理_Opencv中Mat矩阵中data、size、depth、elemSize、step等属性的理解
  9. MySQL的select语法
  10. visual assist x vs2019番茄助手
  11. 震旦adc225打印机连接计算机,震旦ADC225打印机驱动
  12. 哈工大计算机科学与技术邬向前,人工智能学院组队赴哈工大交流学习
  13. 2021-02-13L:1652 2.08---2.141576L
  14. 土地资源管理就业怎么这么难_我所理解的土地资源管理专业
  15. 【语言模型系列】实践篇:ALBERT在房产领域的实践
  16. c语言买100只鸡,C语言经典问题--百钱买百鸡问题
  17. ChatGPT介绍以及一些使用案例
  18. iMindMap12免费下载安装激活教程及如何免费用思维导图学习
  19. net-java-php-python-人事工资管理系统计算机毕业设计程序
  20. C语言strcat库函数讲解

热门文章

  1. python拦截游戏封包_【求助】关于pygame封包问题
  2. Google OpenThread 技术研讨会
  3. c 抓取百度页面html,搜索引擎百度蜘蛛详解,百度蜘蛛IP分析
  4. 比风水厉害100倍的宇宙规律,你懂多少?
  5. 30 | 安全运营:“黑灰产”打了又来,如何正确处置?
  6. 很强大的上网行为管理终端软件-云子可信-一键禁止访问视频网站
  7. 【C语言基础学习笔记】一、初始C语言(2)
  8. 简单一招能让你的浏览器下载速度提升几十倍,从此弃用IDM等下载器
  9. 关于可见光摄像机与机器视觉的科普
  10. 基于NanoPi3(三星S5P6818)的kernel移植(二)