本文转自公众号 算法与数学之美
本文主要针对涉及到离散傅立叶变换复数问题做一个回复,大部分网友都认为离散傅立叶变换复数,就是一顿数学的推导,用matlab套用公式做几个例子就差不多了,至于很详细的,尤其是感性的理解,完全没有。
其实,关于傅立叶变换本身不复杂,但引入了复数之后,因为大家对复数的物理意义都不懂,最后都是属于理性的公式推导,但最后的结果的物理意义是什么,大家却都不明白,只知道一堆的数学公式,这个是一种本末导致,所以我认为有必要先搞明白复数的物理意义,只有看得懂复数,有它的感性认识,那么基于它的推理才可能有感性,深刻的认识。
对于复数,长期困扰着我,无法理解,因为老师从来没有跟我们解释过它的物理意义,只是把结果告诉我们,让我们死记硬背。对于一个无法理解的东西而又想要去理解,最好的办法是溯源,去了解它的历史:
复数,最早是在解一元三次方程的时候引入的,当时解一元三次方程,很难解,引入了一个符号——设为J,J * J = -1,可以比较容易的解了这个方程,但带j的那个解,不被大家认可。这是虚数第一次出现,但到了后来,高次解之后,大家发现,j越来越绕不开,并且有规律,N次方程,就有N个包含带J的解,于是大家认识到一点,一个高次方程,要想解它的解,最佳的捷径就是从J入手。
到了高斯时期,高斯对这个J进行了研究,那个时候是笛卡尔坐标系,但他第一个把J引入坐标系,于是出来了复数坐标系,但他的物理意义是什么呢?他把这个物理意义跟平面坐标的矢量四则运算结合起来,若J * J = -1,恰好满足一个平面坐标的矢量四则运算,那个时候他意识到,J真是存在,J的物理意义就是表示另外一个坐标轴,它是一个坐标轴的符号,为了区别X轴,引入Y轴,那么必须要用符号标记,所以J是坐标Y轴的符号,这就是它的物理意义,于是就有了a+bJ。
有了复平面其实就是用一个数来表征一个平面数据,而J只是一个符号,那么这个符号的四则运算肯定不同于数字运算逻辑,假如符号运算逻辑跟数字运算逻辑等价,是不可以理解的,那么这样下,J * J = -1,这个就可以理解了,J * J = 1反而不能理解,因为这个J是符号,这个是符号的四则运算逻辑,它必须要跟数字的运算逻辑不同,甚至相反。而现在恰恰相反,满足了我们的实际需要,这样数学进入了平面时代。
那个时候三角函数发明了,并且非常兴起,而三角函数是典型的平面坐标体系,于是大家想到了用复平面来表征三角函数,这个里面,欧拉做了最大的贡献,那就是欧拉公式:e^iπ+1=0。它把数的基本逻辑搞明白了,出来了完美的公式,而后期的傅立叶变换,大家也开始引入了正交复平面坐标系来表征一维信号,发现得到了一个完美统一的表达方式:用正交复平面坐标系来描述,这个相对于常规的,用三角函数正交坐标系描述,在形式上更统一。但是,三角函数正交系(普通傅立叶变换)的表达都让很多人晕乎了,何况还是的正交复平面坐标系,这个就导致了理解上的难度。其次,我们的教育,虚数是在高中时期引入的,那个时候老师根本不明白虚数的意义,到了大学,我们往往把结果当成了真理来运用,不去溯源而忘乎了复数的历史起源,可以说,复数的起源,是很多初期数学家困惑的东西,就如同量子理论一样,大家都在不停的否定中,被迫承认,后来发现好处,尤其形式上的完美统一,最后,反而进入了自我循环的独立体系,却最后忘记了它的根本,任何东西,必须要有物理意义,抛弃物理意义,只是推导,那只需要计算机就可以了,不需要人。
复数的引入,最大的价值,让我们的思维开阔了,可以引入N维度的思维,这个在实际中有很多应用,而基于这种思维的应用,一般都是可以做一些高、精、尖的产品,以避免同质化竞争。
有人在Stack Exchange问了一个问题:"我一直觉得虚数(imaginary number)很难懂。中学老师说,虚数就是-1的平方根。可是,什么数的平方等于-1呢?计算器直接显示出错!直到今天,我也没有搞懂。谁能解释,虚数到底是什么?它有什么用?"
帖子的下面,很多人给出了自己的解释,还推荐了一篇非常棒的文章《虚数的图解》。我读后恍然大悟,醍醐灌顶,原来虚数这么简单,一点也不奇怪和难懂!
下面,我就用自己的语言,讲述我所理解的虚数。
一、什么是虚数?
首先,假设有一根数轴,上面有两个反向的点:+1和-1。
这根数轴的正向部分,可以绕原点旋转。显然,逆时针旋转180度,+1就会变成-1。
这相当于两次逆时针旋转90度。
因此,我们可以得到下面的关系式:
(+1) * (逆时针旋转90度) * (逆时针旋转90度) = (-1)
如果把+1消去,这个式子就变为:
(逆时针旋转90度)^2 = (-1)
将"逆时针旋转90度"记为 i :
i^2 = (-1)
这个式子很眼熟,它就是虚数的定义公式。
所以,我们可以知道,虚数 i 就是逆时针旋转90度,i 不是一个数,而是一个旋转量。
二、复数的定义
既然 i 表示旋转量,我们就可以用 i ,表示任何实数的旋转状态。
将实数轴看作横轴,虚数轴看作纵轴,就构成了一个二维平面。旋转到某一个角度的任何正实数,必然唯一对应这个平面中的某个点。
只要确定横坐标和纵坐标,比如( 1 , i ),就可以确定某个实数的旋转量(45度)。
数学家用一种特殊的表示方法,表示这个二维坐标:用 + 号把横坐标和纵坐标连接起来。比如,把 ( 1 , i ) 表示成 1 + i 。这种表示方法就叫做复数(complex number),其中 1 称为实数部,i 称为虚数部。
为什么要把二维坐标表示成这样呢,下一节告诉你原因。
三、虚数的作用:加法
虚数的引入,大大方便了涉及到旋转的计算。
比如,物理学需要计算"力的合成"。假定一个力是 3 + i ,另一个力是 1 + 3i ,请问它们的合成力是多少?
根据"平行四边形法则",你马上得到,合成力就是 ( 3 + i ) + ( 1 + 3i ) = ( 4 + 4i )。
这就是虚数加法的物理意义。
四、虚数的作用:乘法
如果涉及到旋转角度的改变,处理起来更方便。
比如,一条船的航向是 3 + 4i 。
如果该船的航向,逆时针增加45度,请问新航向是多少?
45度的航向就是 1 + i 。计算新航向,只要把这两个航向 3 + 4i
与 1 + i 相乘就可以了(原因在下一节解释):
( 3 + 4i ) * ( 1 + i ) = ( -1 + 7i )
所以,该船的新航向是 -1 + 7i 。
如果航向逆时针增加90度,就更简单了。因为90度的航向就是 i ,所以新航向等于:
( 3 + 4i ) * i = ( -4 + 3i )
这就是虚数乘法的物理意义:改变旋转角度。
五、虚数乘法的数学证明
为什么一个复数改变旋转角度,只要做乘法就可以了?
下面就是它的数学证明,实际上很简单。
任何复数 a + bi,都可以改写成旋转半径 r 与横轴夹角 θ 的形式。
假定现有两个复数 a + bi 和 c + di,可以将它们改写如下:
a + bi = r1 * ( cosα + isinα )
c + di = r2 * ( cosβ + isinβ )
这两个复数相乘,( a + bi )( c + di ) 就相当于
r1 * r2 * ( cosα + isinα ) * ( cosβ + isinβ )
展开后面的乘式,得到
cosα * cosβ - sinα * sinβ + i( cosα * sinβ + sinα * cosβ )
根据三角函数公式,上面的式子就等于
cos(α+β) + isin(α+β)
所以,
( a + bi )( c + di ) = r1 * r2 * ( cos(α+β) + isin(α+β) )
这就证明了,两个复数相乘,就等于旋转半径相乘、旋转角度相加。