【直观详解】让你永远忘不了的傅里叶变换解析

数学算法俱乐部

共 7347字,需浏览 15分钟

 ·

2020-10-15 03:28















数学算法俱乐部



日期2020年10月14日

正文共:6814字25

预计阅读时间17分钟

来源:github


使用联想链条和几何直观,辅以从实际需求衍生概念的思考模式,详解什么是傅立叶变换,为什么要做傅立叶变换等,帮助记忆和理解,目的当然是标题所说:让你永远忘不了傅里叶变换这个公式。另,这篇博客还从侧面一定程度上回答了另一个问题:为什么要研究复数

本篇博客为形象展示傅里叶变换欧拉公式与初等群论两个视频的笔记结合,希望通过此篇让所有读者对傅立叶变换有一个全新的认知,并且宣传一波 3b1b 良心视频系列!重塑对未知和知识的渴求

知乎相关问题链接,小伙伴们求点赞!没有功劳也有苦劳啊!

欧拉公式与旋转

在开始一步一步接近【傅立叶变换】前,先说一下群论
提前说明,此部分有地方会提到【群论】这个概念,但博主并不是要试图把什么环、域、向量空间、代数结构、线性代数群、李群等等一大堆很抽象的概念灌输给大家,我们只是为了利用群论的概念,加深或者说建立一个对【理解傅立叶变换】极度有帮助的直观概念:
指数函数(逆操作对数函数同理)是加法和乘法运算的桥梁,在自变量包含复数时表示旋转
以具体的一个例子来说:
 e^(πi)表示的是在单位圆上逆时针在旋转180°这个变换

等等,这不是排行世界上最伟大的十个公式第二名的欧拉公式(上帝公式)嘛?(BTW,我们今天的主角【傅立叶变换】排行第七,这阵容着实强大)
是的,这第一部分,捎带,会带你更进一步的重新认识这个公式的伟大


对称性 symmetry

首先,假设我们有以下陈述:
正方形对称图形

那么从数学(定义 or 公式)角度上来说,怎么描述【对称】这个概念呢?我们作为【人】,肯定会想,不就是看着左右一样嘛?不够严谨,不够优雅,继续深入,可以这么考虑:
你能对正方形做些什么,并且在这个操作后,保持正方形的形态和操作前相同
我们把具有上述性质的操作都列出来,放在mi一起,如下面动图所示(左右旋转90°,旋转180°,四个轴对称,不变,这八个操作),就构成了一个有限群【对称群】,更专业的叫法是【八阶二面体群 Dihedral group of order 8】

有了上面的直观理解,还有一个无限群需要了解,即【旋转群】,表示的是所有旋转操作,当然,因为角度可以无限细分,这个操作也是无限的,比如:顺时针旋转
此时,能总结出一个巧合的现象,按照顺序进行上面8个操作的某两个,恰好等同于8个操作中的其他的某一个(旋转群同理),如下面的动图所示,把这些组合放到一起,才真正的表达了【群】这个概念

很多不同的概念都能从对称性和对称性的符合构建得到,如下图所示,其中,数字本身有两种表达方式(操作),加法乘法
对于【数】这个集合来说,加法对应数轴的平移变换(一个操作),乘法对应着数轴的伸缩变换(一个操作)
把这个数轴的概念拓展到平面坐标系,1D ➜ 2D。如果我们要把一个点,比如(1,0)移动到另一个点,应该如何操作?简单的说,只需要先在横轴方向上平移,再在纵轴方向上平移即可(核心思想类比于正方形的几个操作
同理,除了平移外,使用伸缩旋转也可以完成同样的事情(将任意一点移动到另一个位置),伸缩是乘法显而易见,但是旋转怎么表示呢?(当然直接改变坐标轴的定义也是能做到的,例子就是极坐标系,但我们并不想这么做),我们构造以下思考链条
  • 考虑一个特例操作:一个点变到另一个点:(1,0)通过伸缩旋转到(-1,0),长度不用变,只需旋转即可
  • 此时,注意到了一个形式很有特点的定义: ,-1 就是我们需要的目标位置,那如何从(1,0)出发进行两次同样的操作可以得到(-1,0)呢?(这个操作即 i" role="presentation" style=" box-sizing: border-box; display: inline-block; line-height: 0; overflow-wrap: normal; word-spacing: normal; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border-width: 0px; border-style: initial; border-color: initial; padding-top: 1px; padding-bottom: 1px; ">i 这个虚数单位定义的操作)答案即:一个单位 i" role="presentation" style=" font-weight: normal; overflow-wrap: normal; word-spacing: normal; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; padding-top: 1px; padding-bottom: 1px; ">ii 表示旋转90°即可
  • 更意外的发现,进行一次 i" role="presentation" style=" box-sizing: border-box; display: inline-block; line-height: 0; overflow-wrap: normal; word-spacing: normal; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border-width: 0px; border-style: initial; border-color: initial; padding-top: 1px; padding-bottom: 1px; ">i 操作,如果是逆时针旋转90°,正好会落在二维平面y轴的(0,1)与单位长度不谋而合
  • 更大胆的假设,如果y轴自带虚数单位,如,就有旋转操作了,是不是就就能通过乘法来描述处在这个平面上的所有变换了
以上都是假设和推理,剥丝抽茧后,最关键的部分:如何使用单位 表示逆时针旋转90° ,并且给出了一种可能的映射规则x轴平移表示伸缩y轴平移表示旋转,这样就可以保证群的特性?(几种操作一定可以组合成其他某个操作,有一个学名:保持群结构
i 怎么可能表示旋转呢?怎么看都像啊,此时陷入了死胡同,不妨换个角度来思考,旋转到底是什么?
旋转,是沿着一个圆弧(有圆心,转过的角度)运动的过程
如果你对泰勒公式非常熟悉,就可以通过一系列公式推导得到一个完美桥梁:【指数函数】,形如
如果底数 a=e ,通过泰勒展开式,可以完成一个十分优美的变形,如下:
将 x=iθ 带入(1)式(这里的 θ 是一个未知数,即自变量),整理项,移动,结合 cos(x) 和sin(x) 的泰勒展开式,还有虚数单位的定义 i=−1×−1 , 有下列推导:
这个公式有什么用呢?可视化后,如下图所示
假设纵坐标自带虚数单位 i (复平面),那么,sin(θ) 为纵坐标(自带虚数单位 i ),cos(θ) 为横坐标,则可以发现:e^() 表示一个圆心在原点,半径为1的单位圆(图中是 α ,因为作图软件的限制,换不成 θ ,但不影响)

e^(iθ)这个公式等价于一种旋转θ" role="presentation" style=" font-size: 15px; box-sizing: border-box; display: inline-block; line-height: 0; text-align: left; overflow-wrap: normal; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border-width: 0px; border-style: initial; border-color: initial; padding-top: 1px; padding-bottom: 1px; color: rgb(33, 33, 33); font-family: Menlo, "PingFang SC", system-ui, Ubuntu, "Helvetica Neue", Helvetica, Arial, sans-serif; background-color: rgb(255, 255, 255); ">θ 为旋转角的度数(统一单位,弧度制,即把°转换成实数)θ=2π" role="presentation" style=" line-height: 0; text-align: left; overflow-wrap: normal; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border-width: 0px; border-style: initial; border-color: initial; color: rgb(33, 33, 33); background-color: rgb(255, 255, 255); white-space: pre-wrap; display: block; padding-top: 0.471em; padding-bottom: 0.296em; font-family: Menlo, "PingFang SC", system-ui, Ubuntu, "Helvetica Neue", Helvetica, Arial, sans-serif; box-sizing: content-box !important; ">θ=2π 即为360°,是单位圆

我们已经优雅的找到了这个桥梁,接下来仔细研究一下它意味着什么

指数函数 Exponentiation

指数函数有一个非常重要的特性:加法变乘法,即
也就是说通过指数函数,可以做到使用平移变换来描述伸缩变换,这具体是什么意思呢?参考下面的动图
上方的数轴,表示的是平移变换 -1(左移一个单位) 和 2(右移两个单位)(加法),下方的数轴将两个数作为输入,代入到一个指数函数中,对于函数来说,这个输出值,就是两次伸缩变换 (乘法),一次是收缩为原来的 ,另一次是拉伸成原来的 

注意,所谓可以变的意思是说,加法运算可以成立,意味着先往左平移1单位,再往右平移一单位,组合起来的左右就是往右平移一到位(-1+2=1, 群论的保持结构特性) ,  而乘法运算成立也要满足这个特性  

复平面 Complex Plane

至此,构造复平面,把虚数单位 i" role="presentation" style=" box-sizing: border-box; display: inline-block; line-height: 0; overflow-wrap: normal; word-spacing: normal; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border-width: 0px; border-style: initial; border-color: initial; padding-top: 1px; padding-bottom: 1px; ">i 加到纵轴上。我们就同时拥有了伸缩和旋转,最关键的是,有了这两个操作,我们同时也可以维持的群的特性(使用乘法)
如下面动图所示,在复平面内,以指数函数为桥梁实轴横向平移对应伸缩虚轴纵向平移对应旋转

横坐标红线,横向平移映射到伸缩操作的可视化
纵坐标虚数单位,纵向平移映射到旋转操作的可视化,正为逆时针旋转
现在使用的桥梁是底数为2的指数函数,我们知道e^(πi)代表的半个圆周,我们希望把底数变成 e , 这样更加方便表达圆的概念
每走一个单位的纵向位移,在圆周上旋转的圆弧长度就是1,参照下面的动图,e^(πi) 恰好代表逆时针旋转180°,并且落在的位置为(-1,0),这就是欧拉公式,或者说是欧拉公式的几何直观可视化

总结

这第一部分到底干了啥?其实就是想建立一个观念(或者说常识)
e^x 在复平面,或者说 x=ai(a为某个常数,就是弧度制的圆周长度)代表的变换是:旋转
如果你之前学过傅立叶变换,那么会明白为什么需要花费这么大篇幅来讲这个,因为公式中, e^() 那是可是相当重要的一部分啊

傅里叶变换

  
正式进入傅立叶变换的部分,老规矩,先做一下基本信息整理

什么是傅立叶变换

首先,还是先弄清楚我们理解的目标是什么
傅立叶变换(如果不加限定,这个词对应的是连续傅立叶变换
傅立叶级数
傅立叶变换还有很多其他的内容:离散时间傅立叶变换离散傅立叶变换傅立叶逆变换,快速傅立叶变换等,进一步的拉普拉斯变换,小波变换,z变换等

[ 公式表示 ]

傅立叶变换,变换作用是时域映射到频域,公式是长这样的:
很多时候,这里的会写成 F(w) 或 F(f) 表示角速度或者频率,当然后面的公式的量纲也需要对应的修改;后面的自变量 x 大多数时候都是写成 t 表示时间。当然,他们表示的都是同一个东西

[ 联想链条 ]

既然是为了【理解】和【记忆】,那么我们还是需要定义一个联想链条
傅立叶变换 ➜ 分解声音的过程

这么抽象实在是因为拆字法真的很难联想出什么东西来(傅里叶?变换?嗯,很难的样子),只能这样了。
接下来就是精华部分:3b1b的傅立叶变换讲解内的核心内容!在笔记完成后,会给出结合直观理解的完整联想链条,目的当然是【让你永远忘不了】喽,点题!

【看到】傅立叶变换

[ 声音的表示 ]
我们是如何记录声音的呢?如果你测量的是扬声器旁的气压,那么它会是一个随时间以正弦函数形态不断震荡的图像,一个标准音 A(下图黄色),它的频率是440Hz,表示每秒钟振动440次,比它低一些的D(下图紫红),是294Hz,振动的慢一些。如果这两个音同时发出,产生的气压随时间曲线怎么决定呢?如下动图,其实就是把所有时间点的振幅加起来
那么如果给你随意一段随时间变化的气压曲线,你如何找到这些原有的组成音符呢?这就是我们的目的,参考下面的动图,感觉有点像是把一盘混好的原料分成组成它的单独的颜色,感觉不那么容易吧?

下面就需要一步一步把这件事情做出来
[ 可视化方法 ]
首先,假设我们有一个每秒钟3拍子的声音信号(440Hz实在太快了),它的图像如下(Intensity为强度,可以同理成气压),并且,我们只关注前面的4.5秒(即图像中画出来的部分)

1. 绕圈记录法:同一事物的不同角度

千万不要眨眼!下面是最关键的一步,是【看到】傅立叶变换的核心部分,如下面动图所示
  • 首先把黄色曲线缠绕到一个圆上,大小就是原本信号的振幅

  • 圆周围的图像由白色的箭头绘制而成,速度可变,上图中的白色箭头移动速度是每秒钟转过半圈(这个速度是对于下面的圆形图像来说,每秒钟在圆形图像中转半圈),对应上面的则是虚线表示一圈走到的位置,0.5拍子/秒

  • 此时,有两个频率在起作用,一个是信号的频率:3次震荡/秒,另一个是图像缠绕中心圆的频率,为0.5圈/秒,第二个频率可以自由改变,相当于一个变量,下面的动图直观的展现了缠绕速度变化时的可视化表现

从最开始的 0.79圈/秒(注意这里的速度是指绕单位圆的白色箭头的滑动速度)一直变化到1.55圈/秒,再到最后的恰好是3圈/秒,和原来的信号3拍/秒相同,此时会出现一个非常稳定的图像,我们可以理解成,同步,这个绕圈图像记录了原信号的幅值变化并且每一圈都相同(周期性)
其实,我们只是把一个水平的轴缠绕到一个单位圆上,并用另一个速度的记录标尺(白色箭头)来画图,从另一个角度(维度)来看我们的信号

2. 质心记录法:新维度的特征提取

虽然新图像挺好看的,但是现在感觉并没法从中看出什么。也不尽然,我们直观的发现,当白色箭头记录的速度在某些特定的值时,画出来的图形非常稳定,形态清晰。那如何表现这个特征呢?
从两个角度来思考
(1)自变量是什么?(输入特征)
输入是一个可变化的转圈速度,既然可变,不妨把它看作自变量,即 f(x)中的x 
(2)输出(新的圆圈图)有什么特征?(输出特征)
观察到,当图像很混沌(没有规律,混乱的)时候,图像基本关于原点对称;稳定时,其实是“头重脚轻”的。描述“头重脚轻”最好的方法当然是用【质心】(它描述了物体的空间分布特征) ,下面的动图直观展现了质心特征对图像特征的描述能力(红色点为质心
考虑到质心其实是一个二维坐标,这里为了简洁和直观,取质心的横坐标来表示质心的特征
【输入(横坐标)】➜【进行采样的(白色箭头)的绕圈速度】
【输出(纵坐标)】➜【圆圈图的质心位置的横坐标】
按照上面的说明来记录绘出图像,记录每个缠绕频率(速度)对应的质心位置,参看下列动图,随着图像的绘制到3圈/秒这个位置的时候,是不是感到似曾相识呢?
我们可以看到,新图像的横坐标写的是【频率 Frequency】,即缠绕圆圈的记录速度,所以强烈建议看到频率,想起速度,并且抽象为围着圆圈跑的速度(个人感受,对理解【频率】的概念有助益)
好!有了这个工具,先把它应用到两个声音的组合图像中看看效果:(这是我最喜欢的一张动图)
什么?还是没看清上面的振动图像如何变成圆圈图的?看下面的动图,缠绕圆圈速度为2圈/秒的白色箭头将时间信息映射到圆圈图中的的可视化。再次重复,白色箭头以一定的速度(频率,一秒几圈)在上图中向右横移,同时,在下面的单位圆内被转换成类似钟表指针移动的圆圈运动,并记录振幅,画出图像
BTW,图形的一部分有点像动画EVA中某个使徒的脸,带给人一种诡异的仪式感。数学之令人敬畏,可能在这一刻熠熠生辉,刺的人睁不开眼
[ 公式表示 ]
大家也发现了,我们已经通过这样一个缠绕机器完成了时域到频域的转换,总得来说,参看下面的动图
这是一种【近傅立叶变换】,为什么是【近】,后面会提到。先考虑,那如何数学语言表达这个【转圈记录机制(工具 or 机器)】呢?

第一步:旋转的表示

如下面的动图所示,在这个工具中,非常关键的就是转圈,即表达旋转这种运动,根据第一大部分,这个桥梁,就是复平面,其背后的原理是指数函数结合泰勒公式
更进一步,指数函数中,以 e" role="presentation" style=" font-size: 15px; box-sizing: border-box; display: inline-block; line-height: 0; text-align: left; overflow-wrap: normal; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border-width: 0px; border-style: initial; border-color: initial; padding-top: 1px; padding-bottom: 1px; color: rgb(33, 33, 33); font-family: Menlo, "PingFang SC", system-ui, Ubuntu, "Helvetica Neue", Helvetica, Arial, sans-serif; background-color: rgb(255, 255, 255); "> 为底的函数有着特殊的性质,如下面动图所示,π" role="presentation" style=" font-size: 15px; box-sizing: border-box; display: inline-block; line-height: 0; text-align: left; overflow-wrap: normal; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border-width: 0px; border-style: initial; border-color: initial; padding-top: 1px; padding-bottom: 1px; color: rgb(33, 33, 33); font-family: Menlo, "PingFang SC", system-ui, Ubuntu, "Helvetica Neue", Helvetica, Arial, sans-serif; background-color: rgb(255, 255, 255); ">单位的就表示一个单位圆的360°旋转,则表示的就是一秒钟一圈的旋转方程,感觉速度有点太快了,所以加一个 f 频率,控制旋转的速度 ,图中为 1/10 , 合起来表示一秒钟十分之一圈

第二步:缠绕的表示

首先,依据下面的动图所示,在傅立叶变换中,我们规定旋转是顺时针的(规定只是为了统一标准,并且有时候也会考虑书写简洁方便计算),所以先加一个负号。假设原来的函数是g(t),将两者的幅值相乘就能得到缠绕图像,,可以说是相当机智了!

第三步:质心的表示

那如何表示质心这一概念呢?粗略想一下感觉挺难的,但是看起来很难的问题,有一种解决问题的途径是【演绎推理】,先从简单的特例出发,推广到一般,最后证明正确性即可
考虑如何求一个正方形的质心位置,我们只需在边框上取n个等距离分布的点,并且算这几个点的位置的平均值。那么推广到一般情况,也使用类似的采样点的方式解决,如下面动图所示(紫红色的点即采样点),得到

随着采样点的增加,需要使用积分来求解这个问题,如下面动图所示,得到

最终步:整理积分限和系数

看到常数项系数,如果忽略表达倍数关系的系数,对应的含义也会发生变化,不再是质心,而是信号存在的时间越久,位置是质心位置乘以一个倍数,它的值就越大。参看下面的动图,持续时长为3秒,那么新的位置就是原来质心位置的三倍;为6秒,就是原来的6倍
而去掉系数的几何直观动图变为(红色箭头为去掉系数后的长度表示),最本质的区别是:可以使得最后绘制的图像更集中在对应的频率的附近,或者说在对应的频率位置的值更大

继续考虑上下限。我们知道,一般傅立叶变换公式的上下限是正负无穷,那它的几何直观是什么呢?参看下面动图,其实就是看看信号持续时间无穷大是什么样子的
说实话,这个动图解答了我大学时代的一个疑惑,音乐文件不都是有时间长度的嘛,我就一直不懂,凭什么对负无穷到正无穷做傅立叶变换?原来真实情况是,负无穷到0,音乐结尾到正无穷,就像上面的动图,其实都没有振动幅值(电信号幅值)与之对应,再结合缠绕圆圈的思想:原来,从音乐开始到结束傅立叶变换和从负无穷到正无穷做傅立叶变换,是特么的一回事啊!(吐槽完毕)

补充

[ 相位 ]
在表示质心的时候,我们只取用了x轴坐标,下面的图中的蓝色曲线就是纵坐标(y轴 or 虚部)的可视化,红色曲线是横坐标(x轴 or 实部)
那么相位是如何表示的呢?如下面动图所示,其中红色的部分为质心,长度为振幅大小,对应的角度就是相位

[ 原信号的长度 ]

再追根究底一些,因为之前已经提到过,假设我们的信号有4.5s。
那么考虑原信号的长度的变化呢?首先,假设信号的长度很长,那么缠绕圆上的线就会更多,每次接近稳定图像质心的变化速度更快(即频域图像更加密集),参看下面动图
那么对应的,如果原信号的长度缩短呢?如下面动图所示,频域图像会更加稀疏。原因同理,当缠绕的内容少的时候,重心变化的速度也相应的变慢了
总得来说,基本就上述内容就详细解释了下面的现象:
时域的信号周期越长,那么频域就越集中,越不容易发生混叠,越容易抽象出时间信号的周期性重复信息,此时自然而然的,周期性这个词就出现了。
另外,可以自己思索一下,比如无穷时间的周期时域信号呢?又比如一个恒定振幅(一个电平)的时域信号呢?其实这里就给出了一个提示有关为什么傅立叶变换有那么多需要考虑的变形了,因为在缠绕这件事情发生的过程中,有几种情况是特别的(这部分3B1B视频并没有讲解,可能需要未来再更新了)

总结

讲了这么长,至此全部结束。估计读者都已经晕了,那么,在这里为【看到】傅立叶变换做一个总结,就来总得说说我们从头到尾都干了些啥?参看下面动图
  • (1)e^(πi)表示单位圆,添加自变量即可表示旋转
  • (2)与原函数相乘缠绕到单位圆
  • (3)为求质心的特征,进行积分计算
一步一步写出傅立叶变换公式的联想链条
  • 一个逆时针旋转360°画成的圆 ➜
  • 表示运动,需要原函数的自变量,时间 t" role="presentation" style=" line-height: 0; overflow-wrap: normal; word-spacing: normal; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border-width: 0px; border-style: initial; border-color: initial; white-space: pre-wrap; display: block; font-family: MJXc-TeX-math-I, MJXc-TeX-math-Ix, MJXc-TeX-math-Iw; padding-top: 0.413em; padding-bottom: 0.296em; box-sizing: content-box !important; ">
  • 表示旋转速度,需要自变量,频率
  • 规定变换的采样方向为顺时针,加负号
  • 乘以原函数缠绕到单位圆并记录(此处使用g符号标识原函数是为了和频率符号区分
  • 为了计算质心特征,积分
  • 自变量为频率 f" role="presentation" style=" font-size: 15px; box-sizing: border-box; display: inline-block; line-height: 0; overflow-wrap: normal; word-spacing: normal; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border-width: 0px; border-style: initial; border-color: initial; padding-top: 1px; padding-bottom: 1px; ">f,写出函数表达式g^(f)=+g(t)e2πitfdt" role="presentation" style=" line-height: 0; overflow-wrap: normal; word-spacing: normal; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border-width: 0px; border-style: initial; border-color: initial; color: black; font-size: 15px; white-space: pre-wrap; display: block; font-family: MJXc-TeX-math-I, MJXc-TeX-math-Ix, MJXc-TeX-math-Iw; padding-top: 0.413em; padding-bottom: 0.296em; box-sizing: content-box !important; ">




— THE END —




中科院院长:把美国卡脖子清单变成科研清单
成为诺奖热门人选,培养三名院士,他25岁才读研一!
x背后的轶闻趣事
如果新冠肺炎写入历史课本,你会选择哪张照片作为配图?
北大读博手记:怎样完成自己的博士生涯?非常具有指导性!
GCN图卷积网络入门详解
浏览 38
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报