如果把5G无线通信比作一条高速公路,那么FFT就是铺路的压路机,LDPC码是运货卡车的安全气囊,Polar码则是交通信号灯的防呆设计。三者各司其职,缺一不可。
很多1-3年经验的通信工程师,日常工作可能都在配置参数、抓包分析、处理工单。但当你遇到这些问题时:
答案都藏在信号处理的基本原理里。理解了底层逻辑,调试时才能有的放矢,而不是靠"经验值"盲调。
本文将从三个核心模块展开:
| 模块 | 核心问题 | 在5G中的角色 |
|---|---|---|
| FFT/IFFT | 如何高效地在时域和频域之间转换? | OFDM调制/解调的数学引擎 |
| LDPC码 | 如何在高速数据传输中纠错? | 数据信道(PDSCH/PUSCH)的编码方案 |
| Polar码 | 如何在短块长控制信息中保证可靠传输? | 控制信道(PDCCH/PUCCH)的编码方案 |
想象你走进一家冰淇淋店,面前有100种口味。老板需要知道每种口味还剩多少库存。
笨办法(DFT):每种口味逐一清点,100种口味需要检查100×100=10000次——因为每种口味的库存可能和所有其他口味有关联。
聪明办法(FFT):老板发现口味有规律——水果类、巧克力类、坚果类各自独立。先按大类分组清点,再逐层细化。利用这种结构,100种口味只需要约100×6.6=660次操作就能完成。
这就是FFT的核心思想:利用数据的内在结构(周期性、对称性),把计算量从O(N²)降到O(N log N)。
离散傅里叶变换(DFT)的公式:
$$X[k] = \sum_{n=0}^{N-1} x[n] \cdot e^{-j\frac{2\pi}{N}nk}, \quad k = 0, 1, \ldots, N-1$$
逆变换(IDFT):
$$x[n] = \frac{1}{N}\sum_{k=0}^{N-1} X[k] \cdot e^{j\frac{2\pi}{N}nk}, \quad n = 0, 1, \ldots, N-1$$
直觉解读: - DFT是在问:"我这个时域信号x[n]里,含有多少频率为k的分量?" - 每一个X[k]就是一个频率分量的"身份证",包含幅度和相位信息 - $e^{-j\frac{2\pi}{N}nk}$ 就是那个"探测探针",在不同的时间点n去"感受"频率k的存在
FFT之所以快,靠的是蝶形运算(Butterfly Operation)。这是整个算法的最小计算单元。
一个基本的2点蝶形运算:
输入A ──────┬────── 输出: A + W·B
│
×W(旋转因子)
│
输入B ──────┴────── 输出: A - W·B
其中旋转因子 $W_N^k = e^{-j2\pi k/N}$。
为什么叫"蝶形"? 因为在信号流图中,两条线交叉后又分开,形状像蝴蝶展翅。
graph LR
subgraph "蝶形运算基本单元"
A["输入 A"] --> ADD["⊕"]
A --> SUB["⊖"]
B["输入 B"] --> MUL["× W_N^k"]
MUL --> ADD
MUL --> SUB
ADD --> OUT1["输出: A + W·B"]
SUB --> OUT2["输出: A - W·B"]
end
style A fill:#e1f5fe
style B fill:#e1f5fe
style OUT1 fill:#c8e6c9
style OUT2 fill:#c8e6c9
style MUL fill:#fff9c4
蝶形运算的关键性质: - 每个蝶形只需要1次复数乘法和2次复数加法 - 可以原地计算(In-place):输出直接覆盖输入,不需要额外存储空间 - 多级蝶形串联,级联完成全部N点变换
N=8的FFT需要 $\log_2(8) = 3$ 级蝶形运算,每级4个蝶形:
graph TD
subgraph "第1级"
x0["x(0)"] --> b1a["蝶形"]
x4["x(4)"] --> b1a
x2["x(2)"] --> b1b["蝶形"]
x6["x(6)"] --> b1b
x1["x(1)"] --> b1c["蝶形"]
x5["x(5)"] --> b1c
x3["x(3)"] --> b1d["蝶形"]
x7["x(7)"] --> b1d
end
subgraph "第2级"
b1a --> b2a["蝶形"]
b1b --> b2a
b1c --> b2b["蝶形"]
b1d --> b2b
b1a --> b2c["蝶形"]
b1b --> b2c
b1c --> b2d["蝶形"]
b1d --> b2d
end
subgraph "第3级"
b2a --> b3a["蝶形 → X(0)"]
b2b --> b3a
b2a --> b3b["蝶形 → X(4)"]
b2b --> b3b
b2c --> b3c["蝶形 → X(2)"]
b2d --> b3c
b2c --> b3d["蝶形 → X(6)"]
b2d --> b3d
end
style x0 fill:#bbdefb
style x4 fill:#bbdefb
style x2 fill:#bbdefb
style x6 fill:#bbdefb
style x1 fill:#bbdefb
style x5 fill:#bbdefb
style x3 fill:#bbdefb
style x7 fill:#bbdefb
注意:输入序列需要先做比特逆序(Bit Reversal)排列。比如x(0)→位置0(000),x(4)→位置1(100→001),x(2)→位置2(010),x(6)→位置3(110→011)……
| 参数 | DFT | FFT (基2) |
|---|---|---|
| 复数乘法次数 | N² | $\frac{N}{2}\log_2 N$ |
| N=1024时 | 1,048,576次 | 5,120次 |
| 加速比 | 1× | ~200× |
| N=2048时 | 4,194,304次 | 11,264次 |
| 加速比 | 1× | ~370× |
在5G NR中,一个OFDM符号的子载波数可达4096个(FR1最大FFT size),如果用DFT,每次变换需要1600万次乘法;用FFT只需要约5万次。这就是为什么OFDM在4G时代之前不敢用,直到DSP芯片能快速做FFT后才大规模商用。
flowchart TD
subgraph "发送端"
BITS["数据比特"] --> QAM["QAM映射"]
QAM --> S2P["串并转换\nN路并行"]
S2P --> IFFT["IFFT\nN点逆FFT"]
IFFT --> ADDCP["加循环前缀CP"]
ADDCP --> DAC["DAC → 射频发射"]
end
subgraph "无线信道"
CHANNEL["多径衰落\n噪声干扰"]
end
subgraph "接收端"
ADC["射频 → ADC"] --> REMCP["去循环前缀CP"]
REMCP --> FFT["FFT\nN点FFT"]
FFT --> P2S["并串转换"]
P2S --> DEMAP["QAM解映射"]
DEMAP --> DECODE["信道解码"]
DECODE --> RBITS["恢复数据比特"]
end
DAC --> CHANNEL
CHANNEL --> ADC
style IFFT fill:#ffcdd2
style FFT fill:#c8e6c9
关键理解: - 发送端用IFFT:把频域的N个QAM符号"合成"成一个时域OFDM符号。一个IFFT运算替代了N个独立振荡器——用数学运算取代了硬件。 - 接收端用FFT:把收到的时域OFDM符号"分解"回N个频域子载波数据。 - 之所以用IFFT发射、FFT接收,是因为IFFT把频域→时域(合成波形),FFT把时域→频域(分析频率成分),方向恰好相反。
调试OFDM信号时: - 如果在频域看到某些子载波功率异常偏低,可能是FFT窗口偏移导致采样点对不齐 - 如果时域波形PAPR(峰均比)过高,IFFT输出会出现大幅度的峰值——这是OFDM的固有缺陷 - 5G NR FR1常用FFT size:4096(最大带宽100MHz),FR2可达8192
无线信道不靠谱——噪声、干扰、衰落随时可能把你的"0"翻成"1"。信道编码的本质就是给数据加冗余,让接收端即使收到部分错误,也能纠正回来。
打个比方:你口述一个电话号码"13812345678",怕对方听错,你会说"138,一二三八的1三八,12345678"。这个重复和强调就是"冗余"。信道编码做的就是这件事,只不过用数学方法更高效。
LDPC(Low-Density Parity-Check,低密度奇偶校验码)由Robert Gallager在1962年提出,但直到1990年代才被"重新发现"并广泛应用。
"低密度"是什么意思? 校验矩阵H中绝大多数元素是0,只有极少数是1。
举个4×8的小例子:
$$H = \begin{bmatrix} 1 & 1 & 0 & 1 & 0 & 0 & 0 & 0 \ 0 & 1 & 1 & 0 & 1 & 0 & 0 & 0 \ 0 & 0 & 0 & 1 & 0 & 1 & 1 & 0 \ 1 & 0 & 1 & 0 & 0 & 0 & 0 & 1 \end{bmatrix}$$
这个矩阵中,32个元素只有10个是1——密度很低。正是这种稀疏性让LDPC可以高效解码。
LDPC码最直观的理解方式是通过Tanner图——一种二分图,左边是变量节点(数据位),右边是校验节点(约束方程),边连接参与同一校验的数据位。
graph LR
subgraph "变量节点(数据位)"
v1["v₁"]
v2["v₂"]
v3["v₃"]
v4["v₄"]
v5["v₅"]
v6["v₆"]
v7["v₇"]
v8["v₈"]
end
subgraph "校验节点(约束方程)"
c1["c₁"]
c2["c₂"]
c3["c₃"]
c4["c₄"]
end
v1 --- c1
v2 --- c1
v4 --- c1
v2 --- c2
v3 --- c2
v5 --- c2
v4 --- c3
v6 --- c3
v7 --- c3
v1 --- c4
v3 --- c4
v8 --- c4
style v1 fill:#bbdefb
style v2 fill:#bbdefb
style v3 fill:#bbdefb
style v4 fill:#bbdefb
style v5 fill:#bbdefb
style v6 fill:#bbdefb
style v7 fill:#bbdefb
style v8 fill:#bbdefb
style c1 fill:#ffcdd2
style c2 fill:#ffcdd2
style c3 fill:#ffcdd2
style c4 fill:#ffcdd2
LDPC的解码不像传统编码那样"解方程",而是在Tanner图上做消息传递(Message Passing)——也叫置信传播(Belief Propagation)算法。
通俗类比:想象一个侦探团队在破案。每个变量节点是一个"嫌疑人"(不确定自己是否有罪),每个校验节点是一个"侦探"(根据线索判断嫌疑人是否有罪)。他们反复交换信息:
这个过程在数学上是迭代计算每个比特的后验概率,直到收敛或达到最大迭代次数。
5G NR采用了准循环LDPC(QC-LDPC)编码,具有以下特点:
| 特性 | 说明 |
|---|---|
| 两张基本图(BG) | BG1用于大块/高码率,BG2用于小块/低码率 |
| 提升(Lifting) | 将小的基础矩阵扩展为大的校验矩阵,便于硬件并行实现 |
| 速率匹配 | 通过打孔(Puncturing)和缩短(Shortening)支持任意码率 |
| 支持的最大码块 | 8448 bits(BG1)/ 3840 bits(BG2) |
为什么LDPC适合数据信道? - 数据信道传输的是大块数据(几十到几千字节),LDPC在长码块时性能极佳 - LDPC解码器天然支持高度并行化,能满足5G eMBB场景多Gbps吞吐量需求 - 错误平层(Error Floor)极低,可达 $10^{-15}$ 级别
2009年,土耳其裔学者Erdal Arıkan发表了论文《Channel Polarization》,证明了一种全新的编码方法可以达到信道容量极限——这是信息论领域几十年来追求的圣杯。
什么是信道容量? 香农在1948年指出:任何信道都有一个最大传输速率,超过这个速率就无法可靠通信。但香农只证明了这个极限存在,没有给出具体怎么构造编码来达到它。Polar码是第一种被严格证明能达到信道容量的编码方案。
极化(Polarization) 是理解Polar码的关键。想象你有一组N个质量相同的信道。通过一种特定的变换,这些信道会发生"极化"——有的变成完美信道(容量→1,几乎不犯错),有的变成完全无用信道(容量→0,信息全丢)。
极化前: [0.5] [0.5] [0.5] [0.5] [0.5] [0.5] [0.5] [0.5]
↓ 信道极化变换 ↓
极化后: [1.0] [1.0] [0.9] [0.95] [0.2] [0.1] [0.0] [0.0]
↑好信道↑ ↑还行↑ ↑差信道↑ ↑废了↑
核心策略:把真正要传的信息放在好信道上,把固定的已知比特(冻结位,通常是0)放在差信道上。
Polar码的核心是生成矩阵,通过Kronecker积构造:
$$G_N = \begin{bmatrix} 1 & 0 \ 1 & 1 \end{bmatrix}^{\otimes n}$$
其中 $\otimes n$ 表示n次Kronecker积,$N = 2^n$。
以N=4(n=2)为例:
$$G_4 = \begin{bmatrix} 1 & 0 \ 1 & 1 \end{bmatrix}^{\otimes 2} = \begin{bmatrix} 1 & 0 & 0 & 0 \ 1 & 1 & 0 & 0 \ 1 & 0 & 1 & 0 \ 1 & 1 & 1 & 1 \end{bmatrix}$$
编码过程就是简单的矩阵乘法:$x = u \cdot G_N$
其中 $u$ 是输入向量,前 $K$ 位放信息比特,后 $N-K$ 位放冻结比特(0)。
graph TD
subgraph "极化前:8个等质量信道"
ch1["信道1\n容量≈0.5"]
ch2["信道2\n容量≈0.5"]
ch3["信道3\n容量≈0.5"]
ch4["信道4\n容量≈0.5"]
ch5["信道5\n容量≈0.5"]
ch6["信道6\n容量≈0.5"]
ch7["信道7\n容量≈0.5"]
ch8["信道8\n容量≈0.5"]
end
subgraph "极化变换"
POLAR["信道极化\nG_N = F⊗n"]
end
subgraph "极化后:信道分化"
good1["信道1\n容量≈1.0 ✅"]
good2["信道2\n容量≈1.0 ✅"]
good3["信道3\n容量≈0.9 ✅"]
mid["信道4\n容量≈0.7 ⚠️"]
bad1["信道5\n容量≈0.3 ⚠️"]
bad2["信道6\n容量≈0.1 ❌"]
bad3["信道7\n容量≈0.0 ❌"]
bad4["信道8\n容量≈0.0 ❌"]
end
ch1 --> POLAR
ch2 --> POLAR
ch3 --> POLAR
ch4 --> POLAR
ch5 --> POLAR
ch6 --> POLAR
ch7 --> POLAR
ch8 --> POLAR
POLAR --> good1
POLAR --> good2
POLAR --> good3
POLAR --> mid
POLAR --> bad1
POLAR --> bad2
POLAR --> bad3
POLAR --> bad4
good1 -.- info1["→ 放信息比特"]
good2 -.- info2["→ 放信息比特"]
good3 -.- info3["→ 放信息比特"]
bad2 -.- frozen1["→ 放冻结比特(0)"]
bad3 -.- frozen2["→ 放冻结比特(0)"]
bad4 -.- frozen3["→ 放冻结比特(0)"]
style good1 fill:#c8e6c9
style good2 fill:#c8e6c9
style good3 fill:#c8e6c9
style bad2 fill:#ffcdd2
style bad3 fill:#ffcdd2
style bad4 fill:#ffcdd2
style mid fill:#fff9c4
style bad1 fill:#fff9c4
Polar码的解码主要有以下几种:
| 解码算法 | 复杂度 | 性能 | 适用场景 |
|---|---|---|---|
| SC(逐次消除) | O(N log N) | 中等 | 理论分析、低复杂度场景 |
| SCL(列表消除) | O(L·N log N) | 好 | L为列表大小(8、16、32) |
| CA-SCL(CRC辅助列表) | O(L·N log N) | 优秀 | 5G NR实际采用 |
CA-SCL解码的巧妙之处:先用CRC校验码对信息比特做一次"封印",解码时从L条候选路径中选CRC校验通过的那条。这相当于给Polar码加了一层"保底机制"——即使Polar码本身性能有波动,CRC也能帮你选出正确答案。
flowchart TD
Q["5G控制信道特点"] --> A["短块长\n(20-140 bits)"]
Q --> B["低码率\n(1/8 ~ 1/2)"]
Q --> C["极低BLER要求\n(<1%)"]
A --> D{哪种编码最适合?}
B --> D
C --> D
D -->|"短块长表现"| E["Polar码 ✅\n短块长时BLER最优"]
D -->|"短块长表现"| F["LDPC码 ❌\n短块长性能下降明显"]
D -->|"短块长表现"| G["Turbo码 ❌\n复杂度高且性能不如Polar"]
E --> H["5G NR决策:\nPolar码 → 控制信道\nLDPC码 → 数据信道"]
style E fill:#c8e6c9
style F fill:#ffcdd2
style G fill:#ffcdd2
style H fill:#e1f5fe
核心原因: - 控制信息(DCI/UCI)通常只有20-140比特,Polar码在短码块时性能明显优于LDPC - Polar码的编码复杂度只有O(N log N),非常适合控制信道频繁的编解码需求 - Polar码的理论最优性(可达信道容量)给系统设计提供了性能保证
flowchart TD
subgraph "1. 信道编码"
INFO["原始信息比特"] --> CRC_ADD["加CRC校验"]
CRC_ADD --> CODE_SEL{"信道类型?"}
CODE_SEL -->|"数据信道"| LDPC_ENC["LDPC编码\n(BG1/BG2)"]
CODE_SEL -->|"控制信道"| POLAR_ENC["Polar编码\n(CA-SCL)"]
end
subgraph "2. 速率匹配与调制"
LDPC_ENC --> RM1["速率匹配"]
POLAR_ENC --> RM2["速率匹配"]
RM1 --> QAM["QAM映射\n(QPSK/16QAM/64QAM/256QAM)"]
RM2 --> QAM
end
subgraph "3. OFDM调制"
QAM --> S2P["串并转换\n分到N个子载波"]
S2P --> RE_MAP["资源映射\n(频域RE映射)"]
RE_MAP --> IFFT_MOD["IFFT\n生成时域OFDM符号"]
IFFT_MOD --> CP["加循环前缀CP"]
CP --> TX["射频发射"]
end
style LDPC_ENC fill:#ffcdd2
style POLAR_ENC fill:#c8e6c9
style IFFT_MOD fill:#bbdefb
| 阶段 | 技术模块 | 解决的问题 | 类比 |
|---|---|---|---|
| 频域↔时域转换 | FFT/IFFT | 高效实现多载波调制/解调 | 铺路——建立传输通道 |
| 数据纠错 | LDPC码 | 大块数据在噪声信道中的可靠传输 | 卡车安全气囊——保护大批货物 |
| 控制纠错 | Polar码 | 短块控制信息的精准传输 | 信号灯防呆——确保指令无误 |
| 对比项 | 4G LTE | 5G NR |
|---|---|---|
| 数据信道编码 | Turbo码 | LDPC码 |
| 控制信道编码 | Tail-biting卷积码 | Polar码 |
| 最大码块大小 | 6144 bits | 8448 bits (BG1) |
| 解码吞吐量 | ~1 Gbps | >10 Gbps |
| 目标BLER | 10⁻⁶ | 10⁻⁵ (数据) / 10⁻² (控制) |
为什么4G的Turbo码被淘汰了? - Turbo码在高吞吐量下解码复杂度太高,难以满足5G eMBB的10Gbps需求 - Turbo码存在"水床效应"——性能优化到一个点后很难再提升 - LDPC和Polar的组合在各个方面都优于Turbo+卷积码的组合
场景1:OFDM频偏补偿 - 现象:频域子载波上出现"倾斜"的幅度谱 - 原因:FFT窗口起点偏移,等效于时域引入了相位旋转 - 解决:利用CP做 fine timing adjustment,或利用导频做频偏估计和补偿
场景2:PAPR过高导致功放非线性 - 现象:EVM(误差矢量幅度)恶化,频域出现带外辐射 - 原因:IFFT后多个子载波同相叠加产生高峰值 - 解决:5G NR支持DMRS和PTRS(相位跟踪参考信号)来辅助补偿
场景3:高码率下BLER偏高 - 检查BG选择:码块>3824 bits时必须用BG1,否则性能下降 - 检查速率匹配参数:打孔过多会导致解码失败 - 检查迭代次数:LDPC通常8-20次迭代,太少会性能差,太多会增加时延
场景4:解码不收敛 - 检查信道估计质量:LDPC解码对信道估计误差很敏感 - 检查量化精度:硬件实现中,消息传递的定点量化位宽不足会导致性能劣化
场景5:DCI解码失败 - 检查列表大小L:5G NR终端通常支持L=8的CA-SCL,确保参数配置正确 - 检查冻结位集合:冻结位位置由信道质量决定(通过信令或预定义表),配置错误会全盘失败 - 检查CRC:CA-SCL依赖CRC做最终路径选择,CRC多项式必须与标准一致
Q1: FFT和IFFT有什么区别?发送端为什么用IFFT而不是FFT? A: FFT是时域→频域(分析),IFFT是频域→时域(合成)。在OFDM系统中,发送端需要把频域的多个QAM符号合成一个时域波形发射出去,所以用IFFT(频域→时域)。接收端需要把时域波形分解回各子载波的频域数据,所以用FFT(时域→频域)。记住口诀:"IFFT发、FFT收"。
Q2: LDPC码和Polar码能不能互换使用? A: 理论上可以,但性能会很差。LDPC在短码块(<200 bits)时错误平层较高,不适合控制信道;Polar码在长码块时解码复杂度急剧上升,不适合高速数据信道。5G NR的分工是经过大量仿真评估后的最优选择。
Q3: 为什么5G不用Turbo码了? A: 三个原因:(1) Turbo码的串行解码结构难以并行化,达不到5G的吞吐量要求;(2) LDPC在长码、Polar在短码上分别优于Turbo码;(3) Turbo码的解码复杂度约为O(N·iter·states),随块长增长更快。LDPC的并行解码架构更适合硬件实现。
Q4: Polar码的"极化"是物理过程还是数学变换? A: 纯数学变换。通过对输入比特做特定的线性变换(Kronecker积),使得等效的"子信道"出现容量分化。好的子信道传输信息比特,差的子信道传固定的冻结比特。这个过程完全在编解码器内部完成,与物理信道无关。
Q5: 实际基带芯片中FFT点数是多少? A: 5G NR FR1(Sub-6GHz)典型FFT size为4096(支持100MHz带宽,子载波间隔30kHz时);FR2(毫米波)可达8192。但实际使用时,并非所有子载波都承载数据——边缘子载波作为保护带留空,中间部分用于数据和控制。有效子载波数通常为FFT size的60%-80%。
本文由「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 等场景全覆盖。
