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。

我的一点经验:汉明码的校验矩阵H特别有用。用H乘以接收向量,得到"伴随式",伴随式直接告诉你错误位置。我在调试同步头检错时,就用这个原理快速定位了单比特反转。

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码
我曾经踩过的坑:循环码的生成多项式必须经过本原多项式验证。有一次我直接拿网上摘的生成多项式搭LFSR,结果编码出来的码字距离分布不对,纠错能力直接降了一半。记住:不是所有多项式都能当生成多项式,必须满足循环码的代数约束。

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
实际工程中的取舍:Turbo码在3G/4G移动通信里用得非常多。但在极低延迟场景(比如自动驾驶的V2X),Turbo码就不太合适了——你想想看,8次迭代加上深度交织,延迟轻松上毫秒级。这时候LDPC码更受欢迎。

3.5 四种编码结构对比

编码类型 核心机制 译码方法 典型码率 延迟敏感度
汉明码 线性校验方程 伴随式查表 4/7 ~ 0.57 低
循环码 生成多项式 + LFSR 除法器 + 错误图样 可变 低
卷积码 网格状态转移 维特比译码 1/n 或 k/n 中(随K增长)
Turbo码 并行RSC + 交织 迭代MAP译码 1/3 ~ 1/2 高

嗯,这里要注意:选择哪种编码,不只看纠错能力,还得看你的系统对延迟和复杂度的容忍度。我曾经在一个卫星通信项目里,想用Turbo码追求极致性能,结果地面终端处理器跑不动迭代译码,最后换回了卷积码加软判决RS码——效果也不错。

FEC编码演进与核心结构 FEC纠错编码 线性分组码 卷积码 汉明码 循环码 BCH码 RS码 维特比译码 软输出 Turbo码 (并联RSC) 💡 结构关系说明 线性分组码(汉明码→循环码→BCH/RS码)共享代数结构,适用于低速高可靠场景。 卷积码通过网格状态转移和维特比译码实现高效纠错;Turbo码并联两个RSC,迭代译码逼近香农限。