强烈推荐“掐死教程”
傅里叶变换是数字信号处理中最基本的方法之一,是沟通时域和频域的桥梁。本文试图用通俗语言对傅里叶分析中常见的一些难点加以解释,更严格的公式推导和几何证明在知乎上有更多的大神解答,翻看知乎上多位大神的解答,大体分为两类:一派是以“掐死教程”为代表的图形派,包含大量的图形动画辅助理解;另一派是公式派,其内容是对公式进行严格的推导、证明。而这两派中对一些关键性的细节默认为常识并不加以解释,而这些细节问题对整个问题的理解产生障碍。这篇文章更多的从信号处理的初学者角度出发,解释傅里叶变换的同时对一些相对“弱智”但又非常关键的问题进行讨论。
0.傅里叶级数(FS)
在讨论傅里叶变换之前,首先要解释“正交基”这一概念。在平面直角坐标系下,任意一个向量均能用单位向量x、y表示。其中“正交”的意思是表示向量的基底之间的内积为零,在二维空间下,两个相互垂直的向量即为正交。
一个通俗的例子是计算机中对颜色的表示,任意颜色的光均可由三基色红色、绿色、蓝色的叠加来表示。
在这个例子中,红色、绿色、蓝色为三个正交基。
那么对于任意的一维信号,是否也能表示为正交基的线性组合呢?如果可以,正交基是什么?
根据让·巴普蒂斯·约瑟夫·傅里叶男爵的猜测,任意的周期函数均能表示成不同频率的正弦函数和余弦函数的线性组合,假设周期为T的信号x(t),可表示为:
x ( t ) = C + ∑ n = 1 ∞ [ a n cos ( n ω 0 t ) + b n sin ( n ω 0 t ) ] x\left(t\right)=C+\sum_{n=1}^{\infty}\left[a_n\cos{\left(n\omega_0t\right)}+b_n\sin{\left(n\omega_0t\right)}\right] x(t)=C+n=1∑∞[ancos(nω0t)+bnsin(nω0t)](1)
式中 ω 0 = 2 π / T \omega_0=2\pi/T ω0=2π/T式为信号x(t)的傅里叶级数表示,这里, [ 1 , c o s ( ω 0 ) , c o s ( 2 ω 0 t ) , … , c o s ( n ω 0 t ) , s i n ( ω 0 t ) , s i n ( 2 ω 0 t ) , … , s i n ( n ω 0 t ) ] [1,cos(\omega_0), cos(2\omega_0t),…,cos(n\omega_0t),sin(\omega_0t),sin(2\omega_0t),…,sin(n\omega_0t)] [1,cos(ω0),cos(2ω0t),…,cos(nω0t),sin(ω0t),sin(2ω0t),…,sin(nω0t)]为一组正交基,其正交性可由三角函数的三个性质证明:
∫ t 0 t 0 + k T sin ( n ω 0 t ) sin ( m ω 0 t ) = 0 \int_{t_0}^{t_0+kT}{\sin{\left(n\omega_0t\right)}\sin{\left(m\omega_0t\right)}}=0 ∫t0t0+kTsin(nω0t)sin(mω0t)=0,m、n为自然数,m≠n
∫ t 0 t 0 + k T cos ( n ω 0 t ) cos ( m ω 0 t ) = 0 \int_{t_0}^{t_0+kT}{\cos{\left(n\omega_0t\right)}\cos{\left(m\omega_0t\right)}}=0 ∫t0t0+kTcos(nω0t)cos(mω0t)=0,m、n为自然数,m≠n
∫ t 0 t 0 + k T sin ( n ω 0 t ) cos ( m ω 0 t ) = 0 \int_{t_0}^{t_0+kT}{\sin{\left(n\omega_0t\right)}\cos{\left(m\omega_0t\right)}}=0 ∫t0t0+kTsin(nω0t)cos(mω0t)=0,m、n为自然数
根据上式, [ 1 , c o s ( ω 0 ) , c o s ( 2 ω 0 t ) , … , c o s ( n ω 0 t ) , s i n ( ω 0 t ) , s i n ( 2 ω 0 t ) , … , s i n ( n ω 0 t ) ] [1,cos(\omega_0), cos(2\omega_0t),…,cos(n\omega_0t),sin(\omega_0t),sin(2\omega_0t),…,sin(n\omega_0t)] [1,cos(ω0),cos(2ω0t),…,cos(nω0t),sin(ω0t),sin(2ω0t),…,sin(nω0t)]中任意两个元素在信号周期内积分为0,满足正交条件。
那么对于未知的信号x(t),如何确定各个基的系数C、 a n a_n an、 b n b_n bn呢?还是根据正交性。
首先确定直流分量C,在信号的最小周期内对式1两边取定积分得:
∫ 0 T x ( t ) d t = ∫ 0 T C d t + ∫ 0 T ∑ n = 1 ∞ [ a n cos ( n ω 0 t ) + b n sin ( n ω 0 t ) ] d t \int_{0}^{T}x\left(t\right)dt=\int_{0}^{T}Cdt+\int_{0}^{T}{\sum_{n=1}^{\infty}\left[a_n\cos{\left(n\omega_0t\right)}+b_n\sin{\left(n\omega_0t\right)}\right]dt} ∫0Tx(t)dt=∫0TCdt+∫0Tn=1∑∞[ancos(nω0t)+bnsin(nω0t)]dt
等式右侧第二项中,根据三角函数的性质,在任意周期内对sin和cos的定积分均为0。则有:
∫ 0 T x ( t ) d t = ∫ 0 T C d t \int_{0}^{T}x\left(t\right)dt=\int_{0}^{T}Cdt ∫0Tx(t)dt=∫0TCdt
C = 1 T ∫ 0 T x ( t ) d t C=\frac{1}{T}\int_{0}^{T}x\left(t\right)dt C=T1∫0Tx(t)dt
接下来求 a n a_n an和 b n b_n bn:
式1两侧同乘 s i n ( m ω 0 t ) sin(m\omega_0t) sin(mω0t),在[0,T]区间取定积分:
∫ 0 T x ( t ) ∙ sin ( m ω 0 t ) d t = ∫ 0 T C ∙ sin ( m ω 0 t ) d t + ∫ 0 T ∑ n = 1 ∞ [ a n cos ( n ω 0 t ) ∙ sin ( m ω 0 t ) + b n sin ( n ω 0 t ) ∙ sin ( m ω 0 t ) ] d t \int_{0}^{T}{x\left(t\right)\bullet\sin(m\omega_0t)}dt =\int_{0}^{T}{C\bullet\sin(m\omega_0t)dt}+\int_{0}^{T}{\sum_{n=1}^{\infty}\left[a_n\cos{\left(n\omega_0t\right)\bullet\sin(m\omega_0t)}+b_n\sin{\left(n\omega_0t\right)\bullet\sin(m\omega_0t)}\right]dt} ∫0Tx(t)∙sin(mω0t)dt=∫0TC∙sin(mω0t)dt+∫0Tn=1∑∞[ancos(nω0t)∙sin(mω0t)+bnsin(nω0t)∙sin(mω0t)]dt
上式中,根据正交性质:
∫ 0 T C ∙ sin ( m ω 0 t ) d t ≡ 0 \int_{0}^{T}{C\bullet\sin{\left(m\omega_0t\right)dt}}\equiv0 ∫0TC∙sin(mω0t)dt≡0
∫ 0 T ∑ n = 1 ∞ [ a n sin ( n ω 0 t ) ∙ cos ( m ω 0 t ) ] d t ≡ 0 \int_{0}^{T}{\sum_{n=1}^{\infty}\left[a_n\sin{\left(n\omega_0t\right)\bullet\cos(m\omega_0t)}\right]dt}\equiv0 ∫0Tn=1∑∞[ansin(nω0t)∙cos(mω0t)]dt≡0
对于 ∫ 0 T ∑ n = 1 ∞ [ b n sin ( n ω 0 t ) ∙ sin ( m ω 0 t ) ] d t \int_{0}^{T}\sum_{n=1}^{\infty}\left[b_n\sin{\left(n\omega_0t\right)\bullet\sin(m\omega_0t)}\right]dt ∫0T∑n=1∞[bnsin(nω0t)∙sin(mω0t)]dt当且仅当m=n是积分不为0,当m=n时有:
∫ 0 T ∑ n = 1 ∞ [ b n sin ( n ω 0 t ) ∙ sin ( m ω 0 t ) ] d t = ∫ 0 T b n sin 2 ( n ω 0 t ) d t = b n 2 ∫ 0 T ( 1 − c o s ( 2 n ω 0 t ) ) d t = b n 2 T \int_{0}^{T}{\sum_{n=1}^{\infty}\left[b_n\sin{\left(n\omega_0t\right)\bullet\sin{\left(m\omega_0t\right)}}\right]dt} =\int_{0}^{T}{b_n\sin^2\left(n\omega_0t\right)dt} =\frac{b_n}{2}\int_{0}^{T}\left(1-cos\left(2n\omega_0t\right)\right)dt=\frac{b_n}{2}T ∫0Tn=1∑∞[bnsin(nω0t)∙sin(mω0t)]dt=∫0Tbnsin2(nω0t)dt=2bn∫0T(1−cos(2nω0t))dt=2bnT
带入式 得:
b n = 2 T ∫ 0 T x ( t ) ∙ sin ( m ω 0 t ) d t b_n=\frac{2}{T}\int_{0}^{T}{x\left(t\right)\bullet\sin(m\omega_0t)}dt bn=T2∫0Tx(t)∙sin(mω0t)dt
同理,式1两侧同乘 c o s ( m ω 0 t ) cos(m\omega_0t) cos(mω0t),即可求出 a n a_n an得:
a n = 2 T ∫ 0 T x ( t ) ∙ cos ( m ω 0 t ) d t a_n=\frac{2}{T}\int_{0}^{T}{x\left(t\right)\bullet\cos(m\omega_0t)}dt an=T2∫0Tx(t)∙cos(mω0t)dt
至此,常数C、 a n a_n an和 b n b_n bn已被计算求得,周期x(t)可由频率不同的正弦函数和余弦函数唯一表示。
但是。。。。。
在大多数的教材中,傅里叶级数是这样表示的:
x ( t ) = ∑ n = − ∞ + ∞ c n e i n ω 0 t x\left(t\right)=\sum_{n=-\infty}^{+\infty}{c_ne^{in\omega_0t}} x(t)=n=−∞∑+∞cneinω0t
???
相信对于刚刚入门信号处理的童鞋来说,这个公式具有很强的劝退效果(手动捂脸!)。
其实呢,部分童鞋对于这个等式的疑惑主要有两点:
说好的用sin和cos表示呢?咋还不见了呢?
怎么还整出来了复数?
首先介绍一下被称为“上帝公式”的欧拉公式:
e i θ = c o s θ + i s i n θ e^iθ=cosθ+isinθ eiθ=cosθ+isinθ
它将三角函数和复指数函数结合了起来,关于它的推导过程和几何涵义,详见传送门:
那么根据欧拉公式,我们很容易将sin和cos用复指数形式表示:
s i n θ = e i θ − e − i θ 2 i sin\theta=\frac{e^{i\theta}-e^{-i\theta}}{2i} sinθ=2ieiθ−e−iθ
c o s θ = e i θ + e − i θ 2 cos\theta=\frac{e^{i\theta}+e^{-i\theta}}{2} cosθ=2eiθ+e−iθ
傅里叶级数变为:
x ( t ) = C + ∑ n = 1 ∞ [ a n cos ( n ω 0 t ) + b n sin ( n ω 0 t ) ] x\left(t\right)=C+\sum_{n=1}^{\infty}\left[a_n\cos{\left(n\omega_0t\right)}+b_n\sin{\left(n\omega_0t\right)}\right] x(t)=C+n=1∑∞[ancos(nω0t)+bnsin(nω0t)]
= C + ∑ n = 1 ∞ [ a n ( e i n ω 0 t + e − i n ω 0 t ) 2 + b n ( e i n ω 0 t − e − i n ω 0 t ) 2 i ] =C+\sum_{n=1}^{\infty}\left[\frac{a_n\left(e^{in\omega_0t}+e^{-in\omega_0t}\right)}{2}+\frac{b_n\left(e^{in\omega_0t}-e^{-in\omega_0t}\right)}{2i}\right] =C+n=1∑∞[2an(einω0t+e−inω0t)+2ibn(einω0t−e−inω0t)]
= C + ∑ n = 1 ∞ [ a n ( e i n ω 0 t + e − i n ω 0 t ) 2 − b n i ( e i n ω 0 t − e − i n ω 0 t ) 2 ] =C+\sum_{n=1}^{\infty}\left[\frac{a_n\left(e^{in\omega_0t}+e^{-in\omega_0t}\right)}{2}-\frac{b_ni\left(e^{in\omega_0t}-e^{-in\omega_0t}\right)}{2}\right] =C+n=1∑∞[2an(einω0t+e−inω0t)−2bni(einω0t−e−inω0t)]
= C + ∑ n = 1 ∞ [ ( a n − i b n 2 ) e i n ω 0 t + ( a n + i b n 2 ) e − i n ω 0 t ] =C+\sum_{n=1}^{\infty}\left[\left(\frac{a_n-ib_n}{2}\right)e^{in\omega_0t}+(\frac{a_n+ib_n}{2})e^{-in\omega_0t}\right] =C+n=1∑∞[(2an−ibn)einω0t+(2an+ibn)e−inω0t]
= C + ∑ n = 1 ∞ [ ( a n − i b n 2 ) e i n ω 0 t ] + ∑ n = − 1 − ∞ [ ( a − n + i b − n 2 ) e i n ω 0 t ] =C+\sum_{n=1}^{\infty}\left[\left(\frac{a_n-ib_n}{2}\right)e^{in\omega_0t}\right]+\sum_{n=-1}^{-\infty}\left[(\frac{a_{-n}+ib_{-n}}{2})e^{in\omega_0t}\right] =C+n=1∑∞[(2an−ibn)einω0t]+n=−1∑−∞[(2a−n+ib−n)einω0t]
令C= c 0 c_0 c0,则有:
x ( t ) = ∑ n = − ∞ + ∞ c n e i n ω 0 t x\left(t\right)=\sum_{n=-\infty}^{+\infty}{c_ne^{in\omega_0t}} x(t)=n=−∞∑+∞cneinω0t
其中:
c n = { C n = 0 a n − b n i 2 n > 0 a ∣ n ∣ + b ∣ n ∣ i 2 n < 0 c_n=\left\{\begin{matrix}C&n=0\\\frac{a_n-b_ni}{2}&n>0\\\frac{a_{\left|n\right|}+b_{\left|n\right|}i}{2}&n<0\\\end{matrix}\right. cn=⎩⎨⎧C2an−bni2a∣n∣+b∣n∣in=0n>0n<0
可见由复指数形式表示时,系数 c n c_n cn为复数,与三角函数类似, e i n ω 0 t e^{in\omega_0t} einω0t也具有正交性,在这里就不证明了,那么有:
c n = 1 T ∫ 0 T x ( t ) e − i n ω 0 t d t c_n=\frac{1}{T}\int_{0}^{T}x\left(t\right)e^{-in\omega_0t}dt cn=T1∫0Tx(t)e−inω0tdt
为什么非得用复指数表示呢?有什么优点?
我们知道,在使用三角函数表示时,正交基包括正弦和余弦函数,在同一角频率 n ω 0 n\omega_0 nω0下,对应的正交基有 s i n ( n ω 0 t ) sin(n\omega_0t) sin(nω0t)和 c o s ( n ω 0 t ) cos(n\omega_0t) cos(nω0t),首先思考一个问题,为什么要同时使用sin和cos作为正交基,单独使用sin或cos不可以吗?
当然不可以,因为有要考虑相位的因素,举个最简单的例子,对于具有初相位的函数 x ( t ) = s i n ( n ω 0 t + π / 3 ) x(t)=sin(n\omega_0t+π/3) x(t)=sin(nω0t+π/3),如果只用 s i n n ω 0 t sinn\omega_0t sinnω0t或者 c o s n ω 0 t cosn\omega_0t cosnω0t表示,是无论如何无法做到的。而同时使用 s i n n ω 0 t sinn\omega_0t sinnω0t和 c o s n ω 0 t cosn\omega_0t cosnω0t即可轻松表示:
x ( t ) = 0.5 s i n ω 0 t + 3 2 c o s ω 0 t x(t)=0.5sin\omega_0t+\frac{\sqrt3}{2}cos\omega_0t x(t)=0.5sinω0t+23cosω0t
那么如果使用三角函数表示傅里叶级数的话,应该包括正弦谱和余弦谱。而通常情况下,我们并不关心在分析的频率中包含“正弦”和“余弦”的值分别为多少,更多的是关心分析频率的总体幅值,还是对于上述信号x(t),如果只知道在角频率为 ω 0 \omega_0 ω0时其正弦分量为0.5,余弦分量为 3 2 \frac{\sqrt3}{2} 23,那么也可以算出包含频率为 ω 0 \omega_0 ω0信号的总幅值为 0.5 2 + ( 3 2 ) 2 = 1 \sqrt{
{0.5}^2+{(\frac{\sqrt3}{2})}^2}=1 0.52+(23)2=1。但这样做过于繁琐,绘出的频谱图不直观。而使用复指数描述时, c n c_n cn为复数,其模即能表示角频率 n ω 0 n\omega_0 nω0谐波的幅值,而 c n c_n cn在复平面上与实轴的夹角 a r c t a n b n a n arctan\frac{b_n}{a_n} arctananbn为相位角。这样,用信号的幅值谱和相位谱代替正弦谱和余弦谱,在分析结果上更加直观。
1.傅里叶变换(FT)、离散傅里叶级数(DFS)、离散傅里叶变换(DFT)、离散时间傅里叶变换(DTFT)
1.0 傅里叶变换
在傅里叶级数中,分析对象要求是周期性信号,那么对于非周期信号如何处理?其实非周期信号也可以看成是周期无限大的周期信号,在复指数表示的傅里叶级数公式中:
x ( t ) = ∑ n = − ∞ + ∞ c n e i n ω 0 t x\left(t\right)=\sum_{n=-\infty}^{+\infty}{c_ne^{in\omega_0t}} x(t)=n=−∞∑+∞cneinω0t
假设x(t)的周期为1,基频 ω 0 = 2 π \omega_0=2π ω0=2π,那么频谱成分为 [ 0 , ± 2 π , ± 4 π , … , ± 2 n π ] [0,±2π,±4π,…,±2nπ] [0,±2π,±4π,…,±2nπ];
如果将x(t)的周期变为2,则基频 ω 0 = π \omega_0=π ω0=π,那么频谱成分相应变为 [ 0 , ± π , ± π , … , ± n π ] [0,±π,±π,…,±nπ] [0,±π,±π,…,±nπ]。
可以看出,如果仅改变分析信号的周期,则其频率间隔变小、频率成分看起来更加“密集”。当周期变为无穷大时,此时频率间隔无穷小,频谱为连续值,这就是信号的傅里叶变换。其基本思路可参考下图:
此图出处:(侵删)
公式如下:
x ( t ) = ∑ n = − ∞ + ∞ c n e i n ω 0 t = ∑ n = − ∞ + ∞ c n e i n 2 π T t x\left(t\right)=\sum_{n=-\infty}^{+\infty}{c_ne^{in\omega_0t}}=\sum_{n=-\infty}^{+\infty}{c_ne^{in\frac{2\pi}{T}t}} x(t)=n=−∞∑+∞cneinω0t=n=−∞∑+∞cneinT2πt
当 T → ∞ T→\infty T→∞时,求和符号变为积分符号,表示为:
x ( t ) = ∫ − ∞ + ∞ F ( ω ) e i ω t d ω x\left(t\right)=\int_{-\infty}^{+\infty}{F(\omega)e^{i\omega t}d\omega} x(t)=∫−∞+∞F(ω)eiωtdω
类似地,信号的傅里叶变换为:
F ( ω ) = 1 2 π ∫ − ∞ + ∞ f ( x ) e − i ω t d t F\left(\omega\right)=\frac{1}{2\pi}\int_{-\infty}^{+\infty}{f(x)e^{-i\omega t}dt} F(ω)=2π1∫−∞+∞f(x)e−iωtdt
这些根据公式一步步推导就可以了,逻辑性较强,较容易理解。唯一需要注意的是,由于频谱连续,在有限功率信号下,其频率幅值无限小,但频率间的相对关系保持不变。故傅里叶变换结果只反映了信号的频率间的相对大小。
1.1 离散傅里叶级数(DFS)、离散时间傅里叶变换(DTFT)、离散傅里叶变换(DFT)、快速傅里叶变换
上述信号中讨论的都是连续信号,而在计算机中只能处理时域离散的信号,我们通过在时间轴上对连续信号进行采样达到离散化信号的目的。所谓采样,就是将脉冲周期函数与连续信号相乘。
DFS处理的是时间离散的周期信号,其表达式形式与傅里叶级数类似:
X [ k ] = 1 N ∑ n = 0 N − 1 x [ n ] e − i 2 π N k n X\left[k\right]=\frac{1}{N}\sum_{n=0}^{N-1}{x[n]e^{-i\frac{2π}{N}kn}} X[k]=N1n=0∑N−1x[n]e−iN2πkn
其频域计算结果是离散的、周期的。
DTFT处理的是时间离散的非周期信号,DTFT和DFS的关系与FS和FT间的关系相同,其公式为:
X [ ω ] = x ( t ) = ∑ n = − ∞ + ∞ x [ n ] e i ω n X\left[\omega\right]=x\left(t\right)=\sum_{n=-\infty}^{+\infty}{x[n]e^{i\omega n}} X[ω]=x(t)=n=−∞∑+∞x[n]eiωn
其频域计算结果是连续的、周期的。
同样,这两个公式理解起来相对简单,分别是FS和FT的离散表达形式,故在公式层面不做过多解释。
对于上述提到的傅里叶分析方法做一个简单的总结:
时域 | 时域 | 频域 | 频域 | |
---|---|---|---|---|
FS | 连续 | 周期 | 离散 | 非周期 |
FT | 连续 | 非周期 | 连续 | 非周期 |
DFS | 离散 | 周期 | 离散 | 周期 |
DTFT | 离散 | 非周期 | 连续 | 周期 |
这里需要解释一个问题,连续信号经过采样之后,其离散信号的频谱为什么会变为周期的。这个问题困扰了我好久,在教材中大多用的是公式逻辑的推导,一般先引出性质:在时域中的乘积运算等于在频域中的卷积运算。然后给出周期脉冲信号和连续函数信号的频谱,再做卷积,过程十分繁琐不易理解。直到多年知乎上一个匿名大神的解释让我豁然开朗。
离散信号频谱的周期性(此图出处:奥本海姆《信号与系统》)
举个栗子,有这样一个离散序列,采样间隔为1。
这样的一个离散序列的频谱如何求解,根据傅里叶变换的思想,其各频率的系数等于信号与对应频率基向量的内积,为方便图形表示,用三角函数形式描述。
显而易见,周期为4基向量与信号的内积不为零,记为X;同样对于周期为4/5的基向量经采样后与周期为4基向量具有相同的值,对应地与信号的内积同样为X,以此类推,周期为4/(N+4)的基向量均具有相同的特征。信号的频谱图因此具有周期性。
这只是为了方便理解做的一个最为粗浅的解释,更严密的论证详见传送门:
终于到了DFT了(一滴都没有了),简单理解,DFT只是在DFS基础上,截取时域上的主值区间,即只取1个周期的信号描述整个时间序列。从另外一个角度分析,DFT是DTFT基础上,在频域上进行采样的结果。也就是说,在形式上DFT在时域和频域上均满足离散、有限长度的条件,这样便于在计算机上进行存储运算。事实上,只有DFT在计算机上能够实现。而目前数字信号处理中最常用的FFT算法是DFT的一个快速实现,其本质上仍然是DFT。关于二十世纪最牛逼的算法FFT,B站上的一个视频讲的很透彻:
快速傅里叶变换(FFT)——有史以来最巧妙的算法?
附上笔者写的一款简易的FFT工具,可以方便对信号进行截取操作,需要留邮箱
下期预告:
FFT应用实例及常见问题