甜草莓,认真写科普,认真开脑洞,认真讨论生活。 傅里叶变换是通信领域最难形象理解但是最基础的概念之一,并且被广泛用于地震,声学分析,无损压缩,声音处理等领域。当年学的时候就觉得,国内的所有教材都是在试图通过数学手段证明,严谨有余但是解释不足,估计很多同学看到那些恨不得撞死在公式上。 最近研究了一些英语教材和网站,思来想去还是自己来尝试写一篇科普,目标是让所有看到本文的同学都可以从概念到公式地明白傅里叶变换是在做什么,并且得到启发。 正文开始~~ 作为一个勤勤恳恳的答主,当然要先回答问题咯! 1.一份知道自己正在被用于科普的傅里叶冰激凌 让我们从一个不是很正经的比喻总结我们的结论。 傅里叶变换其实就是一个自动化的配方还原机,它有这样的性质: 图像来自澜 HandMade 的豆果美食菜谱 a. 丢进去一个冰激凌(时域信号),就可以得到一个冰激凌配方(频域信号)。--- 傅里叶变换 b. 丢进去一个冰激凌配方(频域信号), 就可以得到一个美味的冰激凌(时域信号) 。--- 傅里叶反变换 c. 冰激凌通过滤波器,就可以提取出不同的配方成分。 ---- 傅里叶变换原理 d. 把配方丢进滤波器,就可以混合出想要的冰激凌。 ---- 傅里叶反变换原理 我们之所以需要这种“配方还原机”,是因为作为生产商来说,对比冰激凌不如直接对比配方本身。因为配方比冰激凌更容易分类,比较和修改。 然而勤勤恳恳的答主明白,这么粗浅的比喻是不能让严格的知乎群众满意的,于是他用数学语言严谨的解释了一下: 傅里叶变换针对时域信号测量每一个信号循环周期,并最终返回一个“信号循环配方”(频域信号)。 下面所有部分将不择手段地来解释这句话。 2. 在继续之前,这种配方还原机是如何工作的? 良心图解 手画了一个良心流程图(答主的 keynote 自我感觉良好)。这种冰激凌还原机真是简单粗暴,我们把冰激凌一个一个丢进机器,每个不同的冰激凌成分被直接提取了出来。 那么我们可以总结出设计这一类机器的一般准则? 各个成分滤波器应该是独立的。 不然得不到准确提取。 整个成分滤波器组应该是完备的。 不然可能有成分提取不到。 提取出来的各种成分应该是可加的。 不然这机器不能反向操作。 3. 所以满足条件的信号成分滤波器(信号的基本成分)有什么可能性? 这里有一个正确的观点曾经被数学家争论了一个世纪:任意周期信号都可以被转换成三角函数的叠加。 相信它也是各位在学习傅里叶变换时最难以形象理解的一句话。这里我们先把这句话扔在一边,换一种描述方式, 任何周期信号都是一种圆周的叠加。 这两句话中的内在联系其实很容易可以从欧拉公式 中得到,复平面的圆周 是复平面三角函数的叠加 .(请参看下图) 欧拉公式图解,注意实轴虚轴位置与下文不同 复数平面的三角函数是一种天然的信号基本成分(傅里叶变换的三角函数表示),复数平面的单位圆 也是一种天然的信号基本成分(傅里叶变换的复单位圆表示)。 当然以上我们都在讲的是静止信号,但是在打电话的时候,信号是随着语音持续生成的,那么持续生成三角函数和复平面单位圆可以更形象的用下图来理解, 4. 所以信号的基本成分应该怎么衡量? 原来我们在用手机打电话的时候,就是在画各种圈圈咯??没错,单位圆就是我们衡量信号的配方基底,我们说的话是不一样的,所以这些圆圈也应该不同,才能表示说话的信息。在我们不知道上图运动具体参数的情况下,应该用什么参数描述一个如上图的圆周呢? 并不难理解,相信大家也很容易看到,这些参数是起始位置,转动速度,半径。 圆周运动的特点与正弦波(信号)之间的关系也可以做如下对应, 起始位置 -> 信号相位 转动速度 -> 信号频率 半径 -> 信号振幅 那么通过调整上述“信号成分”的“多少”,傅里叶反变换就可以“合成”出各种各样的圆周运动,也就是可以生成各种各样不同的信号。 这个思路很重要,勤勤恳恳的答主又做了几个仿真,来帮助大家理解。 上图是一个 1Hz 的信号生成过程,黄色标点是信号起始位置和结束位置,蓝色标点是所画的信号实值部分。大家一定还记得左侧的圆在复数域,起始位置不是 0,是因为这个仿真里实值部分位于 x 轴,右侧信号就起始于峰值处。 圆的半径对应振幅。 为了形象解释信号的混合过程和频率作用,我们又加入了一个 2Hz 的信号,这里的 1Hz 和 2Hz 信号都是用绿色表示。最后合成的蓝色信号作为输出,是不是蓝色信号已经变得有点诡异了? 下一个是相位了!! 这个图换了黄色起始点,可以看到信号的相位有明显变化。 到这里告一段落,需要稍微总结一下: 可以通过调整振幅,相位,频率,用多个正弦波(或者复单位圆)“合成”出一个时域信号。 同理,可以通过把时域信号拆分,得到相应信号的频域信息(正弦波的振幅,相位,频率,或者单位圆的起始位置,转动速度,半径)。 5. 现在已经知道了信号基本元素是什么和成分用量怎么调整,那来搞事合成信号啊!?听说冲激响应很特别,就它吧? 以离散傅里叶变换为例,我们想要生成一个如(4,0,0,0)这样的时域冲激响应,怎么办呢? 我们希望的结果是,在 time =1 输出 4,在 time=2,3,4 输出 0. 在开始前需要说一个很有意思的相位补偿条件,当两个单位圆周(单位信号)之间角度差 180 度的时候,他俩相加所得的信号振幅为 0,三个单位圆周角度互相相差 120 度时,也有同样现象。 聪明的答主很快搞明白了各个成分用量, 4 个单位圆周,time=1 时都达到最大实值 (如下图绿色小数),可以输出 1+1+1+1=4 让 time =2,3,4 时输出都为 0(2,3,4 时满足上述相位补偿条件) 很快我们就有了这样的结果,如下图所示,蓝色为合成信号。 那么如果有很多个同时发生的冲激信号,而我们不想所有的信号高峰都在 time=1 发生。比如我们想要一个(0,4,0,0),这种信号的构成方式会有什么区别?换句话来问,我们怎么把上述冲激信号时移 1 个时间单位? 对于不同频率信号来说,圆周的旋转速度是不同的。我们的信号周期为 4,那么假如是 1Hz 的信号,时移 1 需要 1/4*360=90 度的相位补偿,同理 1Hz 信号时移 2, 或者 2Hz 的信号时移 1,都需要 180 度。 这样时移操作就完成了。 再进一步, 如果我们把上边两个冲激信号扩展一下,比如从(4,0,0,0)到(4,1,2,2),让每个时间点都有数据,这就构成了一个离散信号。 这个离散信号是多个冲激信号的时移叠加。 同时假设信号周期从 4 扩展到 N,那么对第 n 个时间点的相位补偿需要时移 n-1 次,也就是 ,换成弧度是 . 也就是说,多补偿一下就好了!! 6.搞明白了傅里叶反变换是怎么合成信号的,那么傅里叶变换是怎么从信号分解成信号的基本元素呢? 以一个周期为 4 的时域信号(1,2,3,4)为例, 我们可以理解成(1,0,0,0),(0,2,0,0),(0,0,3,0)和(0,0,0,4),并把这些脉冲信号逐个分解的方式来获得频域信号。 对于此信号中特定频率,它的振幅是 1/4+2/4+3/4+4/4(同上例,这里多加了个平均) 我们不想时域信号挤成一团,那么就考虑相位补偿,根据上个例子经验,如果要达到时移效果的话,第一个冲激响应(1,0,0,0)不补偿 ,第二个冲激响应(0,2,0,0)补偿 ,第三个冲激响应(0,0,3,0)补偿 ,第四个冲激响应(0,0,0,4)需要补偿 。 最终对于特定频率得到的频域信号是 (这里相位补偿的﹣是因为我们是在分解时域信号,这时候正弦波是后向移动) 假如信号周期从 4 扩展到 N,同时把(1,2,3,4) 换做 ,那么对于特定频率的频域信号是这样算出来的, 设此特定频率为 k,我们的离散傅里叶变换公式了就出现了!! 离散傅里叶反变换和其他傅里叶变换也都可以类似解释。 7.其他一些形象解释 谢谢观看!勤勤恳恳的答主再此拜谢!! [1] An Interactive Guide To The Fourier Transform, betterexplained.com [2] Understanding the Fourier transform, Stuart Riffle [3] codes, https://gist.github.com/kazad/8bb682da198db597558c [4] Fourier Transform: A R Tutorial, João Neto