首页 › deep-tech › 图解FFT:数字通信的数学心脏

图解FFT:数字通信的数学心脏

一、开场:手机里住着一只“数字耳朵”

想象你坐在音乐厅里,钢琴家同时按下三个键。传到你耳朵里的,只是一条随时间起伏的气压曲线——一个混在一起的“时域信号”。但你的耳朵和大脑却能毫不费力地把它拆解成三个音符:低音do、中音mi、高音sol。

这就是人类与生俱来的频谱分析能力:从“随时间变化的波形”中听出“由哪些频率成分组成”。

傅里叶变换就是把这种“听音辨调”的能力数学化:时域和频域是同一份数据的两种看法,傅里叶变换是两者之间自由往返的桥梁。

现在把场景搬进手机。5G下行链路上,基站把成百上千个子载波“叠”在一起发给你——空中的电波就是一条复杂的“和弦”。你的手机基带芯片要做的第一件大事,就是充当那只“数字耳朵”:把采样到的时域波形拆回一张张子载波。承担这项工作的算法,就是快速傅里叶变换(FFT);而在发射端,把频域子载波“合成”为时域波形的,是它的孪生兄弟——逆快速傅里叶变换(IFFT)。

IEEE期刊《Computing in Science & Engineering》在2000年评选“20世纪十大算法”时,FFT赫然在列;数学家Gilbert Strang在1994年更是称它为“我们这个时代最重要的数值算法”。一部4G/5G基带芯片,每一毫秒都要做几十次甚至上百次几千点的FFT/IFFT——说它是数字通信的数学心脏,毫不夸张。

二、DFT:一台“拆和弦”的机器,以及它的计算灾难

先看离散傅里叶变换(DFT)的定义。给你N个时域采样点 $x_0, x_1, \dots, x_{N-1}$,DFT帮你算出N个频率分量:

$$X_k = \sum_{n=0}^{N-1} x_n \, e^{-j 2\pi kn/N}, \qquad k = 0, 1, \dots, N-1$$

用大白话解读:想知道“第k号频率成分有多少”,就拿N个采样点分别与“该频率的标准旋转参考”做比对(相乘),再把N个结果加起来。频率对上了,加出一个大数;频率对不上,正负抵消趋于零。这就是“拆和弦”的全部数学。

问题出在代价上。N个输出点,每个要做N次复数乘法——直接按定义硬算,需要:

$$\text{直接DFT:} \; N^2 \text{ 次复数乘法}$$

5G里一个常见配置是4096点FFT。$4096^2 \approx 1678$万次复数乘法,而基带要在33微秒(一个OFDM符号的时长)内算完,还得留出时间给均衡、译码……按定义硬算,芯片会直接“累死”。上世纪60年代,这确实是制约信号处理发展的真实瓶颈。

三、1965年那篇论文:用“淘汰赛”取代“循环赛”

破局者是一篇发表于1965年的论文——Cooley与Tukey的《An algorithm for the machine calculation of complex Fourier series》。这篇论文的核心洞见只有一句话:当N是合数时,一个大DFT可以拆成若干小DFT来算,总工作量急剧下降。

用一个类比来理解。假设有8名棋手要两两比出所有胜负关系(类似直接DFT让每个点与每个点都“配对”),需要打$8 \times 8 = 64$场。但如果你真正想要的只是“排出名次”(相当于求出全部频率分量),淘汰赛制度就够了:8人打淘汰赛只需3轮、每轮4场,总共12场比赛——因为很多配对是冗余的,其结果可以从别的配对结果中复用。

Cooley–Tukey算法正是这样递归地“按奇偶拆半”:一个N点DFT拆成两个N/2点DFT(一个只含偶数下标样本,一个只含奇数下标样本),再逐级合并。对8点DFT:

flowchart TD
    A["8点DFT<br/>直接算: 8 x 8 = 64 次复乘"] -->|"按奇偶拆半"| B["两个4点DFT<br/>2 x 16 = 32 次复乘"]
    B -->|"继续拆"| C["四个2点DFT<br/>4 x 4 = 16 次复乘"]
    C --> D["拆到底: 8个1点DFT<br/>乘法次数 = 0"]
    D --> E["反向逐级合并<br/>3级, 每级4个蝶形"]
    E --> F["总计 12 次蝶形乘法<br/>vs 直接法的 64 次"]

递归下去,总复杂度从 $N^2$ 降为:

$$\text{FFT:} \; \frac{N}{2}\log_2 N \; \text{次复数乘法} \quad \text{(radix-2,N为2的幂)}$$

两者的差距随N增大而拉大:

FFT点数 N 直接DFT乘法 N² FFT乘法 (N/2)·log₂N 加速倍数(约)
64 4,096 192 21×
1024 104.9万 5,120 205×
2048 419.4万 11,264 372×
4096 1,677.7万 24,576 683×

某百科的FFT词条算过一笔更全面的账(含加法、剔除乘1等平凡运算):对N=4096,直接按定义算约需3000万次运算,而Cooley–Tukey算法只需约7万次——四百多倍的差距。这就是“快速”二字的含金量。

三个有趣的历史注脚(均见于某百科FFT词条及其引文):

四、蝶形图:FFT的全部几何

Cooley–Tukey算法逐级合并的基本运算单元叫蝶形(butterfly):两个数进出,两个数出,中间夹一次与“旋转因子”(twiddle factor,即 $e^{-j2\pi k/N}$)的复乘。8点FFT需要3级、每级4个蝶形。数据自左向右流过蝶形阵列,就完成了时域到频域的旅程:

flowchart TD
    subgraph IN["输入: 位反转排列"]
        direction LR
        x0["x(0)"]
        x4["x(4)"]
        x2["x(2)"]
        x6["x(6)"]
        x1["x(1)"]
        x5["x(5)"]
        x3["x(3)"]
        x7["x(7)"]
    end
    subgraph S1["第1级: 4个2点蝶形"]
        b11(("×"))
        b12(("×"))
        b13(("×"))
        b14(("×"))
    end
    subgraph S2["第2级: 4个蝶形 + 旋转因子"]
        b21(("×"))
        b22(("×"))
        b23(("×"))
        b24(("×"))
    end
    subgraph S3["第3级: 4个蝶形 + 旋转因子"]
        b31(("×"))
        b32(("×"))
        b33(("×"))
        b34(("×"))
    end
    subgraph OUT["输出: 自然顺序"]
        X0["X(0)"]
        X1["X(1)"]
        X2["X(2)"]
        X3["X(3)"]
        X4["X(4)"]
        X5["X(5)"]
        X6["X(6)"]
        X7["X(7)"]
    end
    IN --> S1 --> S2 --> S3 --> OUT

两个工程细节值得工程师记住:

  1. 位反转(bit-reversal)输入排序:按奇偶反复拆分后,输入样本的下标二进制位恰好整体反转(0,4,2,6,1,5,3,7)。这就是为什么硬件FFT almost都要求“2的幂”点数——radix-2结构最规整;非2的幂也有混合基算法,但实现复杂度和时延都要付出代价。
  2. FFT不仅更快,还更准。直接按定义算DFT,浮点舍入误差随 $O(\varepsilon N^{3/2})$ 增长;Cooley–Tukey凭借两两求和的结构,误差只按 $O(\varepsilon \log N)$ 增长(Schatzman, 1996,转引自某百科词条)。更少的运算量叠加更优的数值结构,“又快又稳”是FFT能统治DSP五十余年的深层原因。

五、发射机为什么用IFFT:把“画频谱”变成“发波形”

OFDM发射机的思路是反过来的:调度器已经决定了“哪些子载波、各承载哪个QAM星座点”——这相当于在频域把一张频谱图画好了。现在需要把这张“频谱图”变成真正可以发射的时域波形。这正是逆变换的职责:

$$x_n = \frac{1}{N}\sum_{k=0}^{N-1} X_k \, e^{+j2\pi kn/N}$$

IFFT和FFT在数学上几乎是同一个东西,只差指数符号和一个 $1/N$ 因子。存在一个优美的恒等式:

$$x_n = \frac{1}{N}\,\overline{\;\text{DFT}\left(\overline{X_k}\right)\;}$$

即共轭→做FFT→再共轭→除以N,就得到IFFT。所以工程上发射机和接收机往往复用同一套FFT硬件,通过“共轭+定标”开关切换角色——这是基带芯片省门 Areas的经典手法。

一句话总结这条设计哲学:OFDM之所以能被实用化,正是因为“多载波调制”这个原本需要几百个振荡器的模拟难题,被一次IFFT变成了纯数字运算。子载波的正交性不再是物理上“摆”出来的,而是数学上“算”出来的。

六、循环卷积与循环前缀:FFT能扛多径的隐藏前提

这里有一个初学者最容易忽略的深层问题:FFT的频域“乘法定理”说的是圆周卷积对应频域相乘;而真实的多径无线信道做的是线性卷积。两者天然不等价——如果不做任何处理,前一个符号的“拖尾”(多径回声)会污染后一个符号,子载波正交性被破坏,产生符号间干扰(ISI)和载波间干扰(ICI)。

5G的解法优雅至极:在每个符号前复制一段该符号尾部的样本,作为循环前缀(CP),只要CP长度不小于信道最大时延扩展,多径回声就会全部落在CP区间内被丢弃,剩余的“稳态”部分在数学上恰好等效于圆周卷积。于是接收端FFT之后,信道对每个子载波的作用退化为一个复数增益:

$$Y_k = H_k \, X_k \quad\Longrightarrow\quad \hat{X}_k = \frac{Y_k}{H_k}$$

原本需要时域卷积才能完成的均衡,被简化为每个子载波上“一乘一除”的单抽头均衡。这正是OFDM战胜单载波均衡器的根本原因,也是CP存在的全部意义——CP不是为了“抗干扰”这个笼统说法,而是专门为了让FFT的圆周卷积定理在多径信道上依然成立。它的代价是约7%的速率开销(例如15kHz子载波间隔下,CP占4.69微秒,符号总长71.35微秒)。

flowchart TD
    TX["发送符号: CP + N点有效数据"] --> CH{"多径信道<br/>最大时延扩展 tau"}
    CH -->|"CP长度 >= tau"| OK["回声全部落在CP内<br/>有效段等效圆周卷积"]
    CH -->|"CP长度 < tau"| BAD["前符号拖尾入侵<br/>ISI + 子载波ICI"]
    OK --> RX["接收端去CP后做FFT"]
    RX --> EQ["频域单抽头均衡<br/>Xk = Yk / Hk<br/>一乘一除搞定多径"]
    BAD --> ERR["星座发散<br/>EVM恶化 / 吞吐骤降"]

七、5G里的真实数字:采样率恒等式与可扩展参数集

理解了FFT,5G物理层的一堆“神秘常数”会突然变得透明。核心是一个恒等式:

$$f_s = N_{\text{FFT}} \times \Delta f$$

采样率 = FFT点数 × 子载波间隔。因为N点FFT恰好把采样率均分为N份,每份就是一个子载波。用这个恒等式一验,教科书里的数字立刻“活”了:

系统 典型配置 FFT点数 子载波间隔 采样率
LTE 20MHz 单一参数集 2048 15 kHz 2048×15k = 30.72 Msps
5G Sub-6 100MHz μ=1 4096 30 kHz 4096×30k = 122.88 Msps
5G毫米波(按同一恒等式) μ=3 4096 120 kHz 4096×120k = 491.52 Msps

更妙的是,5G整个时间网格的“原子单位”也直接锚定在4096点FFT上:基本时间单位 $T_c = 0.509$ 纳秒,恰好等于“最大子载波间隔480kHz配4096点FFT时单个采样的时长”($1/(480\,\text{kHz} \times 4096) \approx 0.509\,\text{ns}$)。全网的时间刻度,本质上是“最宽参数集下FFT采样间隔”的整数倍——FFT在这套标准里的地基地位可见一斑。

5G引入可扩展参数集(Numerology)后,FFT/IFFT框架不变,只换“点数×子载波间隔”的组合(据ShareTechnote整理的NR帧结构参数):

参数集 μ 子载波间隔 有效符号时长 CP时长 符号+CP 每子帧slot数 slot时长
0(同LTE) 15 kHz 66.67 μs 4.69 μs 71.35 μs 1 1 ms
1 30 kHz 33.33 μs 2.34 μs 35.68 μs 2 0.5 ms
2 60 kHz 16.67 μs 1.17 μs 17.84 μs 4 0.25 ms
3 120 kHz 8.33 μs 0.57 μs 8.92 μs 8 0.125 ms
4(仅同步用) 240 kHz 4.17 μs 0.29 μs 4.46 μs 16 62.5 μs

这张表背后是两组“为什么”:

把整条链路串起来,一只手机的下行“数学心脏”全貌如下:

flowchart TD
    B["比特流"] --> MOD["编码 + QAM调制<br/>得到频域星座点"]
    MOD --> MAP["资源映射<br/>分配到各子载波"]
    MAP --> IFFT["N点IFFT<br/>频谱图 → 时域波形"]
    IFFT --> ADDCP["加循环前缀<br/>复制符号尾部"]
    ADDCP --> RF["DAC + 射频上变频"]
    RF ==空口多径信道==> RRF["射频下变频 + ADC"]
    RRF --> RMCP["去CP: 丢弃前段"]
    RMCP --> RFFT["N点FFT<br/>数字耳朵: 波形 → 子载波"]
    RFFT --> CHEQ["信道估计 + 单抽头均衡<br/>Xk = Yk/Hk"]
    CHEQ --> DEMOD["解调 + 译码"]
    DEMOD --> RB["还原比特"]

八、现网与调试:FFT视角下的经典故障

FFT原理不是纸面知识,它是日常调测的“透视镜”。几个高频场景:

  1. 星座图整体缓慢旋转 → 公共相位误差(CPE)。本振相位噪声和残余频偏在FFT之后表现为所有子载波“同步旋转”。这是5G专门引入相位跟踪参考信号(PTRS)的直接动因——在高频大带宽下,用参考信号持续估计并纠正这个旋转。你看到星座图一符号转一点、越转越歪,先查频偏和相位噪声,再查PTRS配置。
  2. 星座随子载波序号呈“斜坡”式旋转 → 采样钟偏移(SCO)。收发采样时钟不同步时,相位误差随子载波索引线性增长,且符号越积越歪。典型指纹:低号子载波正常、高号子载波发散。
  3. 频谱“裙边”过宽、邻道泄漏超标 → 不是FFT的错,是矩形窗的错。IFFT天然输出的符号若直接截断,频域是sinc形状的旁瓣裙边。现网用加窗(WOLA)或滤波(滤波器组多载波思路)压裙边,调试时别把带外泄漏锅甩给FFT实现。
  4. 定点实现比浮点精度差 → 逐级缩放没做对。硬件FFT多用定点运算,某百科词条明确指出定点FFT需要在每一级分解中做重定标来控制精度损失,否则误差随 $\sqrt{N}$ 增长。芯片联调时若发现高阶调制(256QAM以上)EVM余量莫名吃紧,检查FFT各级的缩放策略。
  5. 测试仪表的底层也是FFT。频谱仪、矢量信号分析、信道估计——它们把时域采样交给FFT才画出你要看的图。理解FFT点数、窗函数与频率分辨率的取舍(点数越多分辨率越细,但时间定位越模糊),你才读得懂仪表为什么这样设默认值。

一个常见的认知误区也顺带纠正:FFT和IFFT不是两个“模块”,而是同一枚硬币的两面。理解了“共轭+定标即可互换”这一恒等式,你就明白为什么基带芯片里FFT硬件可以收发共用、为什么实验室里用一块FPGA就能既当“迷你基站”又当“终端”。

九、结语

回到开头那只“数字耳朵”。从1805年高斯的手稿,到1965年为监测核试验而生的论文,再到今天每部5G手机每毫秒数十次的常规操作——FFT的故事告诉我们:通信标准里最深刻的设计,往往是最优雅的数学在工程上的投影。IFFT让“几百个子载波”从模拟难题变成一次数字运算;循环前缀让FFT的圆周卷积定理在多径信道上依然成立;可扩展参数集让同一套FFT框架同时服务浅覆盖广度和相位噪声恶劣的毫米波。看懂了这条主线,5G物理层的大半参数表都会从“要背的数字”变成“必然的推论”。

常见问题

Q: FFT和DFT到底是什么关系? A: DFT是数学变换的定义(一个N×N矩阵乘法),FFT是计算这个变换的高效算法家族(Cooley–Tukey是其中最著名的一种)。两者结果完全相同,但FFT把运算量从 $N^2$ 降到 $N\log N$。打个比方:DFT是“要去的目的地”,FFT是“通往那里的高速公路”。

Q: 为什么发射端用IFFT、接收端用FFT,而不是反过来? A: 因为信息原始形态是“每个子载波上一个QAM点”,天然是频域数据;发射需要“频域→时域”,即逆变换。但由于IFFT可以用“共轭→FFT→共轭→除N”实现,两者在工程上可互换,硬件常常复用。约定俗成用IFFT,只是让“赋值子载波”这个动作在数学书写上更直观。

Q: FFT点数为什么总大于实际占用的子载波数? A: 剩下的是“保护带”和过采样。例如100MHz信道、30kHz子载波间隔时4096点FFT最多可容纳4096个子载波,实际只占用中央约3276个(273个资源块),两侧留白抑制带外泄漏、给滤波器滚降留余量。点数取2的幂是为了radix-2蝶形结构最规整。

Q: 循环前缀填零不行吗,为什么要复制符号尾部? A: 填零破坏了信号的周期性,多径卷积后就不是圆周卷积,FFT后的频域单抽头均衡公式不再成立。复制尾部恰好让有限长信号“首尾相接”等效于周期延拓,多径回声落入CP段被丢弃后,剩余部分在数学上严格等于圆周卷积——这是“复制”而非“填零”的根本原因。

Q: 子载波间隔越宽越好吗? A: 不是,这是一组三角权衡。宽间隔抗相位噪声和多普勒、slot更短利于低时延,但CP相对开销上升、抗长时延扩展能力变差(CP时长从4.69μs缩到0.57μs);窄间隔则相反,适合低频大覆盖。5G用可扩展参数集让运营商按频段和业务各取所需,而不是“一种尺寸走天下”。

参考来源

  1. 5G Frame Structure - ShareTechnote — 5G参数集(子载波间隔/符号时长/CP时长/slot结构)参数表与帧结构图解
  2. Cooley & Tukey (1965), An algorithm for the machine calculation of complex Fourier series — FFT原始论文,发表于Mathematics of Computation
  3. Heideman, Johnson & Burrus (1984), Gauss and the history of the fast Fourier transform — 考证高斯1805年手稿中FFT思想的历史文献
  4. Dongarra & Sullivan (2000), Guest Editors' Introduction to the top 10 algorithms — FFT入选"20世纪十大算法"的出处

本文由「51学通信」技术团队出品。51学通信由通信行业18年老兵爱卫生(微信ID: gprshome201101)维护,聚焦5G/6G核心网、3GPP标准解读、通信前沿技术深度分析。 出版作品有《5G核心网原理与实践》《IMS原理与实践》等4本通信专业书籍。知识星球「51学通信」提供深度技术答疑和行业洞察。

[!tip] 51学通信知识星球 星主:爱卫生(微信:gprshome201101)——公众号「51学通信」创办者,19 年通信行业运维与讲师经验,著有《GPRS网络信令实例详解》《EPC原理与实践》《5G核心网原理与实践》三本纸质书(各大电商平台有售)。 星球定位:深耕 5G 核心网、IMS、NFV/AI、云原生等 ICT 领域,主打运维岗位与信令分析。 当前规模:5200 篇主题 / 990 个回答,198 元/年。 加入福利:加入星球后请加爱卫生微信,拉您进知识星球年度陪伴与答疑群——不限量回复您的各种问题,另有群内分享。 AI 加持:51学通信知识星球已作为 skill 接入 WorkBuddy,使用 deepseek-4-flash 在海量星球帖子中精准找贴、找视频、找 FAQ 和案例,做总结、找文档和 PPT 等场景全覆盖。

51学通信知识星球海报-扫码加入