- 函数和内积
- 正交函数系
- 傅里叶级数和离散傅里叶变换
- 连续时间傅里叶变换
傅里叶变换的特性
- 快速傅里叶变换
快速傅里叶变换的优化
- 附:卷积
函数和内积
在开始之前有必要复习一下线性代数而知识。
在n维的线性空间中,两个向量之间可以做内积a⋅b=⟨a,b⟩,实际上就是求一个向量在另一个向量上投影的长度。内积为0,则两个向量正交。
线性无关的n个向量构成这个线性空间的一个基。如果这n个向量之间两两正交,且长度都为1,那么称为这个线性空间的一个标准正交基。选定标准正交基,相当于给这个线性空间建立坐标系。向量a的坐标可以通过和标准正交基的内积给出。
a=(a0,a1,a2,…,an)T=i=0∑naieiai=a⋅ei
因为我们选取的是标准正交基,这个坐标是唯一的。
给定坐标后,便可以比较方便地计算内积。
⟨a,b⟩=i=0∑naibi
如果引入复数,那么则要把一个向量的每个坐标都取共轭。
⟨a,b⟩=i=0∑naibi∗
这些概念可以推广到无穷维上,比如说离散信号x[n],函数x(t),也许还可以包括多项式。下面两个式子分别要求积分收敛、求和收敛(实际上就是对应能量有限的信号,这些信号构成的空间叫做平方可积空间)。
⟨x(t),y(t)⟩=∫−∞+∞x(t)y(t)∗dt
⟨x[n],y[n]⟩=n=−∞∑+∞x[n]y[n]∗
如果把多项式当作是函数,那么可以套用函数内积的公式。如果把n次多项式当作2n维向量(取其系数),则可以套用向量内积的公式。
可以认为傅里叶级数/变换就是把函数分解到ejkω0t这组基上面。
傅里叶级数
在开始前先考察一下两个函数系的正交型。
一个是三角函数系,就是下面这组函数:
1,sinω0x,cosω0x,sin2ω0x,cos2ω0x,…,sinnω0x,cosnω0x,…
类似地有复指数函数系ejω0nt
三角函数系的正交性
可以看到上述函数系中,所有函数都有个公共周期T=2π/ω0,下文称之为基波周期。
任取函数系中的两个不同函数,在基波周期上做内积,有下面三种情况
∫Tsinn1ω0t⋅cosn2ω0tdt∫Tsinn1ω0t⋅sinn2ω0tdt∫Tcosn1ω0t⋅cosn2ω0tdt
不难验证这几个积分结果都是0。
取周期为[−T/2,T/2],然后利用奇偶性
如果相同的函数自己与自己做内积
∫T(sinnω0t)2dt=2∫0ω0π21−cos2nω0tdt=ω0π=T/2
复指数函数系
∫−π/ωoπ/ω0ejω0nt⋅e−jω0mtdt
类似地,n=m时,积分为0,否则积分为2π/ω0=T
考虑一个LIT系统,给予其一个复指数激励x(t)=ejω0nt,如果已知起冲激响应h(t),则响应函数y(t)为冲激响应和激励的卷积,如下
y(t)=∫−∞+∞h(τ)x(t−τ)dτ=ejω0nt∫−∞+∞h(τ)e−jω0nτdτ
可以写作下式,即响应是激励乘以某个倍数,这个“倍数”只和频率ω有关。
y(t)=H(jnω0)x(t)=H(jω)x(t)
如果能把任意激励都分解成复指数函数的线性组合,那么分析这一系统就变得十分简单。
傅里叶级数的引入
我们可以把上述两个函数系直观理解为正交基,在此基础上引入傅里叶变换就简单了。
对于满足特定条件(Dirichlet条件)的实周期函数f(x),可以将其展开为三角级数。
f(x)=A0+k=1∑∞(Akcoskω0x+Bksinkω0x)
实际上就是用三角函数系的线性组合来表示这个函数。
同理,可以展开为复指数函数的线性组合(此时就不要求f(x)是实函数了)
f(x)=k=−∞∑+∞Akejkω0x
这便是傅里叶级数展开,上述里两式为傅里叶级数的综合式。对于实周期函数来说,这两种形式是可以相互转换的,只需要用一下欧拉公式。
既然我们已经将三角函数系和复指数函数系当作的正交基,那么求取上述两个式子的系数就很容易了——只需做一下内积,然后归一化一下。
对于三角函数系:
Ak=T2∫Tf(x)coskω0xdxBk=T2∫Tf(x)sinkω0xdxA0=T1∫Tf(x)dx
对于复指数函数系:
Ak=T1∫Tf(x)e−jω0kxdx
这几个式子成为傅里叶级数的分析式。
只要把f(x)的综合式代到分析式里面,就能简单验证一下正确性,
离散傅里叶变换(DFT)
给个以周期为N的离散信号x[n],它也可以分解为一系列不同频率分量的叠加。但是此处要注意,离散时间的函数系和连续时间的函数系有本质的不同。在于
ejkN2πn=ej(k+N)N2πn
所以,其实频率kω0的分量和(k+N)ω0的分量是一模一样的。换句话说,离散信号的频率分量个数是有限的。也可以认为它的傅里叶级数系数有周期性。
x[n]=k=0∑Nakejkω0n
系数的获取一样是通过内积
ak=N1n=0∑Nx[n]e−jkω0n
这就是DFT。
实际上做DFT,只需要截取一个周期出来就够了。我们把截取出来的信号看作一个N维向量x,把傅里叶系数也看作一个向量a=(a0,a1,…,aN)T。把ejN2πn记为ωNn
x=⎣⎡111⋮11ωN1ωN2⋮ωNk(N−1)1ωN2ωN4⋮ωN2(N−1)⋯⋯⋯⋱⋯1ωNN−1ωN2(N−1)⋮ωN(N−1)2⎦⎤a
把这个矩阵记为F,则x=Fa,其中
Fkn=ωN(k−1)(n−1)
这个矩阵做的就是傅里叶逆变换。它的逆,即ωN全部换成ωN−1,然后前面乘上1/N,做的就是傅里叶变换。通过这个矩阵乘法我们也能知道,直接做DFT的时间复杂度是O(N2)
傅里叶变换、离散时间傅里叶变换(DTFT)
无论是傅里叶级数,还是DFT,都要求函数具有周期性。如果遇到没有周期性的函数,该怎么处理呢?如果函数的支撑(非0区间)有限,那么我们可以直接把他延拓成一个周期信号。如果支撑无限,该怎么办呢?
傅里叶指出,可以把非周期函数也当作周期函数,只不过它们的周期无限大。
首先我们截取f(x)在[−T/2,T/2]区间的一小段进行周期性的重复,得到f~(t),求其傅里叶级数系数
Ak=T1∫Tf~(x)e−jT2πkxdx=T1X(jkω0)
带入综合公式
f~(x)=k=−∞∑+∞X(jkω0)ejkω0xT1
T→+∞时,这个式子变成一个积分,f~(x)变成f(x),得到傅里叶变换综合公式
f(x)=∫−∞+∞X(jω)ejωxdω
根据定义
X(jω)=∫Tf(x)e−jωxdx
在T→+∞是,变为傅里叶变换分析公式
X(jω)=∫−∞+∞f(x)e−jωxdx
考虑这几个式子的意义:随着周期趋于无限、频率越分越细,频率不再只取几个离散的值,而是变成连续的。也可以认为周期函数存在傅里叶变换,只不过频域里是“离散”的(一系列冲激函数)
对于离散时间的非周期信号也可以做类似的推导,只不过频域内得到的也是个周期函数。
f(x)和X(jω)为一对傅里叶变换对,记作
f(x)⟷FX(jω)
X(jω)=F[f(x)],f(x)=F−1[X(jω)]
傅里叶变换的性质
这里只简单罗列,不证明。实际上要证明起来并不困难。
假设有
x(t)⟷FX(jω)
线性
ax1(t)+bx2(t)⟷FaX1(jω)+bX2(jω)
时移
x(t−t0)⟷Fe−jωt0X(jω)
微分
dtdx(t)⟷FjωX(jω)
积分
∫−∞tx(t)⟷Fjω1X(jω)
缩放(尺度变换)和时间反转
x(at)⟷F∣a∣1X(∣a∣jω)
共轭
x(t)∗⟷FX(−jω)∗
帕斯瓦尔定理
谐波分量的平均功率为傅里叶系数的模平方。信号的总功率为各个分量功率之和。
卷积性质
时域内卷积,相当于频域内乘积。时域内乘积,相当于频域内卷积。
x(t)∗h(t)⟷FX(jω)H(jω)
对偶性
时域和频域互为对偶。对频域再做傅里叶变换,得到的函数和时域很像。
快速傅里叶变换(FFT)
和上文一致,我们定义ωn
ωn=exp(nj2π)
ωnk (k=0,1,2,…,n−1)都是xn=1的根,所以也叫单位复数根。
消去引理
ωpnpk=exp(pnj2πpk)=ωnk
意思是可以消去指数和下标的公因数。假如n是偶数,那么ωn2=ω2n
FFT利用这一性质,可以把DFT时间复杂度从O(n2)降到O(nlogn)
一个观察
我们把DFT的式子再抄一遍,不过为了避免混淆,原来的n改成t,原来的N改成n。从这里开始我们均假设n是2的幂次,意味着n可以不断地整除2。
ak=n1t=0∑nx[t]e−jkω0t=n1t=0∑nx[t]ωn−kt
记x0为x的偶数项构成的序列,x1为奇数项构成的序列。则可以把上面的求和奇偶拆开:
a[k]==n1t=0∑n/2−1x[2t]ωn2kt+n1t=0∑n/2−1x[2t+1]ωn2kt+kn1t=0∑n/2−1x0[t]ω2nkt+n1ωnkt=0∑n/2−1x1[t]ω2nkt
当k≥2n时,可知
ω2nkt=ω2n(k−2n)t,ωnk=−ωnk−2n
如果DFT变换为a=DFT(x),则有h=DFT(x0),g=DFT(x1)
则
a[k]=h[k]+ωnkg[k]
FFT伪代码
综合上面得到的式子,已经可以写出FFT的伪代码了。
def FFT(x):
n = len(x)
if n == 1:
return x
omega_n = exp(2*pi/n), omega = 1
h = FFT(even(x)) # even()表示取偶数项
g = FFT(odd(x)) # odd()表示取奇数项
for k = 0 to n/2-1:
a[k] = h[k] + omega*g[k]
a[k+n/2] = h[k] - omega*g[k]
omega *= omega_n
return a
用主定理分析一下(其实不用主定理,这个分治算法的结构和归并排序是一样的),可知时间复杂度是O(nlogn)
傅里叶变换的应用
暂略(解微分方程、滤波、更快的多项式乘法)
附:卷积
可以从不同的角度导入卷积的概念。
信号的角度
信号系统接受一个输入(激励),产生一个输出(响应)。如果一个系统满足线性、时不变两个条件,称为LIT系统。下面把激励统计记作x(t),响应统计记为y(t),离散情况也类似,只要把(t)替换成[n]就可以了。
线性,ax1(t)+bx2(t)的响应是ay1(t)+by2(t)
时不变,即x(t−t0)的响应是y(t−t0),就是给输入多少时延,输出就会有多少时延
在离散情况下,我们定义脉冲信号
δ[n]={10n=0n=0
任何离散信号都可以表示成延时脉冲信号的线性组合
x[n]=k=−∞∑+∞x[k]δ[n−k]
所以根据LIT系统的性质,输入的线性组合,输出也是相同的线性组合,假设δ[n]对应的响应是h[n],那么
y[n]=k=−∞∑+∞x[k]h[n−k]
这个操作称为卷积。
连续信号可以视为延迟后的冲激函数的叠加
x(t)=∫−∞+∞x(τ)δ(t−τ)dτ
我们假设冲激函数δ(t)对应的响应为h(t),称为冲激响应。那么根据线性和时不变两个性质,输出就是
y(t)=∫−∞+∞x(τ)h(t−τ)dτ
后面这个运算我们称为卷积,即
y(t)=x(t)∗h(t)=∫−∞+∞x(τ)h(t−τ)dτ
多项式的角度
假如我们有两个n次多项式P(x)和Q(x)。回忆一下,我们可以用xn项的系数来表示n次多项式。比如说
P(x)=p0+p1x+p2x2+⋯+pnxn
表示为这个向量
(p0,p1,p2,…,pn)T
两个多项式的和/差就是对应的两个向量相加/减。但当我们考虑多项式的乘积的时候,情况就复杂了。n次多项式的乘积是个2n次的多项式。我们需要先把这两个多项式“扩展”到2n次(也就是想象它们是2n次多项式,只不过对于n次以上的项,系数全是0)。那么乘积为
R(x)=P(x)Q(x)=m=0∑2nk=0∑mpkqm−kxm
建议这里动笔验证一下。也就是
rm=k=0∑mpkqm−k
后面这个操作也是卷积,只不过区间不是无穷的。
概率论的角度
如果给定两个连续型随机变量X和Y,对应的概率密度函数分别是pX(x)和pY(y),那么它们的和Z=X+Y的概率密度函数pZ(z)为
pZ(z)=∫−∞+∞pX(x)pY(z−x)dx
这也是卷积。