3. FEC编码基础:线性分组码、卷积码与Turbo码
说到FEC,咱们得先聊聊编码的基础。我刚开始搞通信那几年,总觉得编码就是个数学游戏,矩阵乘来乘去,多项式除来除去。直到有一次现场定位误码,折腾了三天没头绪,最后发现是编码器参数配错了——从那以后,我对每种编码的结构烂熟于心。
这一节,我们只讲四种最核心的编码:汉明码、循环码、卷积码和Turbo码。它们代表了FEC编码演进的主线。
3.1 线性分组码:汉明码
汉明码是最早的纠错码之一,结构特别清晰。
- 基本思想:在数据位后面附加几位校验位,这些校验位是数据位的线性组合。
- 经典参数:(7,4)汉明码——输入4位信息,输出7位码字,能纠正1个错误。
举个例子:对于(7,4)汉明码,信息比特为 d1 d2 d3 d4,校验位 p1 p2 p3 由下面的线性方程组给出:
p1 = d1 ⊕ d2 ⊕ d4
p2 = d1 ⊕ d3 ⊕ d4
p3 = d2 ⊕ d3 ⊕ d4
编码后的7位码字为 d1 d2 d3 d4 p1 p2 p3。
3.2 线性分组码:循环码
循环码是汉明码的升级版,引入了一个重要特性——循环移位。任何码字循环移位后,仍然是合法码字。
循环码的精髓在于用生成多项式描述编码过程。假设生成多项式为 g(x),信息多项式为 u(x),则:
c(x) = u(x) · g(x)
这种结构非常适合用线性反馈移位寄存器(LFSR)来实现,硬件成本低,速度快。
常用循环码举例
| 编码名称 | 生成多项式(示例) | 纠错能力 | 典型用途 |
|---|---|---|---|
| CRC-16 | x¹⁶ + x¹⁵ + x² + 1 | 检错 | 数据链路层校验 |
| BCH(63,51) | 由多个最小多项式构成 | 纠正2个错误 | 闪存纠错 |
| RS(255,239) | 基于有限域GF(2⁸) | 纠正8个符号 | CD/DVD、QR码 |
3.3 卷积码:维特比译码的核心伴侣
卷积码跟分组码完全不同。分组码是block by block,卷积码则是流式处理,编码输出不仅取决于当前输入,还依赖之前若干个输入。
卷积码的三个关键参数:(n, k, K)
k:每次输入的信息比特数n:每次输出的编码比特数K:约束长度,影响编码存储的历史深度
我习惯用网格图(Trellis)来理解卷积码。每个时刻状态转移,路径上标签表示输出。
举个例子:一个经典(2,1,3)卷积码,生成多项式为 g0 = 7(八进制), g1 = 5(八进制)。
状态 = 前两个输入比特(共4种状态)
每个状态输入0或1,产生两条分支输出
译码时,维特比算法在网格图上找最小汉明距离路径,这就是最大似然序列估计。
核心记忆点:卷积码的纠错能力与自由距离dfree直接相关。自由距离越大,纠错能力越强。但约束长度K不能太大,否则维特比译码器复杂度呈指数增长。
3.4 Turbo码:接近香农极限的迭代魔术
Turbo码的出现,是编码理论的一次革命。我第一次看到Turbo码结构时,觉得这设计太聪明了——它并联了两个卷积码,中间用一个交织器隔开。
Turbo码的基本结构:
信息序列 → ┌──────┐
│ RSC1 │ → 校验序列1
└──────┘
↓ 交织器
┌──────┐
│ RSC2 │ → 校验序列2
└──────┘
其中RSC是递归系统卷积码(Recursive Systematic Convolutional Code),交织器让两个编码器看到的数据顺序不同。
Turbo码的译码是迭代的:两个软输入软输出(SISO)译码器互相交换外信息,经过多次迭代逼近最优译码。
Turbo码关键参数
- 交织器深度:通常在1024~4096之间,越深越接近香农限,但延迟也越大
- 迭代次数:3~8次,再多收益递减
- 分量码:多采用1/2码率RSC
3.5 四种编码结构对比
| 编码类型 | 核心机制 | 译码方法 | 典型码率 | 延迟敏感度 |
|---|---|---|---|---|
| 汉明码 | 线性校验方程 | 伴随式查表 | 4/7 ~ 0.57 | 低 |
| 循环码 | 生成多项式 + LFSR | 除法器 + 错误图样 | 可变 | 低 |
| 卷积码 | 网格状态转移 | 维特比译码 | 1/n 或 k/n | 中(随K增长) |
| Turbo码 | 并行RSC + 交织 | 迭代MAP译码 | 1/3 ~ 1/2 | 高 |
嗯,这里要注意:选择哪种编码,不只看纠错能力,还得看你的系统对延迟和复杂度的容忍度。我曾经在一个卫星通信项目里,想用Turbo码追求极致性能,结果地面终端处理器跑不动迭代译码,最后换回了卷积码加软判决RS码——效果也不错。