汉明码的编码和译码算法.docx
《汉明码的编码和译码算法.docx》由会员分享,可在线阅读,更多相关《汉明码的编码和译码算法.docx(20页珍藏版)》请在冰豆网上搜索。
![汉明码的编码和译码算法.docx](https://file1.bdocx.com/fileroot1/2022-11/17/97bd277c-7ac5-4ccc-8b04-4f14cf8f427f/97bd277c-7ac5-4ccc-8b04-4f14cf8f427f1.gif)
汉明码的编码和译码算法
汉明码(Hamming)的编码和译码算法
本文所讨论的汉明码是一种性能良好的码,它是在纠错编码的实践中较早发现的一类具有纠单个错误能力的纠错码,在通信和计算机工程中都有应用。
例如:
在“计算机组成原理”课程中,我们知道当计算机存储或移动数据时,可能会产生数据位错误,这时可以利用汉明码来检测并纠错。
简单的说,汉明码是一个错误校验码码集,由Bell实验室的R.W.Hamming发明,因此定名为汉明码。
如果对汉明码作进一步推广,就得出了能纠正多个错误的纠错码,其中最典型的是BCH码,而且汉明码是只纠1bit错误的BCH码,可将它们都归纳到循环码中。
各种码之间的大致关系显示如下。
一、汉明码的编码算法
输入:
信源消息u(消息分组u)
输出:
码字v
处理:
信源输出为一系列二进制数字0和1。
在分组码中,这些二进制信息序列分成固定长度的消息分组(messageblocks)。
每个消息分组记为u,由k个信息位组成。
因此共有2k种不同的消息。
编码器按照一定的规则将输入的消息u转换为二进制n维向量v,这里n>k。
此n维向量v就叫做消息u的码字(codeword)或码向量(codevector)。
因此,对应于2k种不同的消息,也有2k种码字。
这2k个码字的集合就叫一个分组码(blockcode)。
若一个分组码可用,2k个码字必须各不相同。
因此,消息u和码字v存在一一对应关系。
由于n符号输出码字只取决于对应的k比特输入消息,即每个消息是独立编码的,从而编码器是无记忆的,且可用组合逻辑电路来实现。
定义:
一个长度为n,有2k个码字的分组码,当且仅当其2k个码字构成域GF
(2)上所有n维向量组成的向量空间的一个K维子空间时被称为线性(linear)(n,k)码。
汉明码(n,k,d)就是线性分组(n,k)码的一种。
其编码算法即为使用生成矩阵G:
v=u·G。
例1-1:
针对汉明码Hamming(7,4,3)而言,u=(u0,u1,u2,u3),v=(v0,v1,v2,v3,v4,v5,v6),则我们有(v0,v1,v2,v3,v4,v5,v6)=(u0,u1,u2,u3)·G。
Hamming(7,4,3)的生成矩阵G为:
G=
,
(v0,v1,v2,v3,v4,v5,v6)=(u0,u1,u2,u3)·
,
所以我们有:
v0=u0,
v1=u1,
v2=u2,
v3=u3,
v4=u0+u1+u2,
v5=u1+u2+u3,
v6=u0+u1+u3,
例如u=1101,对应→v=1101001。
处理完毕。
■
其他汉明码照此处理,甚至其他线性分组(n,k)码都照此办理即可。
线性分组(n,k)码的校正子(伴随式)有2n-k个,设该码的纠错能力为t,那么重量小于或者等于t的所有错误模式(图样)都要有唯一的校正子(伴随式)与之对应,因而,对于二进制(n,k)码,有汉明限:
2n-k≥
,当2n-k=
时,
(n,k)码称为完备码(PerfectCode)。
完备码的伴随式得到了充分的利用,不存在解码不唯一的问题,然而完备码不一定是纠错能力强的码,因为它的最小距离dmin未必最大。
完备码也是稀少的,已知的二进制完备码有t=1的汉明码(HammingCode)和t=3的格雷码(GolayCode),以及n为奇数的简单重复(n,1)码。
三进制完备码有t=2的(11,6,5)格雷码。
纠错能力t=1的完备码统称为汉明码。
由定义可知,(n,k)汉明码应当满足下列条件:
2n-k=1+n,令校验位长m=n-k,那么容易知道:
n=2m-1,k=2m-1-m,dmin=3。
汉明码的校验矩阵H具有特殊的性质:
它的m维列向量正好是除零向量以外的所有可能的向量组合,共有2m-1个,恰好构成了H矩阵的列数n。
格雷码通常是指线性分组(23,12)码,最小距离dmin=7,纠错能力t=3。
由于223-12=2048=1+
,所以格雷码是完备码,其码重(码的重量)分布见下面表0-1。
表0-1格雷码的码重分布
码重
0
7
8
11
12
15
16
23
码个数
1
253
506
1288
1288
506
253
1
备注:
1、汉明码的生成矩阵:
Hamming(7,4,3)的生成矩阵G
Hamming(17,12,3)的生成矩阵G
Hamming(13,9,3)的生成矩阵G
Hamming(15,11,3)的生成矩阵G
Hamming(16,11,4)的生成矩阵G
2、除了分组码之外,还有卷积码。
卷积码编码器同样接受k比特分组的信息序列u,并产生n符号组的编码序列(码序列)v(卷积码编码中,符号u和v用来表示分组的序列而非单个分组)。
但是,每一个编码分组不仅取决于当前单位时间对应的k比特消息组,而且与前m个消息组有关。
此时,编码器的存储级数(memoryorder)为m。
编码器所产生的所有可能的输出编码序列的集合构成了一个码。
比值R=k/n称为码率(coderate)。
由于编码器有存储单元,因而必须采用时序逻辑电路实现。
二、汉明码的译码算法
输入:
接收向量r
输出:
译码所得码字v*
处理:
考虑一个(n,k)线性分组码,其生成矩阵为G,奇偶校验矩阵为H。
令v=(v0,v1,…,vn-1)表示要通过有噪信道传输的码字,r=(r0,r1,…,rn-1)为信道输出端接收到的码字。
由于信道中的噪声,r可能与v不同。
向量和e=r+v=(e0,e1,…,en-1)是一个n维向量,其中ri≠vi时,ei=1,而ri=vi时,ei=0。
该n维向量e称为差错向量(errorvector)或错误模式或错误图样(errorpattern),它直接指出接收向量r不同于传输码字v的位置。
e中的1表示由于信道噪声引起的传输差错(transmissionerrors)。
接收向量r的译码包括如下三个步骤:
1、计算r的校正子(伴随式)s=r·HT;
2、确定校正子(伴随式)s=r·HT对应的陪集首el,于是el被假定为由信道引起的错误模式(错误图样);
3、将接收向量r译为码字v*=r+el。
上述译码方案被称为校正子(伴随式)译码(syndromedecoding)或查表译码(tablelookupdecoding)。
例2-1:
Hamming(7,4,3)的生成矩阵G=[IkP]k×n
=
,
则奇偶校验矩阵H为
H=[PTIn-k](n-k)×n=
,这里n=7,k=3。
该码有23=8个陪集:
校正子s
可纠正错误模式(陪集首)el
s0s1s2
e0e1e2e3e4e5e6
000
0000000
101
1000000
111
0100000
110
0010000
011
0001000
100
0000100
010
0000010
001
0000001
假设传输码字为v=1110100,接收向量为r=0110100(错1位),其校正子s=r·HT=101,对应e=1000000,v*=r+e=1110100,所以译码正确!
假设传输码字为v=1110100,接收向量为r=0110000(错2位),其校正子s=r·HT=001,对应e=0000001,v*=r+e=0110101,所以译码错误!
可以看出:
汉明码Hamming(7,4,3)可以纠正含单个差错的错误模式或者检测出含两个差错的错误模式(而不能纠正含两个或两个以上差错的错误模式)。
例2-2:
Hamming(17,12,3)的生成矩阵G=[IkP]k×n=
奇偶校验矩阵H=[PTIn-k](n-k)×n=
该码有25=32个陪集:
校正子s
可纠正错误模式(陪集首)el
s0s1s2s3s4
e0e1e2e3e4e5e6e7e8e9e10e11e12e13e14e15e16
00000
00000000000000000
11011
10000000000000000
11111
01000000000000000
11101
00100000000000000
11100
00010000000000000
01110
00001000000000000
00111
00000100000000000
10001
00000010000000000
11010
00000001000000000
01101
00000000100000000
10100
00000000010000000
01010
00000000001000000
00101
00000000000100000
10000
00000000000010000
01000
00000000000001000
00100
00000000000000100
00010
00000000000000010
00001
00000000000000001
00011
00000000000000011
01001
00000000000001001
00110
00000000000000110
10010
00000000000010010
01100
00000000000001100
11000
00000000000011000
10101
10001000000000000
10110
10000000100000000
01111
10000000010000000
11110
10000000000100000
01011
10000000000010000
10011
10000000000001000
11001
10000