完全搞懂傅里叶变换和小波(1)——总纲<转载>
无论是学习信号处理,还是做图像、音视频处理方面的研究,你永远避不开的一个内容,就是傅里叶变换和小波。但是这两个东西其实并不容易弄懂,或者说其实是非常抽象和晦涩的!
完全搞懂傅里叶变换和小波,你至少需要知道哪些预备知识?主页君从今天开始就将通过一些列文章告诉你他们之间的来龙去脉!本节是全部系列文章的第一节——总纲,日后我们也将按照这个思路一点一点讲述所有的知识。需要说明的是,本文主要面向计算机专业或者电子信息专业的读者,为此我们将尽量采取一些非常非常基础的知识来帮助你理解。所以,题目里面讲的“完全搞懂”并非是从物理学或者纯数学的角度去讲的,因为傅里叶变换最初是法国科学家傅里叶在研究物理学(主要是热力学)时创造出来的一套理论,如果要从这个角度去说“彻底搞懂”,肯定得需要很多物理知识、复变实变分析,之类的像天书一样的东西。这样牵扯下去,其实很多对于学计算机或者学电子信息的人来说,其实完全没有必要。我们要做的,就是利用你已经掌握的知识来构建整个体系!
金庸在他的武侠小说《天龙八部》里塑造了一个吐蕃国师的人物形象——“鸠摩智”。鸠摩智练武急功近利,为了在短期内多炼成几门功夫,往往基础不打牢,就强行修炼上乘武学。用道家的小无相功催动少林的七十二绝技,看似威力无比,其实后患无穷。其实日常学习也是这样,如果上来就记住几个公式,然后单刀直入地去啃傅里叶变换或者小波,其实也能做出点东西来,但是由于基础都是空的,所以内化的过程几乎是断裂的,缺损的。无论是傅里叶变换还是小波,它们的最基本理论全部都是数学。只是大部分学生很难建立起它们之间的联系。我们今天就从数学开始说起。
图中虚线框里的内容,都应该是在高等数学里必学的内容,这部分有啥不懂的,去问童校长应该最合适不过了。首先,你应该知道费马定理(这个很简单,说白了其实就是函数有极值的条件),通过费马定理,你可以证明罗尔定理,然后通过罗尔定理,你又可以证明拉格朗日中值定理,通过拉格朗日中值定理,你又可以继而证明柯西中值定理。证明柯西中值定理的意义在于,它可以被用来证明泰勒公式。泰勒公式当然是一个叫做泰勒的人提出来的,但是真正证明泰勒公式的人是柯西,因为柯西知道柯西中值定理,而要证明泰勒公式就需要用到柯西中值定理。泰勒公式在我们这里有两个用途,首先它可以用来证明欧拉公式,欧拉公式在傅里叶变换里面也是必须要用到的。其次,通过泰勒公式可以得到幂级数的展开。这是一个先导,因为无论是小波展开,还是傅里叶展开,如果你理解泰勒展式或者幂级数展开式,那么对应的就很容易解释,人们设计傅里叶展式和小波展式的初衷和用意了。高数里的级数主要学两种,除了幂级数以外,另外一个就是傅里叶级数。到这里你所需要的高数知识就已经足够了。
图中黄色框图里的内容都是你在数字信号处理课程里应该学的。我们在学傅里叶变换之前,肯定要在高数里先学一个傅里叶级数,但是傅里叶级数和傅里叶变换有啥关系呢?说白了,他们的本质是一样一样的,尽管它们各自公式的表达式好像差别还很大。通过傅里叶级数公式,其实你做一些化简和变量替换(关于这部分内容,如果读者有兴趣,主页君后续可以给出详细证明过程),傅里叶级数就变成傅里叶变换了,当然是连续的。然后你根据数字信号处理里面学的采样定理,就能到处傅里叶变换了,这就是DFT!但是DFT有个问题,如果按公式计算,效率太低,实用价值不高,后来人们就发明了一个快速算法,FFT!这一路下来,如果每一步,你都非常清楚,那你就已经算是对傅里叶变换理解的很到位了。
然后说说小波,小波完全可以跟傅里叶变换对比着来理解,而且事实上,在小波出现之前,人们先创造出了一种叫短时傅里叶变换的东西,这可以被认为是二者之间的桥梁。当然,这部分内容,你不知道也没关系,你甚至可以以泰勒公式和幂级数为起点来理解小波。小波级数展开对应的是傅里叶展开,连续小波对应连续傅里叶变换,DWT对应DFT。这些都非常容易理解。同样,人们(其实主要是Mallat)也开发了一种小波的快速算法,FWT。FWT就像FFT在傅里叶变换中的地位。要理解FWT,你需要知道两个基础知识,一个叫做MRA,即多分辨率分析,学习MRA对于理解小波也非常有意义。因为MRA是构建小波的一种方法。另外一个你必须要知道的东西叫做“子带编码”或者子带分解。
要想理解子带分解,你就必须知道QMF,即正交镜像滤波器,而QMF是多采样率信号处理里面的重要内容。所以你必须有多采样率信号处理知识的基础,而多采样率信号处理的基础又是数字信号处理!另外,子带编码还有一个理论基础,或者说,子带编码为啥被证明有效,这就必须要知道率失真理论的有关结论。率失真理论又是信息论的重要组成部分。所以,最后这条线路上,你的学习脉络应该是从信息论出发的(其实主要是互信息和率失真方面的内容),然后才是信号处理,然后是多抽样率处理,然后是子带编码和QMF,这些你都懂了之后,FWT就太Easy了!当然,你直接就学FWT的算法,而不去管它到底是怎么来的,也是可以的,只是就像我之前说的,你的基础基本上都是空的,你学了也只是学个招式,内功心法几乎不会,所以再往上走可能会遇到很多困难。
任何一门学科或者知识发展到现在少说都是几十年了,让我们在短短个把月之内就学完,其实很不容易。所以看起来自己要知道的东西实在太多了,而学习的时间又是这样的有限。但是也没办法,楼宇要盖的越高,地基就势必要打得越深。
另外:补充一点,后续在具体代码实现时,我们采用的语言C++,在Visual C++下完成。
未完,待续... ....
完全搞懂傅里叶变换和小波(1)——总纲<转载>的更多相关文章
- 完全搞懂傅里叶变换和小波(2)——三个中值定理<转载>
书接上文,本文章是该系列的第二篇,按照总纲中给出的框架,本节介绍三个中值定理,包括它们的证明及几何意义.这三个中值定理是高等数学中非常基础的部分,如果读者对于高数的内容已经非常了解,大可跳过此部分.当 ...
- 一文搞懂EMAS Serverless小程序开发|电子书免费下载
>> 快来免费下载|电子书<五天玩转 EMAS Serverless> << 点击免费下载 <五天玩转 EMAS Serverless> EMAS Se ...
- MATLAB(2)——小波工具箱使用简介
作者:桂. 时间:2017-02-19 21:47:27 链接:http://www.cnblogs.com/xingshansi/articles/6417638.html 前言 本文主要介绍MA ...
- java线程间通信:一个小Demo完全搞懂
版权声明:本文出自汪磊的博客,转载请务必注明出处. Java线程系列文章只是自己知识的总结梳理,都是最基础的玩意,已经掌握熟练的可以绕过. 一.从一个小Demo说起 上篇我们聊到了Java多线程的同步 ...
- dennis gabor 从傅里叶(Fourier)变换到伽柏(Gabor)变换再到小波(Wavelet)变换(转载)
dennis gabor 题目:从傅里叶(Fourier)变换到伽柏(Gabor)变换再到小波(Wavelet)变换 本文是边学习边总结和摘抄各参考文献内容而成的,是一篇综述性入门文档,重点在于梳理傅 ...
- 链表算法题二,还原题目,用debug调试搞懂每一道题
文章简述 大家好,本篇是个人的第4篇文章. 承接第3篇文章<开启算法之路,还原题目,用debug调试搞懂每一道题>,本篇文章继续分享关于链表的算法题目. 本篇文章共有5道题目 一,反转链表 ...
- 一天搞懂深度学习-训练深度神经网络(DNN)的要点
前言 这是<一天搞懂深度学习>的第二部分 一.选择合适的损失函数 典型的损失函数有平方误差损失函数和交叉熵损失函数. 交叉熵损失函数: 选择不同的损失函数会有不同的训练效果 二.mini- ...
- 一文搞懂RAM、ROM、SDRAM、DRAM、DDR、flash等存储介质
一文搞懂RAM.ROM.SDRAM.DRAM.DDR.flash等存储介质 存储介质基本分类:ROM和RAM RAM:随机访问存储器(Random Access Memory),易失性.是与CPU直接 ...
- 真正“搞”懂http协议01—背景故事
去年读了<图解HTTP>.<图解TCP/IP>以及<图解网络硬件>但是读了之后并没有什么深刻的印象,只是有了一层模糊的脉络,刚好最近又接触了一些有关http的相关内 ...
随机推荐
- JS桌面应用
一.图片预加载 var oImg = new Image(); oImg.onload=function(){ //alert('success'); } oImg.onerror=function( ...
- Operating System Concepts with java 项目: Shell Unix 和历史特点
线程间通信,fork(),waitpid(),signal,捕捉信号,用c执行shell命令,共享内存,mmap 实验要求: 1.简单shell: 通过c实现基本的命令行shell操作,实现两个函数, ...
- MONGODB 查询
1,mongoDB 取模运算:db.person.find({index:{$mod:[5,1]}})db.person.find({index:{$not:{$mod:[5,1]}}})2,name ...
- xcode6中如何添加pch文件
在Xcode6之前,新建一个工程的时候,系统会帮我们自动新建一个以工程名为名字的pch (precompile header)文件,在开发过程中,可以将那些整个工程都广泛使用的头文件包含在该文件下,编 ...
- hdu 1031 (partial sort problem, nth_element, stable_partition, lambda expression) 分类: hdoj 2015-06-15 17:47 26人阅读 评论(0) 收藏
partial sort. first use std::nth_element to find pivot, then use std::stable_partition with the pivo ...
- Unity优化之减少Drawcall
简单来说,Drawcall就是屏幕渲染一次所需要的开销,为了较少消耗,提高性能,一般有以下几种方法. 一: 批处理 1.动态批处理 如果动态物体共用着相同的材质,那么Unity会自动对这些物体进行批处 ...
- 【转发】linux文件系统变为只读的修复
详细解决方法:http://smartmontools.sourceforge.net/badblockhowto.html 相关问题,更换硬盘:http://blog.chinaunix.net/u ...
- yum源的更新问题
我们知道在linux下安装软件的方法有多种多样,其中利用yum的方式来安装较为简单,但需要等待的时间比较长.下面介绍一下如何更新yum的源的问题. 首先需要保证的是linux的机器能上网.然后按照下面 ...
- php注册审核显示
用户进行注册,管理员通过审核后,使用户通过审核 数据库建表 create database mydb; use mydb; create table User ( Uid int auto_incre ...
- hdu4597 区间dp
//Accepted 1784 KB 78 ms //区间dp //dp[l1][r1][l2][r2] 表示a数列从l1到r1,b数列从l2到r2能得到的最大分值 // #include <c ...