(三) 傅里叶变换:把信号拆成音符的秘密
—— 从“杂乱电流”到“频谱瀑布流”的魔法分解
一、音乐家的启示:如何分离交响乐中的乐器?
想象一段交响乐录音中混杂着小提琴、鼓声和长笛。傅里叶变换就像一个超级耳朵,能将混合信号拆解为独立的频率成分——就像在乐谱上标出每个音符的音高和强度。
核心思想:任何信号都可以表示为不同频率正弦波的叠加。
二、数学显微镜:傅里叶变换公式
1. 离散傅里叶变换(DFT)
将离散信号 x [ n ] x[n] x[n] 转换为频域表示 X [ k ] X[k] X[k]:
X [ k ] = ∑ n = 0 N − 1 x [ n ] ⋅ e − j 2 π k n / N ( k = 0 , 1 , . . . , N − 1 ) X[k] = \sum_{n=0}^{N-1} x[n] \cdot e^{-j2\pi kn/N} \quad (k=0,1,...,N-1) X[k]=n=0∑N−1x[n]⋅e−j2πkn/N(k=0,1,...,N−1)
- N N N:信号长度
- X [ k ] X[k] X[k]:第 k k k 个频率分量的复数(包含幅度和相位)
2. 快速傅里叶变换(FFT)
(FFT算法的原理和实现较为复杂,本文暂不展开深入探讨。)
- FFT是DFT的高效实现(复杂度从 O ( N 2 ) O(N^2) O(N2) 降到 O ( N log N ) O(N\log N) O(NlogN))。
- 为什么重要?:处理1秒音频(44,100点)时,FFT比DFT快约 4,400倍!
三、Python实验:用FFT分析鸟鸣声
场景:识别信号中的高频噪声
import numpy as np
from scipy.fft import fft
import matplotlib.pyplot as plt
# 生成含噪声的信号
fs = 500 # 采样率500Hz
t = np.linspace(0, 1, fs) # 1秒时长
f_clean = 50 # 纯净信号频率50Hz
x_clean = 0.8 * np.sin(2 * np.pi * f_clean * t)
x_noise = 0.2 * np.random.randn(len(t)) # 高斯白噪声
x = x_clean + x_noise # 合成信号
# 执行FFT
X = fft(x)
freq = np.linspace(0, fs, len(X)) # 频率轴
# 绘制时域和频域图
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.figure(figsize=(12, 5))
# 时域信号
plt.subplot(1, 2, 1)
plt.plot(t, x, label="含噪声信号")
plt.plot(t, x_clean, 'r--', alpha=0.5, label="纯净信号")
plt.xlabel("时间 (秒)")
plt.ylabel("振幅")
plt.title("时域信号")
plt.legend()
# 频域频谱
plt.subplot(1, 2, 2)
plt.plot(freq[:len(X)//2], np.abs(X[:len(X)//2])) # 只显示正频率部分
plt.axvline(f_clean, color='r', linestyle='--', label="50Hz主成分")
plt.xlabel("频率 (Hz)")
plt.ylabel("能量")
plt.title("频域频谱")
plt.legend()
plt.tight_layout()
plt.show()
运行结果:
- 左图:时域信号看似杂乱无章
- 右图:频域清晰显示50Hz主成分和宽带噪声
四、关键概念解析
1. 频谱泄露与加窗
- 问题:信号截断导致频谱能量“泄露”到相邻频段。
- 解决:使用汉宁窗(Hann Window)平滑信号边缘。
window = np.hanning(len(x)) # 汉宁窗
X_windowed = fft(x * window) # 加窗后的FFT
2. 频率分辨率
- 公式:
Δ
f
=
f
s
N
\Delta f = \frac{f_s}{N}
Δf=Nfs
- 若 f s = 1000 H z f_s = 1000Hz fs=1000Hz, N = 1000 N = 1000 N=1000,则 Δ f = 1 H z \Delta f = 1Hz Δf=1Hz
- 矛盾:提高分辨率需要更长的信号时间( T = N / f s T=N/f_s T=N/fs)
五、现实世界的应用
- 音频均衡器:调整不同频段的增益(如增强低音)
- WiFi路由器的OFDM:将数据分配到多个子载波传输
- 医学成像:MRI利用频率信息重建人体剖面
- 量子计算:Shor算法用FFT加速质因数分解
六、常见误区
- “傅里叶变换能分析瞬时频率?”
- 不能!FFT假设信号在整个时间段内稳定(需用时频分析如小波变换)。
- “所有信号都能用正弦波合成?”
- 是的!但需要无限多个正弦波(傅里叶级数的收敛性)。
动手实验:
修改代码中的 f_clean
为80Hz,添加另一个频率成分(如120Hz),观察频谱如何变化。
上一篇 (二) 采样定理:为什么CD音质是44.1kHz?