傅里叶变换是把"随时间变化的波形"搬进"随频率分布的谱"的镜子,无线里几乎每个频谱概念都从这里长出来。本节从傅里叶级数一路走到 FFT,讲清四种变换各看什么、FFT 的 O(N log N) 省在哪里,再重点解剖频谱泄漏与窗函数这对实战老冤家。
上一节我们认识了滤波这把刀,可要说明白"到底滤走了什么频率",心里就得先有一本频率账。这本账,就是这一节要搭的镜子——傅里叶变换。它做一件事:把一串"随时间走"的波形,原封不动翻成"随频率分布"的谱,让原本缠在一起的信息站成一排。你在发射端量带宽、在接收端看干扰、在 OFDM 里看一簇子载波挤得多近,最后都要回到这面镜子前对账。读这一节的关键不是背公式,而是把"时域一段波形"和"频域一排谱线"在心里能自由来回切换。
阅读完本节,你应当能够:
傅里叶家族四件套,容易混,捋一下各自照顾谁:
FFT 只是算 DFT 的聪明算法,不是新变换。它是靠"分治 + 复指数对称性"把 DFT 从 O(N²) 压到 O(N log N):把一次 N 点 DFT 拆成两个 N/2 点(偶位与奇位)再合并,递归下去。N=8192 时,N² 约 6700 万乘,O(N log N) 约 10 万乘——差着三个数量级。正是这一刀,把"要算 4G 每小区每天上亿次变换"从不可能变成家常,也为 OFDM 铺了路(第6章)。
实操频谱分析:取一段有限样本,做 FFT,画出幅度谱。问题是——取哪一段、取多长,直接决定你看到什么。下面手动看一眼泄漏与加窗:
import numpy as np N = 256 fs = 1000.0 t = np.arange(N)/fs sig = np.sin(2*np.pi*50*t) + 0.4*np.sin(2*np.pi*123*t) # 两根频率 def power_spectrum(x): return np.abs(np.fft.fft(x * np.hanning(len(x))))**2 freqs = np.fft.fftfreq(N, 1/fs) S_raw = np.abs(np.fft.fft(sig))**2 S_win = power_spectrum(sig) print("信号采样点数:", N, "频率点:", freqs[:3]) print("加窗前最大旁瓣(dB):", 20*np.log10(S_raw[np.argmax(S_raw[1:int(N/2)], axis=None)]+1e-10)) print("加窗后最大旁瓣(dB):", 20*np.log10(S_win[np.argmax(S_win[1:int(N/2)], axis=None)]+1e-10))
对比加窗前后的旁瓣数字,你会看到汉宁窗把旁瓣显著压低——代价是主瓣变宽、频率分辨率粗。这正是频谱分析里绕不开的物理:你没法同时要"宽主瓣瘦旁瓣"和"高频分辨率",总得选一头。
这里要顺手澄清一个新手常踩的坑:把数据末位补零并不能提升分辨率,它只让谱在原有频率网格上"描得更细"(内插),却无法把本来叠在一起的两根近峰分开。真正决定能不能分开两根靠拢谱线的,是你能采到的实际时长 T——约 1/T 决定了频率间隔。所以想分辨率更高,正路是采更长的数据,而不是补零。补零只是让显示更平滑,别把它当成分辨率的免费午餐。
把后面接收机的头疼系串起来想:
| 窗 | 主瓣宽 | 旁瓣衰减 | 适用场景 |
|---|---|---|---|
| 矩形(无窗) | 最窄 | 差(-13dB) | 要求高分辨率 |
| 汉宁 | 稍宽 | 好(-31dB) | 通用频谱分析 |
| 凯泽(可调β) | 可调 | 可调 | 旁瓣可控需求 |
工程口诀:要严谨量准旁瓣、滤清微弱信号,宁可把分辨率让一点用窗,也别拿着尖旁瓣的矩形窗看一屏刺。
频谱不只是好看。无线里它的用处踩得实:
把四条串起来看,其实是一条完整的测量闭环:发射端先把带宽定死(量频谱),接收端再用导频把信道反推出来(测频响),中间一旦冒出陌生峰就追违法占频或干扰(定位),最后把设计好的滤波器搁上去收口(验滤波)。频谱分析在这里不只充当"看一眼",它提供了链路每换一个环节时用来对表的那把尺——没有它,很多"好像对了"的判断无从落地,很多"差了点"的信号也无从归因。
看清频谱之后,把连续世界搬进数字还要跨采样与量化两道坎,并在噪声里学会拿主意——采样量化与估计检测。