学习笔记:傅里叶变换

本文目的是方便地理解傅里叶变换,不一定要掌握原理和计算方法,只要会用即可。

一、傅里叶级数

任何周期函数都可以用正弦函数和余弦函数构成的无穷级数来表示,称为它的傅里叶级数,即:

f(t)=a02+n=1[ancos(nωt)+bnsin(nωt)]

也有另外一种写法:

f(t)=A0+n=1Ansin(nωt+ψn)

即分解为无数个余弦函数,带有各自的频率和相位。

傅里叶级数20230930
傅里叶级数

二、非周期函数的频率拆分

注意到傅里叶级数中的频率都是f(x)频率的倍数。随着f(x)的周期变大,其频率变小,那么傅里叶级数中的频率间隔变小。当T接近无限大,即f(x)没有周期时,傅里叶级数的频率会变得连续。也就是:
周期函数的频率组成是离散的;
非周期函数的频率组成是连续的。

周期函数与非周期函数的频率图

三、傅里叶级数的求法

其基础是三角函数的正交性:频率不同的三角函数(sin(nx)cos(mx))相乘在一个周期内(x从-π到π)的积分必定为0

傅里叶级数表达式为:

f(t)=c0+n=1cncos(nωt+φ)

an=cncosφ, bn=cnsinφ,可以变换成:

f(t)=c0+n=1[ancos(nωt)+bnsin(nωt)]

对上式两边同时乘上sin(kωt)并在一个周期上积分,得到:

0Tf(t)sin(kωt)dt=0Tc0sin(kωt)dt+0Tsin(kωt)n=1[ancos(nωt)+bnsin(nωt)]dt

根据三角函数的正交性,左边0Tf(t)sin(kωt)dt只剩k频率bk0Tsin(kωt)2dt等于bkT2;右边0Tc0sin(kωt)dt=0,也就得到了:

bn=2T0Tf(t)sin(nωt)dt

同理,

an=2T0Tf(t)cos(nωt)dt

变换回去,也就是:

cn=an2+bn2φ=arctan(bnan)

四、傅里叶级数的复数表示

根据欧拉公式,eiθ=cosθ+isinθ
利用cosθ是偶函数,sinθ是奇函数的性质,可以得到:

cosθ=eiθ+eiθ2, sinθ=eiθeiθ2i

带入傅里叶级数中,并化简,得到:

f(t)=c0+n=1[(anjbn)2ejnωt+(an+jbn)2ejnωt]

由于:
an=2T0Tf(t)cos(nωt)dt=anbn=2T0Tf(t)sin(nωt)dt=bn
An=(anjbn)2,可将上式化简为:

f(t)=n=Anejnωt

再次利用三角函数的正交性,向两边同时乘一个ejkωt,再在一个周期内积分,得到:

0Tf(t)ejkωtdt=0Tn=+Anej(nk)ωtdt

左边0Tf(t)ejkωtdt=0TAnejkωtejkωtdt=AkT
也就是:

An=1T0Tf(t)ejnωtdt

五、将T推向

ω=2πT0An不再是离散的,写成F(ω)。变为

f(t)=12πF(ω)eiωtdω

F(ω)=f(t)eiωtdt

(对其中怎么推的还不清楚)

六、用质心的思想理解傅里叶变换

eiωt看作是一个不停旋转的方向,其中w是超参数,t是自变量。那么f(t)eiωt就是向这个方向伸长了多少。随着自变量t的变化,f(t)将螺旋状地产生轨迹,那么上面的F(ω)就是在ω的转速下,f(t)形成的轨迹的质心。

傅里叶变换与质心

当原曲线和转速不匹配时,轨迹会相对均匀地分布,质心距离原点近;当原曲线和转速匹配时,轨迹就会偏向于某一边,质心距离原点远。

如果画出在不同转速下,质心与原点的距离,这样得到的曲线,就是它的频率的组成分析,也就是傅里叶变换(其实还是有点不一样的,因为得到的只是一个复数)。

七、图像的傅里叶变换

将离散的复数形式的傅里叶变换,进行相应改写:

F(u,v)=1MNx=0M1y=0N1f(x,y)ej2π(ux/M+vy/N)

(为什么e的幂直接是两个相加呢)
(如果我没有理解错的话,u[0,2M],v[0,2N]

这样,f(u,v)表示方向为从中心到(u,v),频率为(u,v)到中心的距离(具体是什么距离,我不清楚)的三角函数。是一个复数,包含了振幅和相位信息。(所以具有中心对称性是吧)

图片傅里叶变换-未中心化
图片傅里叶变换-未中心化-物理含义
图片傅里叶变换-中心化

实际上,应该分别画出实部和虚部才完整:

图像傅里叶变化及旋转

中心点是全图灰度的均值(其它位置我暂时还无法理解)


摘抄自:

  1. b站:【官方双语】形象展示傅里叶变换
  2. 知乎:傅里叶变换推导详解
  3. 知乎:通俗讲解:图像傅里叶变换

可供参考的:

posted @   white514  阅读(167)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示