(7,4)汉明码编译码原理程序说明书1、线性分组码假设信源输出为一系列二进制数字0和1.在分组码中,这些二进制信息序列分成固定长度的消息分组(messageblocks)。每个消息分组记为u,由k个信息位组成。因此共有2k种不同的消息。编码器按照一定的规则将输入的消息u转换为二进制n维向量v,这里nk。此n维向量v就叫做消息u的码字(codeword)或码向量(codevector)。因此,对应于2k种不同的消息,也有2k种码字。这2k个码字的集合就叫一个分组码(blockcode)。一个长度为n,有2k个码字的分组码,当且仅当其2k个码字构成域GF(2)上所有n维向量空间的一个k维子空间时被称为线性(linear)(n,k)码。对于线性分组码,希望它具有相应的系统结构(systematicstructure),其码字可分为消息部分和冗余校验部分两个部分。消息部分由k个未经改变的原始信息位构成,冗余校验部分则是n-k个奇偶校验位(parity-check)位,这些位是信息位的线性和(linearsums)。具有这样的结构的线性分组码被称为线性系统分组码(linearsystematicblockcode)。本实验以(7,4)汉明码的编译码来具体说明线性系统分组码的特性。其主要参数如下:码长:21mn信息位:21mkm校验位:mnk,且3m最小距离:min03dd由于一个(n,k)的线性码C是所有二进制n维向量组成的向量空间nV的一个k维子空间,则可以找到k个线性独立的码字,0,1,1kggg……,使得C中的每个码字v都是这k个码字的一种线性组合。(7,4)汉明码的生成矩阵如下,前三位为冗余校验部分,后四位为消息部分。01231101000011010011100101010001ggGgg如果0123uuuuu是待编码的消息序列,则相应的码字可如下给出:0101230011223323ggvuGuuuuuguguguggg编码结构即码字0123456vvvvvvvv,对于(7,4)线性分组码汉明码而言,3456,,,vvvv为所提供的消息序列,而0356vvvv,1345vvvv,2456vvvv。由以上关系可以得到(7,4)汉明码的全部码字如下所示:k=4,n=7的线性分组码消息码字消息码字(0000)(0000000)(0001)(1010001)(1000)(1101000)(1001)(0111001)(0100)(0110100)(0101)(1100101)(1100)(1011100)(1101)(0001101)(0010)(1110010)(0011)(0100011)(1010)(0011010)(1011)(1001011)(0110)(1000110)(0111)(0010111)(1110)(0101110)(1111)(1111111)2、用C++编写(7,4)汉明码编译码程序的思路如下:(1)编码程序循环输入待编码消息序列0123uuuuu,首先判断输入是否符合输入条件:输入必须是4位0,1序列,共有42种情况。编码程序如下:(本人水平有限,使用直接赋值的方法,望见笑)for(j=0;j7;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]);//异或运算coutv[j];}coutendl;编码的思想为:30vu41vu52vu0356vvvv1345vvvv2456vvvv(2)译码程序:循环输入待译码的码字序列0123456vvvvvvvv,第一步判断输入是否符合输入条件:输入必须是7位0,1序列,共有72种情况。但是72种情况中只有42即16个有效码字,那么第二步则是要判断是否是42即16个有效码字,这也是编码的一个检错方式,利用其奇偶校验矩阵TH,校正子s,接收到的码字序列为r,判断*TsrH是否等于0。若等于0,则证明是有效码字;若不等于0,则证明不属于16个有效码字的一个。奇偶校验矩阵100101101011100010111H奇偶校验矩阵100010001110011111101TH以下为纠错的关键程序: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;gotoloop;}elsecout输入字码有效endl;cout您所输入的待译码的码字序列为:;接下来便是译码的两个主要方法:第一个方法为查表法:程序中check_table()函数便是查表法。表格如下:k=4,n=7的线性分组码消息码字消息码字(0000)(0000000)(0001)(1010001)(1000)(1101000)(1001)(0111001)(0100)(0110100)(0101)(1100101)(1100)(1011100)(1101)(0001101)(0010)(1110010)(0011)(0100011)(1010)(0011010)(1011)(1001011)(0110)(1000110)(0111)(0010111)(1110)(0101110)(1111)(1111111)第二个方法编码方法便是:系统码直接取信息位译码程序如下: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];coutu[j];}3、程序附录//(7,4)编译码程序#includeiostreamusingnamespacestd;voidcheck_table();//编码程序intmain(){intg[4][7]={{1,1,0,1,0,0,0},{0,1,1,0,1,0,0},{1,1,1,0,0,1,0},{1,0,1,0,0,0,1}};//声明生成矩阵G,即4个线性独立的码字,可以使码本C中的码字v都是这k个码字的一种线性组合,inth[3][7]={{1,0,0,1,0,1,1},{0,1,0,1,1,1,0},{0,0,1,0,1,1,1}};//声明校验矩阵H,intht[7][3]={{1,0,0},{0,1,0},{0,0,1},{1,1,0},{0,1,1},{1,1,1},{1,0,1}};//声明校验矩阵H的转置矩阵HT(这里的T是H的上标)intu[4];//声明待编码的消息序列,即未编码前的信息序列intv[7];//声明编码后的码字序列//ints[7];inti,j,k;//顺序输入待编码4位信息序列lable:cout请输入4位待编码消息序列:endl;for(i=0;i4;i++){cinu[i];}//判断是否输入正确数据for(i=0;i4;i++){if((u[0]==0|u[0]==1)&(u[1]==0|u[1]==1)&(u[2]==0|u[2]==1)&(u[3]==0|u[3]==1)){cout您所输入的待编码消息序列为:;for(i=0;i4;i++){coutu[i];}coutendl;}else{cout输入错误!请输入正确的二进制4位0,1信息序列!endl;gotolable;}}coutendl;//输出生成矩阵cout(7,4)汉明码的生成矩阵G为:endl;for(i=0;i4;i++){for(j=0;j7;j++)coutg[i][j];coutendl;}coutendl;//编码程序//码字的系统结构分为冗余校验部分和消息部分,结构形式:v(x)={v0,v1,v2,v3,v4,v5,v6}//编码序列中v3,v4,v5,v6均为所提供的消息序列,对于(7,4)汉明码://v0=v3^v5^v6;//v1=v3^v4^v5;//v2=v4^v5^v6;cout等待编码中……endl;cout编码成功!编码后的码字序列为:;for(j=0;j7;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]);//异或运算coutv[j];}coutendl;//顺序输入7位待译码有效码字序列loop:inta,result=0;cout请输入7位待译码有效的消息序列:endl;for(i=0;i7;i++){cinv[i];}coutendl;for(i=0;i7;i++){coutv[i];}//1.判断是否输入正确0,1序列if((v[0]==0|v[0]==1)&(v[1]==0|v[1]==1)&(v[2]==0|v[2]==1)&(v[3]==0|v[3]==1)&(v[4]==0|v[4]==1)&(v[5]==0|v[5]==1)&(v[6]==0|v[6]==1)){cout输入字码合法endl;}else{cout输入错误!请输入正确的二进制7位0,1码字序列!endl;gotoloop;}//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;gotoloop;}elsecout输入字码有效endl;cout您所输入的待译码的码字序列为:;for(i=0;i7;i++){coutv[i];}coutendl;//输出校验矩阵Hcout(7,4)汉明码的校验矩阵H为:endl;for(i=0;i3;i++){for(j=0;j7;j++)couth[i][j];coutendl;}coutendl;//输出校验矩阵HT(这里的T为H的上标,代表转置),目的是为了利用校正子进行编码检测s=r*HT;cout(7,4)汉明码的校验矩阵H的转置矩阵为:endl;for(i=0;i7;i++){for(j=0;j3;j++)coutht[i][j];coutendl;}coutendl;//检错算法check_table();//查表法cout译码方法二:系统码直接取信息位译码endl;cout等待译码中……endl;cout译码成功!译码后的消息序列为:;for(j=0;j4;j++){if