从线性代数的角度理解傅里叶变换
这篇最早是在知乎上写的一个答案,在这展开总结总结吧。从线性代数的角度,试着直观地理解傅里叶变换和相关的公式。在理解傅里叶变换前,首先回顾一个线性代数里的简单概念:
正交基(Orthogonal Basis)
考虑如下的向量表达式:
(23−116)=6⋅(001)+(−11)⋅(010)+23⋅(100)
一个简单的向量被分解成了3个向量的线性和。特别的,在这个例子中,注意到,分解开的三个向量两两之间互相的内积等于零,于是这三个向量就是一组简单的正交基。至于正交和内积为零,不妨这么理解,内积指的是一个向量(在另一个向量上)的投影乘上另一个向量的模(可以理解为向量的长度),如果内积为零,意思是互相之间没有投影。具体到上面例子,就是想象一个三维空间中,三个坐标轴是互相垂直,每个正交基向量前的系数正是原始向量在每个向量方向上的投影。那么正交基是不是唯一的呢,并非如此,比如下面的表达式:
(23−116)=7⋅(273767)+14⋅(6727−37)+21⋅(37−6727)
一般来说,一个向量都可以表达成如下的形式:
v=a1v1+a2v2+...+akvk
其中v∈Rk,(v1,v2,...,vk)是一组正交基。特别地,注意到上面两个例子中,每组正交基中的向量,其模(可以认为是长度)的大小都是1,这样的情况称为标准正交基。
理解了正交基之后,我们试着做下面一件事,求正交基向量对应的系数,还是以第一个表达式为例:
(23−116)=a⋅(001)+b⋅(010)+c⋅(100)
比如我们想求b的值是多少,回忆前面说的系数就是在基向量上的投影(也就是分量)和基向量模的比值,具体到前面的例子,因为基向量的模都是1,于是求系数就变得非常简单,就是求内积而已:
b=⟨(23−116),(010)⟩=23×0+(−11)×1+6×0=−11
对第二个表达式也可以做类似的事情:
⟨(23−116),(6727−37)⟩=23×67+(−11)×27+6×(−37)=1387−227−187=14
总结如下:如果B是某个实线性空间中的一组正交基,那么对该空间中的任一x,有:
x=∑b∈B⟨x,b⟩⟨b,b⟩b=∑b∈B⟨x,b⟩|b|2b
也就是说,基向量前的系数是信号和基向量的内积比基向量和自身的内积(也就是模的平方)。特别地,如果正交基中的向量都是单位向量,也就是|b|=1,那么每个正交基向量前的系数就是x和b的内积,即:
x=∑b∈B⟨x,b⟩b
傅立叶级数(Fourier Series)
傅里叶级数的定义到处都是,我就不赘述了。直观上来理解,傅里叶级数将一段周期性的信号分解为用正弦函数和余弦函数构成的无穷级数,wiki上的示意图很清晰地展示了这一点:
据说傅里叶最早提出这个东西是在他关于热传导的著作里,目的是解偏微分方程,他可能也没想到后来这么个小数学工具成了许许多多学科中的重要手段。为什么是三角函数呢,因为三角函数的一个性质:二次导数就是自身乘个系数。如果抛开数学和傅里叶变换的起源,三角函数代表的是简谐振动,而简谐振动是宏观物理世界里最常见的一种振动,这大概也是傅里叶变换为什么应用这么广的原因之一。有点跑题,回到傅里叶级数,先回想前面提到过的公式:
v=a1v1+a2v2+...+akvk
如果我们想象一段离散地、有限的时间信号,假设采样点有k个,我们不妨把这段时间信号看做是一个大小为k的向量,于是这段时间信号应该也可以用如上的表达式表达出来,其中v(t)就是在第t个时间点(第t维)的值,于是有如下:
v(t)=a1v1(t)+a2v2(t)+...+akvk(t)
再做点简单修改,设想有个向量
f=v+12a0(1⋮1)
其中f,v∈R2k, 那么f(t)可以表达如下
f(t)=12a0+a1v1(t)+a2v2(t)+...+akvk(t)+b1w1(t)+b2w2(t)+...+bkwk(t)
有没有觉得很眼熟?设想如果这个信号恰好是个周期为2π,那么把vn(t)换成cos(nx),wn(t)换成sin(nx),也就是在频域按频率的分解近似,得到如下:
f(t)=12a0+k∑n=1ancos(nt)+k∑n=1bnsin(nt)
记得我们前面提到过正交基的概念,那么三角级数构成的基是否正交基呢?答案是肯定的,一般来讲,对于自然数m, n,如果m≠n则有:
π∫−πcos(mx)cos(nx)dx=0π∫−πsin(mx)sin(nx)dx=0π∫−πcos(mx)sin(nx)dx=0
看到这里可能要问了,这个是内积吗?答案:是,在连续实区间[a,b]上的内积就是这么定义的:⟨f,g⟩=b∫af(x)g(x)dx。直观的解释就是求内积后再除以维数,也就是说求每一维上乘积的平均值,再推广到无限维来类比连续区间,就变成了乘积的积分。回到上面的三个公式,证明很简单,就是利用积化和差的公式将乘积化成两个三角函数,然后求最积分,这里就略过了,有兴趣看更多可以点击传送门,在此附上wiki的直观动画解释一幅:
将以上推广到k→∞,得到如下:
f(t)=12a0+∞∑n=1ancos(nt)+∞∑n=1bnsin(nt)
这正是傅里叶级数。再次回想之前总结的,正交基向量前的系数就是信号在基向量上的投影和基向量模的比值,而内积则是投影乘以基向量模的大小,那么系数就是内积除以模的平方(也就是第一部分最后的那个公式)。所以我们随便挑出一个基cos(nt),那么它的模是多少呢?在这里再不严谨地推广一下,想象在[−π,π)上的一个基向量,k个等间隔采样的情况下,该向量的模就是每个采样值的平方和开根号。那么系数呢,就是内积除以模的平方,也就是内积除以基向量所有维上的平方和,如下:
an=⟨f,cos(nt)⟩|cos(nt)|2=⟨f,cos(nt)⟩⟨cos(nt),cos(nt)⟩=∑f(t)cos(nt)∑cos2(nt)
求和之后的比值和求平均之后的比值是一回事,所以又有如下:
an=1k∑f(t)cos(nt)1k∑cos2(nt)
事实上,上两个式子就已经能求出离散情况的近似系数了,不过更一般地,我们可以不严谨地推广一下到无限分割的情况,是不是就觉得眼熟了,又是积分(其实就是前面提到的连续函数内积):
an=π∫−πf(t)cos(nt)dtπ∫−πcos2(nt)dt
同样地利用积化和差公式π∫−πcos2(nt)dt的值不难求出来,反正我用Mathematica求了一下,答案是π,于是得到系数的表达式:
an=1ππ∫−πf(t)cos(nt)dt
类似的对sin(nt)项进行推导,也能得到:
bn=1ππ∫−πf(t)sin(nt)dt
推广到傅里叶变换
从傅里叶级数到傅里叶变换其实基本上就是教科书上那一套了,首先将2π周期推广到任一周期,然后到周期无穷大的推广(正交基的推广会比较复杂),同频率的sin和cos项合并,并引入复振幅和相位便于计算,还有离散情况的推广等等,和线性代数的关系不大,所以就不展开讲了。总之万变不离其宗,只要记住傅里叶分解之后的每个频率上的分量其实本质上就是投影;而各项相加或积分,本质上就是线性空间上的相加,一切就变得直观易懂了。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步