循环码编码解码matlab仿真(P124302009 罗睿章, P124302167张国峰)

循环码编码解码matlab仿真(P124302009 罗睿章, P124302167张国峰)

循环码是线性分组码的一个重要子类。一个 (n,k)(n,k) 线性分组码称为循环码,当且仅当它的任意一个码字的循环移位仍是该码的码字。

循环码之所以重要,是因为它具有代数结构——可以用多项式来描述,编码和译码都可以用简单的移位寄存器电路实现。

1.1 码字的多项式表示

将码字 c=(c0,c1,…,cn−1)c=(c0​,c1​,…,cn−1​) 写成多项式:

c(x)=c0+c1x+c2x2+⋯+cn−1xn−1c(x)=c0​+c1​x+c2​x2+⋯+cn−1​xn−1

其中 ci∈GF(2)ci​∈GF(2),加法为模 2(即 XOR)。

1.2 生成多项式

(n,k)(n,k) 循环码的所有码字多项式都是某个 n−kn−k 次多项式 g(x)g(x) 的倍式:

g(x)=g0+g1x+⋯+gn−kxn−kg(x)=g0​+g1​x+⋯+gn−k​xn−k

其中 g0=1g0​=1,且 g(x)g(x) 整除 xn−1xn−1(在 GF(2)GF(2) 上即为 xn+1xn+1)。

:对于 (7,4)(7,4) 循环码,生成多项式 g(x)=1+x+x3g(x)=1+x+x3。
验证:(1+x+x3)(1+x+x2+x4)=1+x7(1+x+x3)(1+x+x2+x4)=1+x7,即 g(x)g(x) 整除 x7+1x7+1。✓


二、系统循环码编码

2.1 编码步骤

系统码要求信息位出现在码字的前 kk 位。编码过程:

  1. 将 kk 位信息多项式 m(x)m(x) 乘以 xn−kxn−k(左移 n−kn−k 位,空出校验位)
  2. 除以 g(x)g(x) 求余式 r(x)=m(x)⋅xn−k g(x)r(x)=m(x)⋅xn−kmodg(x)
  3. 码字 c(x)=m(x)⋅xn−k+r(x)c(x)=m(x)⋅xn−k+r(x)

写成矩阵形式:c=m⋅Gc=m⋅G,其中系统生成矩阵 G=[Ik∣P]G=[Ik​∣P]。

2.2 P 矩阵的构造

PP 的第 ii 行(i=1,…,ki=1,…,k)是 xn−k+i−1 g(x)xn−k+i−1modg(x) 的系数。

以 (7,4) 码为例推导:

n=7,k=4,n−k=3n=7,k=4,n−k=3,g(x)=1+x+x3g(x)=1+x+x3。

被除式模 g(x)g(x) 的余式P 矩阵行
x3x31+x1+x[1,1,0][1,1,0]
x4x4x+x2x+x2[0,1,1][0,1,1]
x5x51+x+x21+x+x2[1,1,1][1,1,1]
x6x61+x21+x2[1,0,1][1,0,1]

得到:

G7,4=[I4∣P]=[1000110010001100101110001101]G7,4​=[I4​∣P]=​1000​0100​0010​0001​1011​1110​0111​​

校验矩阵 H=[P⊤∣In−k]H=[P⊤∣In−k​]:

H7,4=[101110011100100111001]H7,4​=​110​011​111​101​100​010​001​​

满足 GH⊤=0GH⊤=0(模 2)。


三、伴随式译码

3.1 原理

设发送码字为 cc,接收向量为 r=c+er=c+e(ee 为错误图样)。

伴随式定义为:

s=r⋅H⊤s=r⋅H⊤

由于 c⋅H⊤=0c⋅H⊤=0,所以:

s=e⋅H⊤s=e⋅H⊤​

伴随式仅依赖于错误图样,与发送码字无关!

3.2 译码流程

  1. 计算 s=rH⊤s=rH⊤(模 2)
  2. 若 s=0s=0 ⇒ 认为无错,直接输出前 kk 位
  3. 若 s≠0s=0 ⇒ 查表找对应的错误图样 e^e^
  4. 纠正:c^=r⊕e^c^=r⊕e^
  5. 输出前 kk 位作为译码结果

3.3 (7,4) 循环码的伴随式表

(7,4)(7,4) 码有 n−k=3n−k=3 个校验位,伴随式空间大小为 23=823=8。恰好对应 7 种单比特错误 + 1 种无错情况:

伴随式 s错误图样 e错误位置
[0 0 0][0 0 0 0 0 0 0]无错误
[1 1 0][1 0 0 0 0 0 0]第 1 位
[0 1 1][0 1 0 0 0 0 0]第 2 位
[1 1 1][0 0 1 0 0 0 0]第 3 位
[1 0 1][0 0 0 1 0 0 0]第 4 位
[1 0 0][0 0 0 0 1 0 0]第 5 位
[0 1 0][0 0 0 0 0 1 0]第 6 位
[0 0 1][0 0 0 0 0 0 1]第 7 位

表是完备的——每个单比特错误有唯一伴随式,译码器不会混淆。

3.4 纠错与检错能力

(7,4)(7,4) 循环码的最小汉明距离 dmin⁡=3dmin​=3,因此:

  • 可纠正所有 t=⌊(3−1)/2⌋=1t=⌊(3−1)/2⌋=1 个错误
  • 可检测所有 dmin⁡−1=2dmin​−1=2 个错误

当发生双比特错误时,伴随式与某个单比特错误的伴随式相同(碰撞),译码器会错误地"纠正"到错误的码字,引入额外错误。这是 dmin⁡=3dmin​=3 的固有限制。


四、仿真设置

参数取值
码型(7,4) 和 (15,11) 循环码
生成多项式g7(x)=1+x+x3g7​(x)=1+x+x3,g15(x)=1+x+x4g15​(x)=1+x+x4
调制BPSK(0↦+1, 1↦−10↦+1,1↦−1)
信道AWGN
译码硬判决 + 伴随式查表
Eb/N0 范围0 ~ 9 dB
仿真终止累计 200 比特错误或 200 万帧

五、仿真结果

5.1 单比特纠错验证

发送消息 m=[1 0 1 1]m=[1011],编码得 c=[1 0 1 1 1 0 0]c=[1011100]。

在第 6 位注入错误(翻转),接收 r=[1 0 1 1 1 1 0]r=[1011110]。

  • 计算伴随式:s=rH⊤=[0 1 0]s=rH⊤=[010]
  • 查表得:e^=[0 0 0 0 0 1 0]e^=[0000010](第 6 位)
  • 纠正:c^=r⊕e^=[1 0 1 1 1 0 0]=cc^=r⊕e^=[1011100]=c
  • 译码:m^=[1 0 1 1]=mm^=[1011]=m ✓

遍历全部 7 个比特位置的错误,均正确纠正。

5.2 双比特错误局限性

在码字第 3、5 位同时注入错误。伴随式 s=[0 1 1]s=[011],查表对应第 2 位的单比特错误。译码器将第 2 位翻转,结果产生3 个比特错误——反而更差了。这验证了 dmin⁡=3dmin​=3 的码只能纠单错,不能纠双错。

5.3 BER 性能

Eb/N0 (dB)无编码 BER(7,4) BER(15,11) BER
07.86×10−27.86×10−21.13×10−11.13×10−11.24×10−11.24×10−1
32.29×10−22.29×10−22.73×10−22.73×10−23.22×10−23.22×10−2
55.95×10−35.95×10−37.19×10−37.19×10−34.01×10−34.01×10−3
77.73×10−47.73×10−45.82×10−45.82×10−42.11×10−42.11×10−4
93.36×10−53.36×10−51.57×10−51.57×10−52.36×10−62.36×10−6

编码增益(在 BER = 10−410−4 处):

  • (7,4) 循环码:0.31 dB
  • (15,11) 循环码:1.01 dB

5.4 结果分析

  1. 低 SNR 阈值效应:0~4 dB 时编码 BER 反而高于无编码。原因是冗余校验位消耗了发射能量——每编码比特分到的能量只有 Ec=R⋅EbEc​=R⋅Eb​,码率越低这个效应越明显。

  2. 高 SNR 编码增益:SNR ≥ 5 dB 后,纠错能力开始超过能量损失,编码增益逐渐显现。

  3. 码率的影响:(15,11) 以 0.73 的码率获得了比 (7,4)(码率 0.57)更好的性能。两者 dmin⁡dmin​ 相同,但 (15,11) 的冗余开销更小。这是信息论的一个核心思想:更长、更高码率的码通常更高效

  4. 硬判决的局限:本文使用硬判决译码(先硬判再译码),编码增益仅约 1 dB。若采用软判决(如基于对数似然比的译码),可额外获得约 2 dB 增益。