一段声音在时间轴上是一条起伏的曲线。同一段声音也可以按频率描述:哪些振动成分比较强,它们的相位如何,彼此叠加后形成什么形状。
傅里叶变换把这两种描述联系起来。它不是只适用于声音的技巧;图像、通信和微分方程里,也能看到同一种“换个基底观察问题”的思路。
为什么会出现复数?#
欧拉公式把三角函数装进一个紧凑的表达式:
eiωt=cos(ωt)+isin(ωt).
因此,用复指数表示振动,并没有丢掉正弦与余弦。复数的模与辐角可以分别描述幅度和相位:
z=a+ib,∣z∣=a2+b2,z=∣z∣eiargz.
如果只保留频谱的模,通常就无法唯一还原原信号。两段信号可以有相同的幅度谱,却因为相位不同而呈现不同的波形。
先固定一套变换约定#
本文采用角频率 ω,它与通常以赫兹表示的频率 ν 满足:
ω=2πν.
定义傅里叶变换为:
f(ω)=∫−∞∞f(t)e−iωtdt.
在满足相应反演条件时,逆变换为:
f(t)=2π1∫−∞∞f(ω)eiωtdω.
例如,f 与 f 都可积时,可以在适当意义下使用反演公式;对平方可积信号,则可以通过 L2 理论扩展。后面提到的导数等性质,也各自需要相应的正则性和边界条件。
不同书籍可能把 2π 分配在不同位置。比较公式前,先检查频率变量与归一化约定。[1]
一个矩形脉冲,会变成什么?#
考虑宽度为 T>0、高度为一的矩形脉冲:
f(t)={1,0,∣t∣≤T/2,∣t∣>T/2.
代入定义:
f(ω)=∫−T/2T/2e−iωtdt=ω2sin(ωT/2)=Tsinc(2ωT).
这里使用的定义是 sinc(x)=sinx/x,并通过连续延拓规定 sinc(0)=1,所以 f(0)=T。
脉冲在时间上截得很整齐,频谱却会向外延伸。越窄的时间脉冲,会对应越宽的频谱。这也解释了为什么“只看有限一段数据”会影响频率分析。
一个更平滑的例子是高斯函数:
f(t)=e−t2/(2σ2)⟹f(ω)=σ2πe−σ2ω2/2,σ>0.
它变换以后仍是高斯形状,时间宽度与频率宽度则朝相反方向变化。
几条性质,能省掉大量计算#
傅里叶变换具有线性:
F{af+bg}=af+bg.
把信号延迟 t0,频域里会出现一个相位因子:
F{f(t−t0)}=e−iωt0f(ω).
在函数足够光滑且边界项消失时,求导对应乘以 iω:
F{f′(t)}=iωf(ω).
定义卷积:
(f∗g)(t)=∫−∞∞f(τ)g(t−τ)dτ,
那么,在卷积定理适用的条件下:
F{f∗g}=fg.
这使得滤波很容易理解:时间域里与某个核做卷积,相当于频率域里对不同成分乘以不同权重。
对应本文的归一化约定,能量关系是:
∫−∞∞∣f(t)∣2dt=2π1∫−∞∞∣f(ω)∣2dω.
它说明转换描述方式并没有凭空创造或消灭能量。
电脑拿到的是样本#
连续积分适合理论分析。电脑实际得到的通常是 N 个样本:
xn=f(nΔt),n=0,1,…,N−1,fs=Δt1.
离散傅里叶变换,也就是 DFT,定义为:
Xk=n=0∑N−1xne−i2πkn/N,k=0,…,N−1.
它的逆变换为:
xn=N1k=0∑N−1Xkei2πkn/N.
正向与逆向的符号和 1/N 要配套。常见的 FFT 是快速计算 DFT 的算法,并不是另一种变换。[2]
把 DFT 看成有限时间区间内连续积分的近似时,还会涉及 Δt 的比例因子;直接把 DFT 数组当成前面连续变换的数值,容易弄错单位和幅度。
两个频率,做一个可复现的例子#
构造一个合成信号:
x(t)=sin(2π⋅5t)+0.5sin(2π⋅12t).
它由幅度为一的 5Hz 正弦波,与幅度为 0.5 的 12Hz 正弦波相加。使用 fs=128Hz,采集 N=128 个样本:
Δν=Nfs=1Hz.
这两个频率都恰好落在 DFT 的频点上,适合观察幅度标定。对于实信号、偶数 N,单边幅度谱的内部频点可计算为:
Ak=N2∣Xk∣,1≤k<N/2.
直流分量 k=0 和奈奎斯特频点 k=N/2 不乘二。
import numpy as np
fs = 128
n = 128
t = np.arange(n) / fs
x = np.sin(2 * np.pi * 5 * t) + 0.5 * np.sin(2 * np.pi * 12 * t)
spectrum = np.fft.rfft(x)
frequency = np.fft.rfftfreq(n, d=1 / fs)
amplitude = np.abs(spectrum) / n
amplitude[1:-1] *= 2 # 此例 n 为偶数;不加倍直流与奈奎斯特频点
print(frequency[5], round(amplitude[5], 6)) # 5.0 1.0
print(frequency[12], round(amplitude[12], 6)) # 12.0 0.5

这张图由同样的合成信号生成;对应的两个谱峰已通过数值计算核对。它不是现场录音的频谱。
最常见的两个误会#
采样够快,还需要知道信号范围#
对理想带限信号,通常要求采样频率严格高于最高频率的两倍:
fs>2νmax.
若高频成分在采样前没有被限制,它们可能混叠成低频。采样之后再提高 FFT 点数,无法恢复已经混叠的信息。
频谱旁边的波纹,不一定是新频率#
有限长度的数据,相当于给原信号乘了一个时间窗。在本文约定下,时间域相乘对应频域卷积:
F{fw}=2π1(f∗w).
当观测区间不能容纳整数个周期时,能量可能散到相邻频点,形成频谱泄漏。加窗可以降低某些旁瓣,但往往会加宽主瓣,也会影响幅度,需要按窗函数做相应校正。
补零能够让频谱曲线采样得更密,却不会增加观测时间,也不会自动提高分辨两个邻近频率的能力。
理解傅里叶变换之后,再看一条起伏曲线,就多了一种问题可问:它由哪些尺度的变化组成?这些变化是信号自身的结构,还是观测方式留下的痕迹?频谱有用,前提是我们也记得它怎样被算出来。
延伸阅读#
- Fourier transform
- NumPy:离散傅里叶变换与归一化约定
评论
还没有评论。 来写第一条。