7,4汉明码编译码程序说明
((7 7,,4 4)汉明码编译码原理程序说明书)汉明码编译码原理程序说明书 1、线性分组码 假设信源输出为一系列二进制数字 0 和 1.在分组码中,这些二进制信息序列分成固定 长度的消息分组 (message blocks) 。 每个消息分组记为 u, 由 k 个信息位组成。 因此共有2k 种不同的消息。 编码器按照一定的规则将输入的消息u 转换为二进制 n 维向量 v, 这里 nk。 此 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)汉明码的编译码来具体说明线性系统分组码的特性。 其主要参数如下: 码长: n 2 1 mk 2 1m 信息位: m 校验位:m nk,且m 3 最小距离: d min d 0 3 由于一个(n,k)的线性码 C 是所有二进制 n 维向量组成的向量空间V n的一个 k 维子 空间,则可以找到k 个线性独立的码字,g0,g1,……gk1,使得C 中的每个码字 v 都是这 k 个码字的一种线性组合。 (7,4)汉明码的生成矩阵如下,前三位为冗余校验部分,后四位为消息部分。 g 0 1 1 0 1 0 0 0 g0 1 1 0 1 0 0 1 G g21 1 1 0 0 1 0 1 0 1 0 0 0 1g3 如果u u0u 1 u 2 u 3 是待编码的消息序列,则相应的码字可如下给出: v u G u 0 u 1 u 2 u 3 g 0 g 1 u0g0u1g1u2g2u3g3 g2 g3 编码结构即码字 v v 0 v 1 v 2 v 3 v 4 v 5 v 6 ,对于( 7,4)线性分组码汉明码而言, v 3 ,v 4 ,v 5 ,v 6 为 所 提 供 的 消 息 序 列 , 而v0 v3v5v6,v1 v3v4v5, v 2 v 4 v 5 v 6 。 由以上关系可以得到(7,4)汉明码的全部码字如下所示: k=4,n=7 的线性分组码 消息 (0000) (1000) (0100) (1100) (0010) (1010) (0110) (1110) 码字 (0000000) (1101000) (0110100) (1011100) (1110010) (0011010) (1000110) (0101110) 消息 (0001) (1001) (0101) (1101) (0011) (1011) (0111) (1111) 码字 (1010001) (0111001) (1100101) (0001101) (0100011) (1001011) (0010111) (1111111) 2、用 C++编写(7,4)汉明码编译码程序的思路如下: (1)编码程序 循环输入待编码消息序列u u0u 1 u 2 u 3 ,首先判断输入是否符合输入条件:输入必 须是 4 位 0,1 序列,共有2种情况。 编码程序如下: (本人水平有限,使用直接赋值的方法,望见笑) for(j=0;ju[i]; } //判断是否输入正确数据 for(i=0;iv[i]; } coutendl; for(i=0;i7;i++) { coutv[i]; } //1.判断是否输入正确 0,1 序列 if((v[0]==0|v[0]==1) } else { cout“输入错误!请输入正确的二进制7 位 0,1 码字序列!“endl; goto loop; } //2.判断是否为有效码字 for(j=0;j3;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“输入的是无效的字码“endl; goto loop; } else cout“输入字码有效“endl; cout“您所输入的待译码的码字序列为:“; for(i=0;i7;i++) { coutv[i]; } coutendl; //输出校验矩阵 H cout “(7,4)汉明码的校验矩阵 H 为:“endl; for(i=0;i3;i++) { for(j=0;j7;j++) cout h[i][j] “ “; cout endl; } cout endl; //输出校验矩阵 HT(这里的 T 为 H 的上标,代表转置) ,目的是为了利用校正子进行编码检 测 s=r*HT; cout “(7,4)汉明码的校验矩阵 H 的转置矩阵为:“endl; for(i=0;i7;i++) { for(j=0;j3;j++) cout ht[i][j] “ “; cout endl; } cout endl; //检错算法 check_table();//查表法 cout“译码方法二:系统码直接取信息位译码 “endl; cout“ 等待译码中…… “endl; cout“译码成功!译码后的消息序列为:““ “; for(j=0;j4;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] “ “; } coutendl; system(“pause“); return 0; } //查表法函数 void check_table() { cout“译码方法一:查表法“endl; cout“ k=4,n=7 的线性分组码的全部码字 “endl; cout“ 消息码字 |消息码字“endl; cout“(0000) (0000000) | (0001) (1010001)“endl; cout“(1000) (1101000) | (1001) (0111001)“endl; cout“(0100) (0110100) | (0101) (1100101)“