想象一个场景:你对着手机说了一句"你好",几毫秒后,千里之外的朋友听到了。这中间发生了什么?你的声音先变成了一串0和1,然后这些比特经过傅里叶变换被"翻译"成电磁波的形态,再通过信道编码穿上"防弹衣"抵御噪声干扰,最后以光速飞向远方。
这三件事——信号的频域转换(FFT/IFFT)和纠错保护(LDPC/Polar码)——构成了现代通信最底层的信号处理基石。今天我们不讲公式推导,而是用直觉和图解,搞清楚这些技术为什么这样设计。
你听到一段交响乐,里面有提琴、长笛、鼓声混在一起。傅里叶变换就像一个超级耳朵,能告诉你:这段音乐里有440Hz的提琴声(强度0.8)、880Hz的长笛声(强度0.3)、220Hz的大鼓声(强度0.5)。
时域看到的是波形随时间的变化,频域看到的是每个频率成分的强度。两者描述的是同一个信号,只是视角不同。
离散傅里叶变换(DFT)的公式为:
$$X[k] = \sum_{n=0}^{N-1} x[n] \cdot e^{-j\frac{2\pi}{N}kn}, \quad k = 0, 1, \ldots, N-1$$
其中 $x[n]$ 是时域的第 $n$ 个采样点,$X[k]$ 是频域的第 $k$ 个频率分量,$j$ 是虚数单位。
直觉上理解:每个 $X[k]$ 就是把信号 $x[n]$ 和一个频率为 $k$ 的"标准正弦波"做点积。点积越大,说明信号中包含该频率成分越多。这就是"投影"的思想——把信号投影到一组正交基底上。
直接计算DFT需要 $O(N^2)$ 次运算——对 $N$ 个输出,每个输出需要 $N$ 次乘加。当 $N=1024$ 时,需要约100万次运算。
1965年,Cooley和Tukey提出了快速傅里叶变换(FFT)算法,把复杂度降到 $O(N \log_2 N)$。对 $N=1024$,只需要约1万次运算——提速100倍。
FFT的核心思想是分治:把一个 $N$ 点DFT拆成两个 $N/2$ 点DFT,再拆成四个 $N/4$ 点DFT……直到只剩2点DFT。这个过程不断递归,形成标志性的蝶形运算(Butterfly Operation)。
graph TD
subgraph "8点FFT蝶形图"
X0["x[0]"] --> B1["蝶形<br/>+W⁰"]
X4["x[4]"] --> B1
X1["x[1]"] --> B2["蝶形<br/>+W⁰"]
X5["x[5]"] --> B2
X2["x[2]"] --> B3["蝶形<br/>+W⁰"]
X6["x[6]"] --> B3
X3["x[3]"] --> B4["蝶形<br/>+W⁰"]
X7["x[7]"] --> B4
B1 --> S1["Stage 2<br/>蝶形"]
B2 --> S1
B3 --> S2["Stage 2<br/>蝶形"]
B4 --> S2
S1 --> F1["Stage 3<br/>蝶形"]
S2 --> F1
F1 --> OUT["X[0]~X[7]<br/>频域输出"]
end
style X0 fill:#e1f5fe
style X4 fill:#e1f5fe
style OUT fill:#c8e6c9
每个蝶形运算做两件事:
$$A_{out} = A_{in} + W_N^k \cdot B_{in}$$ $$B_{out} = A_{in} - W_N^k \cdot B_{in}$$
其中 $W_N^k = e^{-j\frac{2\pi k}{N}}$ 称为旋转因子(Twiddle Factor),本质上是一个复数旋转操作。
IFFT(逆FFT)是FFT的逆运算,把频域信号变回时域:
$$x[n] = \frac{1}{N} \sum_{k=0}^{N-1} X[k] \cdot e^{j\frac{2\pi}{N}kn}$$
区别只在指数符号(正号)和前面的 $1/N$ 系数。在硬件实现中,FFT和IFFT可以用同一个电路,只改变旋转因子的符号即可——这就是为什么通信芯片里通常只有一个FFT/IFFT复用模块。
| 特性 | DFT | FFT | IFFT |
|---|---|---|---|
| 功能 | 时域→频域 | 时域→频域(高效) | 频域→时域(高效) |
| 复杂度 | $O(N^2)$ | $O(N \log_2 N)$ | $O(N \log_2 N)$ |
| N=1024运算量 | ~1,048,576 | ~10,240 | ~10,240 |
| 旋转因子 | $e^{-j2\pi kn/N}$ | $e^{-j2\pi kn/N}$ | $e^{+j2\pi kn/N}$ |
| 硬件复用 | - | 同一电路可复用为IFFT | 同一电路可复用为FFT |
OFDM(正交频分复用)是4G/5G的核心多载波技术。它的想法很简单:把高速数据流分成很多低速数据流,分别调制到不同的子载波上并行传输。
如果没有FFT,实现OFDM需要一个子载波配一个振荡器(混频器)。5G的FFT Size可达4096,意味着需要4096个振荡器——完全不可行。
FFT/IFFT的妙处在于:用数学运算代替了大量硬件振荡器。IFFT一次性把所有子载波的频域数据"合成"成一个时域波形,FFT一次性把接收到的时域波形"拆解"回各个子载波的数据。
graph TD
subgraph "发射端"
Bits["输入比特流"] --> Mod["QAM映射"]
Mod --> SC["子载波映射<br/>频域数据X[0]...X[N-1]"]
SC --> IFFT["IFFT<br/>频域→时域"]
IFFT --> CP["加循环前缀CP"]
CP --> DAC["DAC+射频发送"]
end
subgraph "接收端"
ADC["射频接收+ADC"] --> RCP["去循环前缀CP"]
RCP --> FFT_B["FFT<br/>时域→频域"]
FFT_B --> EQ["信道均衡"]
EQ --> Demod["QAM解映射"]
Demod --> OutBits["输出比特流"]
end
DAC -->|无线信道| ADC
style IFFT fill:#ffecb3
style FFT_B fill:#ffecb3
假设5G NR的参数: - 信道带宽:100 MHz - 子载波间隔:30 kHz - FFT Size:$N = 4096$ - 有效子载波数:约3276个(其余为保护带)
发射端流程: 1. 待发送的比特经过QAM映射(如256-QAM,每符号8比特) 2. QAM符号被映射到4096个频域子载波上 3. 对4096点频域数据做IFFT,得到4096个时域采样点(一个OFDM符号) 4. 复制尾部若干采样到头部,形成循环前缀(CP) 5. 通过DAC变成模拟信号,调制到射频发送
接收端流程: 1. 接收、采样、去掉CP 2. 对4096点时域数据做FFT,恢复出各子载波的频域数据 3. 信道均衡(补偿无线信道的衰落) 4. QAM解映射,恢复比特
关键洞察:OFDM中,IFFT就是"调制器",FFT就是"解调器"。这不是巧合——IFFT的数学定义恰好等价于把多个正弦波叠加在一起,这正是OFDM发送端要做的事。
无线信道充满噪声、干扰和衰落。你发送的"1",接收端可能误判为"0"。信道编码的思路是:发送前给数据加上冗余比特,接收端利用冗余信息发现和纠正错误。
这就像你寄快递时在箱子里塞泡沫——泡沫本身不是货物,但它保护货物不被损坏。代价是:箱子变大了(需要更多带宽)。
香农定理告诉我们:只要编码速率 $R$ 不超过信道容量 $C$,就存在一种编码方案可以实现无差错传输:
$$C = B \cdot \log_2(1 + \text{SNR})$$
其中 $B$ 是带宽,SNR 是信噪比。信道编码技术的发展史,就是不断逼近香农极限的历史。
graph TD
subgraph "信道编码发展历程"
T1["1950s<br/>汉明码<br/>Hamming Code<br/>~香农限3dB"]
T2["1960s<br/>Reed-Solomon码<br/>RS码<br/>~香农限2.5dB"]
T3["1993<br/>Turbo码<br/>逼近香农限0.5dB<br/>3G/4G使用"]
T4["1996重发现<br/>LDPC码<br/>逼近香农限0.0045dB<br/>5G数据信道"]
T5["2009<br/>Polar码<br/>达到香农极限<br/>5G控制信道"]
T1 --> T2 --> T3 --> T4 --> T5
end
style T4 fill:#ffecb3
style T5 fill:#c8e6c9
| 概念 | 含义 | 通俗类比 |
|---|---|---|
| 信息比特 | 原始要发送的数据 | 快递中的货物 |
| 冗余比特 | 为纠错添加的额外比特 | 箱子里的泡沫 |
| 码率 R | 信息比特数 / 总比特数 | 货物占总重量的比例 |
| 编码增益 | 为达到同样误码率,编码后可容忍的SNR降低量 | 泡沫的抗冲击效果 |
| 码字 | 编码后的完整比特序列 | 封装好的快递箱 |
LDPC(Low-Density Parity-Check,低密度奇偶校验码)最早由Gallager在1962年提出,但因为计算复杂度太高,被遗忘了30多年。直到1996年,MacKay和Neal重新发现它,证明其性能可以极其接近香农极限。
"低密度"指的是什么?——LDPC码的校验矩阵 $H$ 中,1的个数非常稀疏。比如一个1000×2000的矩阵,可能只有几千个1(密度不到1%)。这种稀疏性使得译码可以在Tanner图上用消息传递算法高效实现。
假设一个简单的(6,3) LDPC码,信息位3比特,码长6比特,校验矩阵为:
$$H = \begin{bmatrix} 1 & 1 & 0 & 1 & 0 & 0 \ 0 & 1 & 1 & 0 & 1 & 0 \ 1 & 0 & 1 & 0 & 0 & 1 \end{bmatrix}$$
对应的Tanner图如下:
graph LR
subgraph "变量节点(比特位)"
V1["c₁"]
V2["c₂"]
V3["c₃"]
V4["c₄"]
V5["c₅"]
V6["c₆"]
end
subgraph "校验节点(校验方程)"
C1["f₁: c₁⊕c₂⊕c₄=0"]
C2["f₂: c₂⊕c₃⊕c₅=0"]
C3["f₃: c₁⊕c₃⊕c₆=0"]
end
V1 --- C1
V2 --- C1
V4 --- C1
V2 --- C2
V3 --- C2
V5 --- C2
V1 --- C3
V3 --- C3
V6 --- C3
style V1 fill:#e3f2fd
style V2 fill:#e3f2fd
style V3 fill:#e3f2fd
style V4 fill:#fff3e0
style V5 fill:#fff3e0
style V6 fill:#fff3e0
style C1 fill:#fce4ec
style C2 fill:#fce4ec
style C3 fill:#fce4ec
Tanner图中的两种节点: - 变量节点(Variable Node):对应码字中的每个比特 - 校验节点(Check Node):对应每个校验方程
边连接了参与该校验方程的比特。低密度意味着每个节点连接的边数很少。
LDPC的译码过程是一个"投票协商"的过程:
直觉理解:就像一群人投票决定答案,每个人都先根据自己掌握的信息给出判断,然后互相讨论、修正意见,最终达成共识。迭代越多,共识越准确。
5G NR为LDPC码设计了两个基础图(Base Graph):
| 参数 | BG1(大数据) | BG2(小数据) |
|---|---|---|
| 适用场景 | eMBB大包传输 | URLLC/小包传输 |
| 最大码长 | 8448比特 | 3840比特 |
| 支持码率 | 1/3 ~ 8/9 | 1/5 ~ 5/6 |
| 典型信道 | PDSCH/PUSCH | PDSCH/PUSCH(小包) |
| 结构特点 | 更大的矩阵,更精细的调控 | 更紧凑,适合短码 |
为什么5G选LDPC而不是继续用Turbo码?
2009年,土耳其科学家Erdal Arıkan发表了一篇论文,提出了信道极化(Channel Polarization)理论,并据此构造了Polar码。这是历史上第一个被严格证明可以达到香农极限的编码方案。
信道极化的核心思想:通过递归的信道变换,把N个相同质量的"中等"信道,变成一部分"完美"信道和一部分"无用"信道。
graph TD
subgraph "信道极化过程(N=8)"
W["W: 8个相同质量的信道<br/>(容量≈0.5)"]
W --> S1["第一级变换<br/>4个稍好 + 4个稍差"]
S1 --> S2["第二级变换<br/>2个更好 + 2个好 + 2个差 + 2个更差"]
S2 --> S3["第三级变换<br/>完全极化"]
S3 --> G["✓ 完美信道<br/>容量≈1.0<br/>放信息比特"]
S3 --> B["✗ 无用信道<br/>容量≈0.0<br/>放固定比特(冻结)"]
end
style W fill:#fff9c4
style G fill:#c8e6c9
style B fill:#ffcdd2
类比:想象8个水桶,初始水位一样(都是半满)。通过一种特殊的"搬水"操作:把相邻两个桶的水重新分配——一个多给点,一个少给点。经过几轮操作后,有些桶满了,有些桶空了。你当然会把珍贵的货物(信息)放在满桶里。
Polar码的编码过程基于一个核心矩阵:
$$G_N = B_N F^{\otimes n}$$
其中 $F = \begin{bmatrix} 1 & 0 \ 1 & 1 \end{bmatrix}$,$F^{\otimes n}$ 表示 $F$ 的 $n$ 次Kronecker积,$B_N$ 是比特反转置换矩阵。
编码步骤: 1. 信道排序:根据信道可靠性排序,确定哪些位置"好"、哪些"差" 2. 比特放置:把 $K$ 个信息比特放在最可靠的 $K$ 个位置上 3. 冻结比特:其余 $N-K$ 个位置填充固定值(通常为0) 4. 矩阵乘法:用生成矩阵 $G_N$ 编码
Polar码最基本的译码算法是逐次消除(SC, Successive Cancellation)译码:
按顺序逐个估计每个比特——对信息比特位,根据接收信号和已译出的前序比特,计算该比特最可能是0还是1;对冻结比特位,直接输出0。
SC译码的问题是错误传播:如果第3个比特译错了,后面所有依赖第3个比特的译码都会受影响。
5G NR实际使用的是增强版——CRC辅助的列表译码(CA-SCL): - CRC:在编码前先加循环冗余校验 - 列表(List):同时保留 $L$ 条最可能的译码路径(如 $L=8$) - 路径选择:最后用CRC校验,选出通过CRC校验的那条路径
| 译码算法 | 复杂度 | 性能 | 5G是否使用 |
|---|---|---|---|
| SC(逐次消除) | $O(N \log N)$ | 中等,短码表现一般 | 基础算法 |
| SCL(列表译码,L=8) | $O(LN \log N)$ | 优秀,接近ML译码 | 实际使用 |
| CA-SCL(CRC+SCL) | $O(LN \log N)$ | 非常优秀 | 5G NR标准 |
控制信道的特点:传输的DCI/UCI信息通常很短(几十比特),但对可靠性要求极高——一条控制信令如果出错,可能导致整个调度失败。
| 特性 | LDPC码 | Polar码 |
|---|---|---|
| 最佳码长 | 中长码(>200比特) | 短码(<200比特) |
| 短码性能 | 较差 | 优异 |
| 译码延迟 | 较高(需多次迭代) | 较低(顺序译码) |
| 实现复杂度 | 中等 | 较低 |
| 5G用途 | 数据信道(PDSCH/PUSCH) | 控制信道(PDCCH/PUCCH/PBCH) |
| HARQ支持 | 天然支持 | 不典型使用 |
简单说:LDPC擅长扛大包(大数据吞吐),Polar擅长送急件(短而可靠的控制信令)。两者分工明确,互补搭配。
把FFT/IFFT和信道编码放在一起,看看5G信号处理的完整链路:
graph TD
subgraph "发射端处理链"
A["源比特"] --> B["信道编码<br/>LDPC/Polar"]
B --> C["比特交织"]
C --> D["QAM调制<br/>比特→符号"]
D --> E["子载波映射<br/>RE映射"]
E --> F["IFFT<br/>频域→时域"]
F --> G["加CP"]
G --> H["DAC+上变频<br/>→天线发射"]
end
subgraph "接收端处理链"
I["天线接收<br/>+下变频+ADC"] --> J["去CP"]
J --> K["FFT<br/>时域→频域"]
K --> L["信道估计<br/>&均衡"]
L --> M["QAM解调<br/>符号→LLR软信息"]
M --> N["解交织"]
N --> O["信道译码<br/>LDPC/Polar译码"]
O --> P["恢复比特"]
end
H -->|无线信道| I
style B fill:#ffecb3
style F fill:#c8e6c9
style K fill:#c8e6c9
style O fill:#ffecb3
这个链路中每个模块的职责: - 信道编码:加冗余,抵抗信道错误(黄色模块) - IFFT/FFT:实现OFDM调制/解调(绿色模块) - QAM调制:把比特映射成复数符号 - 信道估计与均衡:估计无线信道的衰落并补偿
常见问题1:CP长度不够导致ISI
当多径时延扩展超过CP长度时,FFT窗口内会混入前一个符号的干扰(码间干扰ISI)。表现为: - 频域上某些子载波的信号"旋转"失真 - 信道均衡无法完全补偿 - 误码率在特定时延条件下突增
排查方法:用信道冲激响应(CIR)工具观察多径时延分布,确认最大时延是否超过CP长度。5G NR的可扩展CP就是为了应对不同时延扩展场景。
常见问题2:FFT Size选择影响系统性能
FFT Size决定了OFDM的基本参数: - FFT Size越大 → 子载波越密集 → 频谱效率越高 → 但对多普勒频移越敏感 - FFT Size越小 → 符号越短 → 时延容忍度越低 → 但适合高速移动
5G NR定义了多种 numerology(子载波间隔),本质上就是在不同的FFT Size和CP之间权衡。
Q1: FFT和DFT有什么区别?为什么通信系统都用FFT?
A: DFT是数学定义,FFT是计算DFT的高效算法。区别就像"计算1+2+3+...+100"和"用公式(100×101)/2"的区别——结果一样,但FFT快得多($O(N \log N)$ vs $O(N^2)$)。通信系统对实时性要求极高,所以必须用FFT。实际上,今天说到"做傅里叶变换",几乎都是指FFT。
Q2: LDPC和Polar码可以互换使用吗?为什么5G不统一用一种?
A: 理论上可以,但不合理。LDPC在长码(几百到几千比特)场景性能优异,且天然支持并行译码和增量冗余HARQ,适合高速数据传输。Polar码在短码(几十到两百比特)场景性能更优,译码延迟更低,适合对可靠性要求极高的控制信令。5G让两者各司其职,是工程上的最优解。
Q3: 为什么OFDM发送端用IFFT而不是FFT?
A: 这是很多人的困惑。记住:IFFT把频域变时域,FFT把时域变频域。发送端有频域的子载波数据,需要变成时域波形才能通过天线发射,所以用IFFT。接收端收到时域波形,需要恢复出频域子载波数据,所以用FFT。
Q4: Polar码"达到香农极限"和LDPC"逼近香农极限"有什么区别?
A: 这是一个理论深度的问题。Polar码在码长 $N \to \infty$ 时,被严格数学证明可以达到香农极限——这是确定性保证。LDPC码虽然也能非常接近香农极限(差距可以小于0.01dB),但理论上始终是"逼近"而非"达到"。不过在实际有限码长下,LDPC和Polar的性能差异很小,工程选择更多考虑实现复杂度、吞吐率和灵活性。
Q5: 基站和手机的FFT模块一样吗?
A: 数学原理完全相同,但规模和实现不同。基站的FFT Size通常更大(如4096点,支持更大带宽),且需要同时处理多路信号(多用户MIMO),因此FFT引擎需要更强的并行处理能力。手机的FFT Size根据当前工作带宽确定(如100MHz用4096点,20MHz用1024点),功耗和面积是关键约束。但核心的蝶形运算电路是一样的。
本文由「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 等场景全覆盖。
