傅里叶的噩梦你还记得吗--Fourier Transform
前言
还记得我以前讲过利用Python实现2D图像的FFT,当时原理部分死磕了好久,也是有很多小伙伴说根本看不懂这玩意。
其实FFT只是傅里叶变换的一种算法上的计算优化,FT才是基本的原理方法。
今天我们来以比较通俗易懂的方法来讲解一下最基本的傅氏级数,返璞归真,再过渡到一般的傅里叶变换原理。
很多网上的博客推文都用十分生动精美的建模或者图表来解释傅里叶变换,但是大家有没有觉得看的时候觉得“喔,我捂了”,但是过了一段时间,你也就忘记傅里叶变换到底具体是啥了,可能唯一有印象的就是那些图是做得真好!
所以,脱离数学原理的讲解都是不太接地气的!
话不多说,这就开始啦~(准备好了吗打工人!)
三角函数的正交性
数学上讲下面的一个集合
{ 1 , s i n x , c o s x , s i n 2 x , c o s 2 x , . . . , s i n n x , c o s n x } \{1,sin{x},cos{x},sin{2x},cos{2x},...,sin{nx},cos{nx}\} {1,sinx,cosx,sin2x,cos2x,...,sinnx,cosnx}
是一组完备正交集,简单来讲,就是在一个周期里,任意两个不同的元素的积分为0。 如:
∫ − π π s i n n x c o s m x d x = 0 \int_{-\pi}^{\pi}sinnx\ cosmx\ dx=0 ∫−ππsinnx cosmx dx=0
来验证一波(由积化和差公式):
∫ − π π s i n n x c o s m x d x = 1 2 ∫ − π π [ s i n ( n + m ) x ] + 1 2 ∫ − π π [ s i n ( n − m ) x ] = 0 \int_{-\pi}^{\pi}sinnx\ cosmx\ dx=\frac{1}{2}\int_{-\pi}^{\pi}[sin(n+m)x]+\frac{1}{2}\int_{-\pi}^{\pi}[sin(n-m)x]=0 ∫−ππsinnx cosmx dx=21∫−ππ[sin(n+m)x]+21∫−ππ[sin(n−m)x]=0
还有一种理解方式,结合矢量的正交性,就是把sinx或者cosx看成是n维向量,根据向量的正交公式:
a ⃗ = ( a 1 , a 2 , a 3 , . . . , a n ) b ⃗ = ( b 1 , b 2 , b 3 , . . . , b n ) a ⃗ ⋅ b ⃗ = ∑ i = 1 n a i b i = 0 \vec{a}=(a1,a2,a3,...,an)\\ \vec{b}=(b1,b2,b3,...,bn)\\ \vec{a}\cdot\vec{b}=\sum_{i=1}^{n}a_ib_i=0 a=(a1,a2,a3,...,an)b=(b1,b2,b3,...,bn)a⋅b=i=1∑naibi=0
无限分割加和的理念转为积分,便可以看成:
a ⃗ = f ( x ) b ⃗ = g ( x ) a ⃗ ⋅ b ⃗ = ∫ − ∞ + ∞ f ( x ) g ( x ) d x = 0 \vec{a}=f(x)\\ \vec{b}=g(x)\\ \vec{a}\cdot\vec{b}=\int_{-\infin}^{+\infin}f(x)g(x)dx=0 a=f(x)b=g(x)a⋅b=∫−∞+∞f(x)g(x)dx=0
是不是这样会更好理解一点呢?接下来我们来看看傅里叶级数~
Fourier级数
设有一以2π为周期的函数,根据傅里叶级数的定义,可以将其分解成无数个正余弦函数的线性叠加:
f ( x ) = f ( x + 2 π ) f ( x ) = ∑ n = 0 ∞ ( a n c o s n x + b n s i n n x ) f(x)=f(x+2\pi)\\ f(x)=\sum_{n=0}^{\infin}(a_ncosnx+b_nsinnx) f(x)=f(x+2π)f(x)=n=0∑∞(ancosnx+bnsinnx)
只要知道各个三角函数分量的系数是多少,我们就可以知道f(x)的级数表达形式啦
那怎么去求解这些系数呢,这就要用到我们之前讲的三角函数正交性的知识了
我们来看看如果将函数在一个周期里做积分,是不是就可以消去一部分的三角函数项呢
这里相当于各项乘1做周期内积分
∫ − π π f ( x ) d x = ∫ − π π a 0 c o o s 0 d x + ∫ − π π ∑ n = 1 ∞ ( a n c o s n x + b n s i n n x ) d x = ∫ − π π a 0 d x + ∑ n = 1 ∞ a n ∫ − π π c o s n x d x + ∑ n = 1 ∞ b n ∫ − π π s i n n x d x = 2 π a 0 + 0 + 0 = 2 π a 0 \begin{aligned} \int_{-\pi}^{\pi}f(x)dx &= \int_{-\pi}^{\pi}a_0coos0dx+\int_{-\pi}^{\pi}\sum_{n=1}^{\infin}(a_ncosnx+b_nsinnx)dx\\ &= \int_{-\pi}^{\pi}a_0dx+\sum_{n=1}^{\infin}a_n \int_{-\pi}^{\pi}cosnxdx+\sum_{n=1}^{\infin}b_n \int_{-\pi}^{\pi}sinnxdx\\ &= 2\pi a_0 + 0+0\\ &= 2\pi a_0 \end{aligned} ∫−ππf(x)dx=∫−ππa0coos0dx+∫−ππn=1∑∞(ancosnx+bnsinnx)dx=∫−ππa0dx+n=1∑∞an∫−ππcosnxdx+n=1∑∞bn∫−ππsinnxdx=2πa0+0+0=2πa0
其中后面两项可以看成是三角函数与1相乘的互为正交基积分,结果为0。所以我们得到a0的值为:
a 0 = 1 2 π ∫ − π π f ( x ) d x a_0=\frac{1}{2\pi}\int_{-\pi}^{\pi}f(x)dx a0=2π1∫−ππf(x)dx
有了上面的经验,我们可以利用等式左边乘上三角函数并作一个周期积分来求解傅里叶级数系数,
接下来我们通过乘 cos nx 的积分来求an的值
∫ − π π f ( x ) c o s n x d x = ∫ − π π a 0 c o s n x d x + ∫ − π π ∑ n = 1 ∞ a n c o s n x c o s n x d x + ∫ − π π ∑ n = 1 ∞ b n s i n n x c o s n x d x = ∫ − π π ∑ n = 1 ∞ a n c o s n x c o s n x d x = a n ∫ − π π c o s n x c o s n x d x = a n ∫ − π π c o s n 2 x d x = a n ∫ − π π 1 + c o s 2 n x 2 d x = π a n ∴ a n = 1 π ∫ − π π f ( x ) c o s n x d x \begin{aligned} \int_{-\pi}^{\pi}f(x)cosnxdx &=\int_{-\pi}^{\pi}a_0cosnxdx+ \int_{-\pi}^{\pi}\sum_{n=1}^{\infin}a_ncosnxcosnxdx+ \int_{-\pi}^{\pi}\sum_{n=1}^{\infin}b_nsinnxcosnxdx\\ &= \int_{-\pi}^{\pi}\sum_{n=1}^{\infin}a_ncosnxcosnxdx\\ &= a_n\int_{-\pi}^{\pi}cosnxcosnxdx\\ &= a_n\int_{-\pi}^{\pi}cosn^2xdx\\ &= a_n\int_{-\pi}^{\pi}\frac{1+cos2nx}{2}dx\\ &= \pi a_n\\ \therefore \ \ a_n&=\frac{1}{\pi}\int_{-\pi}^{\pi}f(x)cosnxdx \end{aligned} ∫−ππf(x)cosnxdx∴ an=∫−ππa0cosnxdx+∫−ππn=1∑∞ancosnxcosnxdx+∫−ππn=1∑∞bnsinnxcosnxdx=∫−ππn=1∑∞ancosnxcosnxdx=an∫−ππcosnxcosnxdx=an∫−ππcosn2xdx=an∫−ππ21+cos2nxdx=πan=π1∫−ππf(x)cosnxdx
同理我们可以用一样的方法来求解bn:
b n = 1 π ∫ − π π f ( x ) s i n n x d x b_n=\frac{1}{\pi}\int_{-\pi}^{\pi}f(x)sinnxdx bn=π1∫−ππf(x)sinnxdx
这样我们便得到了傅里叶级数的表达式:
f
(
x
)
=
a
0
2
+
∑
n
=
1
∞
a
n
c
o
s
n
x
+
∑
n
=
1
∞
b
n
s
i
n
n
x
a
0
=
1
π
∫
−
π
π
f
(
x
)
d
x
a
n
=
1
π
∫
−
π
π
f
(
x
)
c
o
s
n
x
d
x
b
n
=
1
π
∫
−
π
π
f
(
x
)
s
i
n
n
x
d
x
\begin{aligned} f(x) &= \frac{a_0}{2}+\sum_{n=1}^{\infin}a_ncosnx + \sum_{n=1}^{\infin}b_nsinnx\\ a_0 &=\frac{1}{\pi}\int_{-\pi}^{\pi}f(x)dx\\ a_n &= \frac{1}{\pi}\int_{-\pi}^{\pi}f(x)cosnxdx\\ b_n &= \frac{1}{\pi}\int_{-\pi}^{\pi}f(x)sinnxdx \end{aligned}
f(x)a0anbn=2a0+n=1∑∞ancosnx+n=1∑∞bnsinnx=π1∫−ππf(x)dx=π1∫−ππf(x)cosnxdx=π1∫−ππf(x)sinnxdx
现在我们知道了周期为2π的函数傅里叶展开,但是平时遇到的函数的周期不一定是2π,那该如何展开呢?
周期为2L的函数Fourier级数展开
设有一周期为2L的函数:
f ( t ) = f ( t + 2 L ) f(t)=f(t+2L) f(t)=f(t+2L)
既然傅里叶级数展开的基是三角系,那其周期就还是2π,我们需要做一个坐标的映射:
x = π L t t = L π x f ( t ) = f ( L π x ) ≜ g ( x ) = g ( x + 2 π ) x=\frac{\pi}{L}t\\ \, \\ t=\frac{L}{\pi}x\\ \, \\ f(t)=f(\frac{L}{\pi}x)\triangleq g(x)=g(x+2\pi) x=Lπtt=πLxf(t)=f(πLx)≜g(x)=g(x+2π)
做了以上的换元之后,我们可以看到,当t取2L时,x取2π,即将周期2L映射到了2π
根据映射关系和之前的系数表达式,我们有:
c o s n x = c o s n π L t s i n n x = s i n n π L t g ( x ) = f ( t ) ∫ − π π d x = ∫ − L L d ( π L t ) 1 π ∫ − π π d x = 1 L ∫ − L L d t cosnx=cos\frac{n\pi}{L}t\\ \, \\ sinnx=sin\frac{n\pi}{L}t\\ \, \\ g(x)=f(t)\\ \, \\ \int_{-\pi}^{\pi}dx=\int_{-L}^{L}d(\frac{\pi}{L}t)\\ \, \\ \frac{1}{\pi}\int_{-\pi}^{\pi}dx=\frac{1}{L}\int_{-L}^{L}dt cosnx=cosLnπtsinnx=sinLnπtg(x)=f(t)∫−ππdx=∫−LLd(Lπt)π1∫−ππdx=L1∫−LLdt
所以得到可以关于t的傅里叶系数表达式:
g ( x ) = a 0 2 + ∑ n = 1 ∞ a n c o s n x + ∑ n = 1 ∞ b n s i n n x a 0 = 1 π ∫ − π π g ( x ) d x = 1 L ∫ − L L f ( t ) d t a n = 1 π ∫ − π π g ( x ) c o s n x d x = 1 L ∫ − L L f ( t ) c o s n π L t d t b n = 1 π ∫ − π π g ( x ) s i n n x d x = 1 L ∫ − L L f ( t ) s i n n π L t d t \begin{aligned} g(x) &= \frac{a_0}{2}+\sum_{n=1}^{\infin}a_ncosnx + \sum_{n=1}^{\infin}b_nsinnx\\ a_0 &=\frac{1}{\pi}\int_{-\pi}^{\pi}g(x)\ dx= \frac{1}{L}\int_{-L}^{L}f(t)\ dt\\ a_n &= \frac{1}{\pi}\int_{-\pi}^{\pi}g(x)cosnxdx= \frac{1}{L}\int_{-L}^{L} f(t)\ cos\frac{n\pi}{L}t\ dt\\ b_n &= \frac{1}{\pi}\int_{-\pi}^{\pi}g(x)sinnxdx =\frac{1}{L}\int_{-L}^{L} f(t)\ sin\frac{n\pi}{L}t\ dt\\ \end{aligned} g(x)a0anbn=2a0+n=1∑∞ancosnx+n=1∑∞bnsinnx=π1∫−ππg(x) dx=L1∫−LLf(t) dt=π1∫−ππg(x)cosnxdx=L1∫−LLf(t) cosLnπt dt=π1∫−ππg(x)sinnxdx=L1∫−LLf(t) sinLnπt dt
工程上,t一般是大于0的,令周期T=2L,则有:
ω
=
2
π
T
=
π
L
\omega=\frac{2\pi}{T}=\frac{\pi}{L}
ω=T2π=Lπ
傅里叶展开相应变成我们熟悉的形式:
f
(
t
)
=
a
0
2
+
∑
n
=
1
∞
a
n
c
o
s
n
ω
t
+
∑
n
=
1
∞
b
n
s
i
n
n
ω
t
a
0
=
2
T
∫
0
T
f
(
t
)
d
t
a
n
=
2
T
∫
0
T
f
(
t
)
c
o
s
n
ω
t
d
t
b
n
=
2
T
∫
0
T
f
(
t
)
s
i
n
n
ω
t
d
t
\begin{aligned} f(t) &= \frac{a_0}{2}+\sum_{n=1}^{\infin}a_ncosn\omega t+ \sum_{n=1}^{\infin}b_nsinn\omega t\\ a_0 &=\frac{2}{T}\int_{0}^{T}f(t)\ dt\\ a_n &= \frac{2}{T}\int_{0}^{T}f(t)\ cos n\omega t\ dt\\ b_n &= \frac{2}{T}\int_{0}^{T}f(t)\ sin n\omega t\ dt\\ \end{aligned}
f(t)a0anbn=2a0+n=1∑∞ancosnωt+n=1∑∞bnsinnωt=T2∫0Tf(t) dt=T2∫0Tf(t) cosnωt dt=T2∫0Tf(t) sinnωt dt
到此,我们便讲完了直角坐标系下的傅里叶级数展开,小伙伴是不是还记得课本里形式简洁的复数展开形式
没错,我们也要来讲一下,撑住!
复数形式的Fourier展开
复数形式的展开不得不提到最美数学公式之一啦,就是辣个令人又爱又恨的蓝人——欧拉公式:
e
i
θ
=
c
o
s
θ
+
i
s
i
n
θ
e^{i\theta}=cos\theta+i\ sin \theta
eiθ=cosθ+i sinθ
接下来是推导暴击,大招已经CD完毕:
∵ c o s θ = 1 2 ( e i θ + e − i θ ) , s i n θ = − i 2 ( e i θ − e − i θ ) ∴ f ( t ) = a 0 2 + ∑ n = 1 ∞ [ a n c o s n ω t + b n s i n n ω t ] = a 0 2 + ∑ n = 1 ∞ [ a n 2 ( e i n ω t + e − i n ω t ) − i b n 2 ( e i n ω t − e − i n ω t ) ] = a 0 2 + ∑ n = 1 ∞ ( a n − i b n 2 e i n ω t + a n + i b n 2 e − i n ω t ) = a 0 2 + ∑ n = 1 ∞ a n − i b n 2 e i n ω t + ∑ n = 1 ∞ a n + i b n 2 e − i n ω t = a 0 2 + ∑ n = 1 ∞ a n − i b n 2 e i n ω t + ∑ n = − ∞ − 1 a − n + i b − n 2 e i n ω t = ∑ n = 0 0 a 0 2 e i n ω t + ∑ n = 1 ∞ a n − i b n 2 e i n ω t + ∑ n = − ∞ − 1 a − n + i b − n 2 e i n ω t \begin{aligned} \because cos\theta &=\frac{1}{2}(e^{i\theta}+e^{-i\theta})\,, sin\theta=-\frac{i}{2}(e^{i\theta}-e^{-i\theta})\\ \therefore f(t) &= \frac{a_0}{2}+\sum_{n=1}^{\infin}\ [a_ncosn\omega t+ b_nsinn\omega t]\\ &= \frac{a_0}{2}+\sum_{n=1}^{\infin}\ [\frac{a_n}{2}(e^{in\omega t}+e^{-in\omega t})- \frac{i\ b_n}{2}(e^{in\omega t}-e^{-in\omega t})]\\ &= \frac{a_0}{2}+\sum_{n=1}^{\infin}\ (\frac{a_n-i\ b_n}{2}e^{in\omega t}+ \frac{a_n+i\ b_n}{2}e^{-in\omega t})\\ &= \frac{a_0}{2}+\sum_{n=1}^{\infin}\ \frac{a_n-i\ b_n}{2}e^{in\omega t}+\sum_{n=1}^{\infin}\ \frac{a_n+i\ b_n}{2}e^{-in\omega t}\\ &= \frac{a_0}{2}+\sum_{n=1}^{\infin}\ \frac{a_n-i\ b_n}{2}e^{in\omega t}+\sum_{n=-\infin}^{-1}\ \frac{a_{-n}+i\ b_{-n}}{2}e^{in\omega t}\\ &= \sum_{n=0}^{0}\ \frac{a_0}{2} e^{in\omega t}+\sum_{n=1}^{\infin}\ \frac{a_n-i\ b_n}{2}e^{in\omega t}+\sum_{n=-\infin}^{-1}\ \frac{a_{-n}+i\ b_{-n}}{2}e^{in\omega t}\\ \end{aligned} ∵cosθ∴f(t)=21(eiθ+e−iθ),sinθ=−2i(eiθ−e−iθ)=2a0+n=1∑∞ [ancosnωt+bnsinnωt]=2a0+n=1∑∞ [2an(einωt+e−inωt)−2i bn(einωt−e−inωt)]=2a0+n=1∑∞ (2an−i bneinωt+2an+i bne−inωt)=2a0+n=1∑∞ 2an−i bneinωt+n=1∑∞ 2an+i bne−inωt=2a0+n=1∑∞ 2an−i bneinωt+n=−∞∑−1 2a−n+i b−neinωt=n=0∑0 2a0einωt+n=1∑∞ 2an−i bneinωt+n=−∞∑−1 2a−n+i b−neinωt
可以发现复数形式的傅里叶级数展开形式是高度统一的,所以我们可以汇总成以下的简介表达:
f ( t ) = ∑ − ∞ ∞ C n e i n ω t C n = 1 T ∫ 0 T f ( t ) e − i n ω t d t f(t)=\sum_{-\infin}^{\infin}C_n \ e^{in\omega t}\\ \, \\ C_n=\frac{1}{T}\int_{0}^{T}f(t)\ e^{-in\omega t}\ dt f(t)=−∞∑∞Cn einωtCn=T1∫0Tf(t) e−inωt dt
以上便是复数域的傅里叶变换了,可以看到形式十分简洁统一,下面来到我们的最后一个方面,就是对于
非周期函数该怎么进行傅里叶展开呢?
傅里叶变换
由上面的推导与验证,我们可以得到复数域的傅里叶级数:
f ( t ) = ∑ − ∞ ∞ C n e i n ω 0 t C n = 1 T ∫ − T 2 T 2 f ( t ) e − i n ω 0 t d t f(t)=\sum_{-\infin}^{\infin}C_n \ e^{in\omega_0 t}\\ \, \\ C_n=\frac{1}{T}\int_{-\frac{T}{2}}^{\frac{T}{2}}f(t)\ e^{-in\omega_0 t}\ dt f(t)=−∞∑∞Cn einω0tCn=T1∫−2T2Tf(t) e−inω0t dt
其中w0为基频,对于非周期函数,我们可以认为其周期为∞,则有:
Δ ω = 2 π T T ↑ Δ ω ↓ T → ∞ : ∫ − T 2 T 2 d t → ∫ − ∞ ∞ d t n ω 0 → w ∑ n = − ∞ ∞ Δ ω → ∫ − ∞ ∞ d ω \Delta\omega=\frac{2\pi}{T}\\ \, \\ T \uparrow \ \Delta\omega \downarrow \\ \, \\ T \rightarrow \infin:\\ \, \\ \int_{-\frac{T}{2}}^{\frac{T}{2}} \ dt \rightarrow \int_{-\infin}^{\infin} \ dt\\ \, \\ n\omega_0 \rightarrow w\\ \, \\ \sum_{n=-\infin}^{\infin}\Delta\omega \rightarrow \int_{-\infin}^{\infin} \ d\omega Δω=T2πT↑ Δω↓T→∞:∫−2T2T dt→∫−∞∞ dtnω0→wn=−∞∑∞Δω→∫−∞∞ dω
我们对原级数展开式进行上面的转换:
f T ( t ) = ∑ − ∞ ∞ C n e i n ω 0 t = ∑ − ∞ ∞ 1 T ∫ − T 2 T 2 f ( t ) e − i n ω 0 t d t e i n ω 0 t = ∑ − ∞ ∞ Δ ω 2 π ∫ − T 2 T 2 f ( t ) e − i n ω 0 t d t e i n ω 0 t d ω = 1 2 π ∫ − ∞ ∞ ∫ − ∞ ∞ f ( t ) e − i ω t d t e i ω t d ω \begin{aligned} f_T(t)&=\sum_{-\infin}^{\infin}C_n \ e^{in\omega_0 t}\\ &=\sum_{-\infin}^{\infin} \frac{1}{T}\int_{-\frac{T}{2}}^{\frac{T}{2}}f(t)\ e^{-in\omega_0 t}\ dt \ e^{in\omega_0 t}\\ &=\sum_{-\infin}^{\infin} \frac{\Delta\omega}{2\pi}\int_{-\frac{T}{2}}^{\frac{T}{2}}f(t)\ e^{-in\omega_0 t}\ dt \ e^{in\omega_0 t}\ d\omega\\ &=\frac{1}{2\pi} \int_{-\infin}^{\infin} \ \int_{-\infin}^{\infin}f(t)\ e^{-i\omega t}\ dt\ e^{i\omega t}\ d\omega \end{aligned} fT(t)=−∞∑∞Cn einω0t=−∞∑∞T1∫−2T2Tf(t) e−inω0t dt einω0t=−∞∑∞2πΔω∫−2T2Tf(t) e−inω0t dt einω0t dω=2π1∫−∞∞ ∫−∞∞f(t) e−iωt dt eiωt dω
于是我们得到傅里叶变换的正反变换:
F ( ω ) = ∫ − ∞ ∞ f ( t ) e − i ω t d t f ( t ) = 1 2 π ∫ − ∞ ∞ F ( w ) e i ω t d ω \begin{aligned} F(\omega)&=\int_{-\infin}^{\infin}f(t)\ e^{-i\omega t}\ dt\\ f(t)&=\frac{1}{2\pi} \int_{-\infin}^{\infin} \ F(w)\ e^{i\omega t}\ d\omega \end{aligned} F(ω)f(t)=∫−∞∞f(t) e−iωt dt=2π1∫−∞∞ F(w) eiωt dω
总结
傅里叶变换是理工科里不可或缺的一个重要分析工具,掌握其原理及其使用方法有助于我们转换分析思路,例如时域到频域的变换,小波分析,傅里叶光谱分析法等。
期待你的反馈与建议,也希望如果对你有所帮助不吝三连~
Reference
[1] Fourier的噩梦,你还记得吗