循环码编码解码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+c1x+c2x2+⋯+cn−1xn−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+g1x+⋯+gn−kxn−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 位。编码过程:
- 将 kk 位信息多项式 m(x)m(x) 乘以 xn−kxn−k(左移 n−kn−k 位,空出校验位)
- 除以 g(x)g(x) 求余式 r(x)=m(x)⋅xn−k g(x)r(x)=m(x)⋅xn−kmodg(x)
- 码字 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 矩阵行 |
|---|---|---|
| x3x3 | 1+x1+x | [1,1,0][1,1,0] |
| x4x4 | x+x2x+x2 | [0,1,1][0,1,1] |
| x5x5 | 1+x+x21+x+x2 | [1,1,1][1,1,1] |
| x6x6 | 1+x21+x2 | [1,0,1][1,0,1] |
得到:
G7,4=[I4∣P]=[1000110010001100101110001101]G7,4=[I4∣P]=1000010000100001101111100111
校验矩阵 H=[P⊤∣In−k]H=[P⊤∣In−k]:
H7,4=[101110011100100111001]H7,4=110011111101100010001
满足 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 译码流程
- 计算 s=rH⊤s=rH⊤(模 2)
- 若 s=0s=0 ⇒ 认为无错,直接输出前 kk 位
- 若 s≠0s=0 ⇒ 查表找对应的错误图样 e^e^
- 纠正:c^=r⊕e^c^=r⊕e^
- 输出前 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 |
|---|---|---|---|
| 0 | 7.86×10−27.86×10−2 | 1.13×10−11.13×10−1 | 1.24×10−11.24×10−1 |
| 3 | 2.29×10−22.29×10−2 | 2.73×10−22.73×10−2 | 3.22×10−23.22×10−2 |
| 5 | 5.95×10−35.95×10−3 | 7.19×10−37.19×10−3 | 4.01×10−34.01×10−3 |
| 7 | 7.73×10−47.73×10−4 | 5.82×10−45.82×10−4 | 2.11×10−42.11×10−4 |
| 9 | 3.36×10−53.36×10−5 | 1.57×10−51.57×10−5 | 2.36×10−62.36×10−6 |
编码增益(在 BER = 10−410−4 处):
- (7,4) 循环码:0.31 dB
- (15,11) 循环码:1.01 dB
5.4 结果分析
低 SNR 阈值效应:0~4 dB 时编码 BER 反而高于无编码。原因是冗余校验位消耗了发射能量——每编码比特分到的能量只有 Ec=R⋅EbEc=R⋅Eb,码率越低这个效应越明显。
高 SNR 编码增益:SNR ≥ 5 dB 后,纠错能力开始超过能量损失,编码增益逐渐显现。
码率的影响:(15,11) 以 0.73 的码率获得了比 (7,4)(码率 0.57)更好的性能。两者 dmindmin 相同,但 (15,11) 的冗余开销更小。这是信息论的一个核心思想:更长、更高码率的码通常更高效。
硬判决的局限:本文使用硬判决译码(先硬判再译码),编码增益仅约 1 dB。若采用软判决(如基于对数似然比的译码),可额外获得约 2 dB 增益。
