离散傅里叶变换
前提结论
傅里叶变换的对称性
对于傅里叶变换对 f(t) 与 F(f) (注意此处采用的频域自变量单位为频率, 对于角频率还需要而外修正)
F[f(t)]=F(f)
假设有信号具有与频谱相同的函数 F(t)
则该信号的傅里叶变换满足
F[F(t)]=f(−f)
傅里叶级数与变换的联系
无论是傅里叶级数还是变换, 信号的频域特性均不变
因此对于周期信号 f(t) 的傅里叶级数与变换间满足关系 (注意 f0 为[基频], 单位为频率)
Cn=F(nf0)df
根据冲激函数的性质, 可得周期信号的傅里叶变换为
F(f)=n=−∞∑∞Cnδ(f−nf0)
傅里叶变换的离散性
由傅里叶级数与变换的联系得, 周期信号 f(t) 的傅里叶变换 F(f) 必定是离散的, 且间隔为 f0, 即信号的频率
根据对称性还可以推出, 对于离散信号 fs(t) 的傅里叶变换 Fs(f) 必定是周期性的, 且周期为 Ts1, 即离散信号间隔 Ts 的倒数
脉冲信号的傅里叶变换
对于周期为 Ts 的脉冲信号
δs(t)=n=−∞∑∞δ(t−nTs)
其有复数傅里叶级数
Cn=Ts1∫−2Ts2Tsδs(t)e−j2πnt/Tsdt=Ts1
因此 Cn=Ts1 为一个与 n 无关的常数, 根据傅里叶级数与变换的联系, 可得其傅里叶变依然为一个脉冲函数
F(f)=Ts1n=−∞∑∞δ(f−nfs)=Ts1δfs(t)
周期延拓
对于信号 f(t), 根据卷积的特性, 将其与间隔为 T0 的脉冲函数 δ0(t) 求卷积得到信号 f0(t) 必定为以 T0 周期
特别的, 当 f(t) 为宽度为 T0 的有限信号, f0(t) 为 f(t) 在空间上的重复
(f∗δ0)(t)=∫−∞∞δs(τ)f(t−τ)dτ=∫−∞∞n=−∞∑∞f(t−τ)δ(τ−nT0)dτ=n=−∞∑∞f(t−nT0)
约定
- 以下推导中采用 sinc(t)=tsint
信号采样
定义
- 时域上周期无限长的信号 f(t)
- 采样间隔为 Ts 的信号采样脉冲 δs(t)=∑n=−∞∞δ(t−nTs)
- 截取信号的窗函数 u0(t)=h(t+2Ts)−h(t−2Ts−T0)
通过采样脉冲对信号进行采样, 得到间隔为 Ts 的离散信号
fs(t)=f(t)δs(t)
仅采样 t=−Ts/2∼T0−Ts/2 间共 N 个信号, 注意采样间隔 Ts 与截取长度 T0 间满足 Ts=NT0
相当于使用一个矩形窗函数 u0(t) 截取信号
f^(t)=fs(t)u0(t)=n=0∑N−1f(t)δ(t−nTs)
此时 f^(t) 便为一个可通过计算机处理的理想有限离散信号
频域采样
对于有限离散信号 f^(t), 其傅里叶变换 F^(f) 必定为连续的周期函数, 依然不利于计算机处理
因此也需要对信号的傅里叶变换做采样
根据周期延拓的性质, 傅里叶变换最适合以信号宽度的倒数 f0 为间隔采样有
F~(f)=F^(f)δ0(f)
由傅里叶变换的卷积特性以及脉冲函数的傅里叶变换可得, 此频域采样也等价于将有限信号 f^(t) 在空间上延拓, 每个周期 −Ts/2∼T0+Ts/2 内即 f^(t)
f~(t)=f^(t)∗F−1[δ0(f)]=T0r=−∞∑∞f^(t−rT0)=T0r=−∞∑∞n=0∑N−1f(t−rT0)δ(t−rT0−nTs)=T0r=−∞∑∞n=0∑N−1f(nTs)δ(t−rT0−nTs)
此时 f~(t), 有周期 T0, 可求出其傅里叶级数 (积分时直接取 r=0,f^(t) 相同的周期)
Ck=T01∫−Ts/2T0+Ts/2T0n=0∑N−1f(nTs)δ(t−nTs)e−j2πkt/T0dt=n=0∑N−1f(nTs)e−j2πknTs/T0=n=0∑N−1f(nTs)e−j2πkn/N
根据傅里叶级数与变换的联系, 可由此得到其傅里叶变换
F~(f)=k=−∞∑∞n=0∑N−1f(nTs)e−j2πkn/Nδ(f−kf0)(a)
注意, 根据 e−j2π(k+N)n/N=e−j2π(n/N+1)=1⋅e−j2πn/N (或傅里叶变换的离散性) 可得, F~(f) 依然为一个周期函数, 周期为 fs=Nf0
因此使用离散序列 F~[k] 表示为
F~[k]=F~(kf0)df=n=0∑N−1f(nTs)e−j2πkn/N(b)
逆变换
通过以上推导, 来自 f(t) 的周期离散信号 f~(t) 的傅里叶变换 F[f~(t)]=F~(f) 已经求得, 现求其逆变换 F−1[F~(f)]=f~(t)
不难发现, F~(f) 与 f~(t) 均为离散周期函数
因此可以尝试将 F~(f) 的周期分离, 使其与 f~(t) 具有相同的形式
之后根据傅里叶变换的对称性有 F[F~(t)]=f~(−f)
对于序列 F~[k]=F~(kf0) 具有周期 N, 因此可令 r=k+rN,k=0∼N−1
现对 F~(t) 进行变形
F~(f)=k=−∞∑∞n=0∑N−1f(nTs)e−j2πkn/Nδ(f−kf0)=r=−∞∑∞k=0∑N−1n=0∑N−1f(nTs)e−j2π(k+rN)n/Nδ(f−kf0−rNf0)=fsr=−∞∑∞k=0∑N−1[fs1n=0∑N−1f(nTs)e−j2πkn/N]δ(f−kf0−rfs)
不难发现, 除 fs1∑n=0N−1f(nTs)e−j2πkn/N 部分外, 此时的 F~(t) 具有与 f~(t) 完全相同的形式
根据离散序列 F~[k] 的定义可得, 此部分即
Tsn=0∑N−1f(nTs)e−j2πkn/N=TsF~[k]
使用 TsF~[n] 代替 f(nTs), Ts 代替 f0, 带入式 a, 然后令 k=−k,t=−t 有
f~(−t)f~(t)f~(t)=k=−∞∑∞n=0∑N−1TsF~[n]e−j2πkn/Nδ(t−kTs)=Tsk=−∞∑∞n=0∑N−1F~[n]e−j2π(−k)n/Nδ(−t+kTs)=Tsk=−∞∑∞n=0∑N−1F~[n]ej2πkn/Nδ(t−kTs)
同样的, 使用离散序列 f~[k] 表示为
f~[k]=f~(kTs)dt=Tsn=0∑N−1F~[n]ej2πkn/N
离散傅里叶级数 DFS
将式 b带入 f~[k] 中的 F~[n] 有 (或根据频域采样步骤中 f(t) 与 f~(t) 的关系可得到相同结论)
f~[k]=Tsn=0∑N−1m=0∑N−1f(mTs)e−j2πnm/Nej2πkn/N=Tsn=0∑N−1m=0∑N−1f(mTs)ej2πn(k−m)/N=Tsn=0∑N−1f(kTs)=NTsf(kTs)
综上所述, 有离散傅里叶级数 (DFS) 变换对
⎩⎨⎧F~[k]=NTs1∑n=0N−1f~[n]e−j2πkn/N,f~[k]=Ts∑n=0N−1F~[n]ej2πkn/N,k∈Zk∈Z
序列 F~[k] 与 f~[k] 均为无限长序列, 且具有周期 N, 分别有分布间隔 f0=fs/N 与 Ts
离散傅里叶变换 DFT
在实际使用中, 通常会直接使用采集到的离散数据序列 f[k], 其定义即为
f[k]=f(kTs),k∈[0,N)
由于计算机中的序列不可能无限长, 因此仅截取序列 F~[k] 一个周期 N 内的值
定义 f[k] 的离散傅里叶变换为序列 F[k] 满足
F[k]=F~[k],k∈[0,N)
规定 Ts=1, 使用 f[k] 代替离散傅里叶级数中的 f~[k]=NTsf[k]
因此有离散傅里叶变换 (DFT) 变换对
⎩⎨⎧F[k]=∑n=0N−1f[n]e−j2πkn/N,f[k]=N1∑n=0N−1F[n]ej2πkn/N,k∈[0,N)k∈[0,N)
信号复原
复原信号时, 可令 kTs=t, 得到复原信号
f′(t)=N1n=0∑N−1F[n]ej2πtn/T0
由于 F[k] 也经过 f=−f0/2∼fs−f0/2 的截取
因此复原得到的实际信号为 (对信号取绝对值)
f′(t)=∣f~(t)∗[fssinc(πfst)e−j2πfct/2]∣=f~(t)∗fssinc(πfst)
其中 fc=(fs−f0)/2 可根据傅里叶变换的移频性自行推导
根据卷积特性可得 f′(t)=fs∑k=−∞∞f[k]s(t−kTs)
其中 s(t)=sinc(πfst), 且 s(Tsn)=0(n=0)/=1(n=0)
因此 k∈[0,N) 时必然有 f′(kT)=fsf(kT) 但其余部分无法保证, 但只要采样点 N 足够多, 就能复原出原信号
根据以上推导可得, F[k] 复原得到的是 fsf(kT), 因此 F[k] 反应的是 fsf(t) 的频域特性
因此根据傅里叶变换的线性性, 对于 FFT 的结果 F[t], 还需要取 F′[k]=F[k]/fs 才能得到接近实际傅里叶变换 F(t) 的结果
DFT 与 DFS 的关系
通过离散傅里叶级数 DFS 得到的结果为离散的幅值谱, 近似认为
F[k]≈fs⋅∫(k−21)f0(k+21)f0F(f)df
对于 F[k] 与 F~[k] 可发现当输入序列相同时满足
F~[k]=f0⋅F[k]
通过离散傅里叶变换 DFT 得到的结果为离散的幅值密度谱, 近似认为 (待证明)
F[k]≈T0⋅fs⋅∫(k−21)f0(k+21)f0F(f)df
因此 DFT 结果的最大分辨率为 T01
以下推论经实验为正确的, 但成因不确定, 也可能由能量泄露导致
由上可知对于如 sin,cos 等幅值密度谱中有冲击函数的信号
假设其在 (k−21)f0∼(k+21)f0 的傅里叶变换结果为 F(f)=Aδ(kf0)
此时其 DFT 的结果为 F[k]=T0fsA
DFT 特点总结
- 采样长度 T0, 采样间隔 Ts, 采样点数 N=T0/Ts
- 首先使用窗函数截取连续信号 f(t) 在 t=−Ts/2∼T0−Ts/2 的部分, 此时将导致能量泄露
- 然后使用间隔为 Ts 的脉冲采样, 此时频域以 Ts1 为周期循环, 当信号频域有 f>fs/2 的部分, 将与其他周期混淆, 即香农采样定理
- 之后以间隔为 T01 的脉冲在频域采样, 因此 DFT 结果的最大分辨率为 T01, 此时时域的采样信号将以 T0 为周期循环
- 对于 DFT 得到的结果, 还需要除以 fs 才能与接近实际的傅里叶变换结果对应
实际使用
实际中多使用快速傅里叶变换 (FFT), 其算法与离散傅里叶变换相同, 但是优化了运算过程
具体体现为
- 将截取区间修改为 k∈(−2N,2N]
- 当数据点不为 2n 时, 将自动补 0
对于 numpy.fft 中的 f = fft.fft(x)
函数
参数 x
x
为实数数组, 即采集到的离散数据点
返回值 f
f
为复数数组, 即离散傅里叶变换结果
索引 [0:N/2]
保存了正数部分的幅值 F[0]∼F[N/2]
索引 [N/2+1:]
保存了负数部分的幅值 F[−N/2]∼F[−1]
根据信号复原可得, 变换结果 F[k] 对应的是频率为 f=T0k=NTsk 下的幅值
误差分析
f′(t) 的形式也表明, 经过离散傅里叶变换后, 仅能保留频率为 f=T0n 的成分