线性分组码基础:从定义到译码

各位同学好,今天我们来聊聊线性分组码。说实话,这玩意儿是我在通信系统里打交道最多的编码之一。为什么?因为它结构清晰,实现起来不复杂,而且性能可靠。我在做卫星通信项目时,就经常用它来对抗信道噪声。

咱们先看一个简单问题:你发一串二进制数据,信道里可能出错。怎么让接收端知道有没有错?甚至能自动纠正?线性分组码就是干这个的。

1. 线性分组码的定义

线性分组码,说白了就是一组固定长度的码字,它们满足两个条件:

  • 分组性:每 k 个信息比特,映射成 n 个码字比特(n > k)。
  • 线性性:任意两个码字相加(模2加),结果还是码字。

嗯,这里要注意:模2加法就是异或运算。0+0=0,0+1=1,1+0=1,1+1=0。这个性质非常关键,后面所有计算都基于它。

我习惯用 (n, k) 来表示一个线性分组码。比如 (7,4) 码,就是每4个信息比特,编码成7个比特的码字。多了3个冗余比特,用来纠错。

核心参数

  • 码长 n:码字的总比特数
  • 信息位 k:原始信息的比特数
  • 校验位 r = n - k:冗余比特数
  • 码率 R = k/n:信息传输效率

你想想看,码率越高,效率越高,但纠错能力通常越弱。这是个trade-off,我在实际项目中经常需要根据信道质量来权衡。

2. 生成矩阵与校验矩阵

线性分组码的核心,就是两个矩阵:生成矩阵 G 和校验矩阵 H。

生成矩阵 G:维度 k × n。它的作用是把信息向量 m(1×k)映射成码字 c(1×n):

c = m · G

注意这里是模2乘法。举个例子,(7,4) 码的生成矩阵可以是:

G = [1 0 0 0 1 1 0
     0 1 0 0 1 0 1
     0 0 1 0 0 1 1
     0 0 0 1 1 1 1]

如果信息 m = [1 0 1 0],那么码字 c = m·G = [1 0 1 0 1 0 1]。

校验矩阵 H:维度 r × n。它满足一个关键性质:

G · H^T = 0

也就是说,任何合法码字 c 乘以 H^T 都等于零向量:

c · H^T = 0

这个性质有什么用?接收端可以用它来检测错误。如果接收到的向量 r 乘以 H^T 不为零,说明有错误。

我的经验:在实际工程中,我通常先设计 H 矩阵,再推导 G 矩阵。因为 H 矩阵的物理意义更直观——它直接告诉我们哪些校验位参与了哪些信息位的校验。

3. 系统码与非系统码

这里有个重要的分类:系统码和非系统码。

系统码:码字的前 k 位就是原始信息比特,后面 r 位是校验位。比如上面的例子,码字 [1 0 1 0 1 0 1] 的前4位就是信息 [1 0 1 0]。

非系统码:信息比特被"打散"在码字中,不能直接看出来。

我个人习惯用系统码。为什么?因为解码时可以直接提取信息位,不需要额外计算。我在做实时通信系统时,这个特性特别有用——能省几个时钟周期。

系统码的生成矩阵有个标准形式:

G = [I_k | P]

其中 I_k 是 k×k 的单位矩阵,P 是 k×r 的矩阵。对应的校验矩阵是:

H = [P^T | I_r]

注意:不是所有线性分组码都能写成系统形式。但任何线性分组码都可以通过行变换变成系统码。我曾经在项目中遇到一个非系统码,调试时差点被搞晕——因为信息位藏得太深了。

4. 伴随式与错误检测

接收端收到一个向量 r,它可能是码字 c 加上错误 e:

r = c + e

我们计算伴随式 s:

s = r · H^T

如果 s = 0,说明 r 是合法码字(可能没错,也可能有不可检测的错误)。如果 s ≠ 0,说明一定有错误。

伴随式 s 是一个 r 维向量,它直接告诉我们错误的位置信息。但注意,s 只告诉我们错误模式,不直接告诉我们哪个比特错了。

关键性质

  • 伴随式只与错误模式 e 有关,与发送的码字 c 无关
  • s = e · H^T
  • 不同的错误模式可能产生相同的伴随式

嗯,这里有个坑:如果错误模式恰好等于另一个合法码字,那么 s = 0,我们就检测不到错误。这叫"不可检测错误模式"。我在设计系统时,通常会评估这种概率——好在对于好的码,这个概率非常小。

5. 标准阵列译码

标准阵列译码,说白了就是查表法。我们把所有可能的接收向量 r 分成若干类,每类对应一个错误模式。

具体做法:

  1. 列出所有 2^k 个合法码字
  2. 列出所有可能的错误模式 e(通常选择重量最小的)
  3. 构造一个表格:行是错误模式,列是码字
  4. 每个单元格 r = c + e

译码时,收到 r 后,找到它所在的列,该列对应的码字就是译码结果。

举个例子,对于 (3,1) 重复码:

  • 合法码字:000 和 111
  • 错误模式:000, 001, 010, 100
  • 表格:
       000     111
000    000     111
001    001     110
010    010     101
100    100     011

收到 110,它在第二列,译码为 111。收到 010,它在第一列,译码为 000。

避坑指南:标准阵列译码虽然直观,但表格大小是 2^n × 2^k,对于长码根本存不下。我曾经在项目中试过 (15,11) 码,表格有 32768 行...后来果断改用代数译码了。

知识体系总览

下面这张图展示了本章的核心逻辑关系:

线性分组码知识体系 线性分组码 (n,k) 定义:分组性+线性性 生成矩阵 G (k×n) 校验矩阵 H (r×n) 系统码 vs 非系统码 c = m · G c · H^T = 0 伴随式 s = r · H^T 标准阵列译码

这张图把本章的知识点串起来了。从定义出发,生成矩阵和校验矩阵是两条主线,最终汇聚到伴随式计算和译码方法上。

好了,线性分组码的基础就讲到这里。记住:生成矩阵负责编码,校验矩阵负责检测,伴随式是检测工具,标准阵列是译码方法。这些概念在后面章节会反复用到。

专注资料整理