(7,4)汉明码编译码程序说明
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
(7,4)汉明码编译码原理程序说明书
1、线性分组码
假设信源输出为一系列二进制数字0和1.在分组码中,这些二进制信息序列分成固定长度的消息分组(message blocks )。每个消息分组记为u ,由k 个信息位组成。因此共有2k 种不同的消息。编码器按照一定的规则将输入的消息u 转换为二进制n 维向量v ,这里n>k 。此n 维向量v 就叫做消息u 的码字(codeword )或码向量(code vector )。因此,对应于2k 种不同的消息,也有2k 种码字。这2k 个码字的集合就叫一个分组码(block code )。
一个长度为n ,有2k 个码字的分组码,当且仅当其2k 个码字构成域GF (2)上所有n
维向量空间的一个k 维子空间时被称为线性(linear )(n ,k )码。
对于线性分组码,希望它具有相应的系统结构(systematic structure ),其码字可分为消息部分和冗余校验部分两个部分。消息部分由k 个未经改变的原始信息位构成,冗余校验部分则是n-k 个奇偶校验位(parity-check )位,这些位是信息位的线性和(linear sums )。具有这样的结构的线性分组码被称为线性系统分组码(linear systematic block code )。 本实验以(7,4)汉明码的编译码来具体说明线性系统分组码的特性。 其主要参数如下:
码长:21m
n =-
信息位:
21m
k m =-- 校验位:m n k =-,且3m ≥ 最小距离:min 03
d d ==
由于一个(n ,k )的线性码C 是所有二进制n 维向量组成的向量空间n V 的一个k 维子
空间,则可以找到k 个线性独立的码字,0,1,1k g g g -…… ,使得C 中的每个码字v 都是这k 个码字的一种线性组合。
(7,4)汉明码的生成矩阵如下,前三位为冗余校验部分,后四位为消息部分。
0123 1 1 0 1 0 0 00 1 1 0 1 0 01 1 1 0 0 1 01 0 1 0 0 0 1g g G g g ⎧⎫⎧⎫⎪⎪⎪⎪⎪⎪⎪⎪==⎨⎬⎨⎬⎪⎪⎪⎪⎪⎪⎪
⎪⎩⎭⎩⎭
如果()0123u u u u u =是待编码的消息序列,则相应的码字可如下给出:
()
0101230011223323g g v u G u u u u u g u g u g u g g g ⎧⎫⎪⎪⎪⎪
===+++⎨⎬⎪⎪⎪⎪⎩⎭
编码结构即码字()0123456v v v v v v v v =,对于(7,4)线性分组码汉明码而言,
3456,,,v v v v 为所提供的消息序列,而0356v v v v =⊕⊕,1345v v v v =⊕⊕,2456v v v v =⊕⊕。
由以上关系可以得到(7,4)汉明码的全部码字如下所示:
2、用C++编写(7,4)汉明码编译码程序的思路如下: (1)编码程序
循环输入待编码消息序列()0123u u u u u =,首先判断输入是否符合输入条件:输入必须是4位0,1序列,共有4
2种情况。
编码程序如下:(本人水平有限,使用直接赋值的方法,望见笑) for(j=0;j<7;j++) {
if(j==3) v[j]= u[0];
if(j==4) v[j]= u[1];
if(j==5) v[j]= u[2];
if(j==6) v[j]= u[3]; if(j==0)
v[j]= ((u[0]^u[2])^u[3]); //异或运算 if(j==1)
v[j]= ((u[0]^u[1])^u[2]); //异或运算 if(j==2)
v[j]= ((u[1]^u[2])^u[3]); //异或运算 cout << v[j] << " "; }
cout< 编码的思想为: 30v u = 41v u = 52v u = 0356v v v v =⊕⊕ 1345v v v v =⊕⊕ 2456v v v v =⊕⊕ (2)译码程序: 循环输入待译码的码字序列()0123456v v v v v v v v =,第一步判断输入是否符合输入条件:输入必须是7位0,1序列,共有72种情况。但是72种情况中只有4 2即16个有效码字,那么第二步则是要判断是否是4 2即16个有效码字,这也是编码的一个检错方式,利用其奇偶校验矩阵T H ,校正子s ,接收到的码字序列为r ,判断*T s r H =是否等于0。若等于0,则证明是有效码字;若不等于0,则证明不属于16个有效码字的一个。 ● 奇偶校验矩阵100101101011100010111H ⎧⎫ ⎪⎪ =⎨⎬⎪⎪⎩⎭ ● 奇偶校验矩阵100010001110011111101T H ⎧⎫⎪⎪⎪⎪⎪⎪⎪⎪=⎨⎬⎪⎪⎪⎪⎪⎪⎪⎪⎩⎭ 以下为纠错的关键程序: for(j=0;j<3;j++) { a=(v[0]*ht[0][j])^(v[1]*ht[1][j])^(v[2]*ht[2][j])^(v[3]*ht[3][j])^( v[4]*ht[4][j])^(v[5]*ht[5][j])^(v[6]*ht[6][j]); result=result+a; } if(result!=0) { cout<<"输入的是无效的字码"< goto loop; } else cout<<"输入字码有效"< cout<<"您所输入的待译码的码字序列为:"; 接下来便是译码的两个主要方法: 第一个方法为查表法:程序中check_table()函数便是查表法。 第二个方法编码方法便是:系统码直接取信息位译码 程序如下: for(j=0;j<4;j++) { if(j==0) u[j]= v[3]; if(j==1) u[j]= v[4]; if(j==2) u[j]= v[5]; if(j==3) u[j]= v[6]; cout << u[j] << " "; }