实验四纠错编码基本实验一、实验目的1、通过实验理解线性分组码的基本原理;2、练习根据理论分析自行设计实验方法的能力。二、实验内容1、已知一(10,4)线性分组码的生成矩阵为1001110111111000111001101101011101111001G试用Matlab求出该码的全部码字和最小汉明距离。2、用Matlab求x15+1的所有因子,构造(15,4)循环码的所有可能的生成多项式;选择其中一个作为(15,4)循环码的生成多项式,求出所有的许用码字,并计算最小汉明距离。三、实验原理1、线性生成码的原理线性分组码的构成方式是把信息序列分成每k个码元一段,并由这k个码元按一定规则产生r个校验位,组成长度为n=k+r的码字,用(n,k)表示信息码元与校验位之间为线性关系。一个[n,k]线性分组码,是把从信源输出的以k个码元为一组的信息组m,通过信道编码器后,变成长度为n≥k的码组(码字)c作为[n,k]线性分组码的一个码字。设GF(q)是一个含有q个元素的有限数域,若每位码元的取值有q种(取自GF(q)),则信息组m共有kq种不同的状态,因此,需要kq个码字c。而长为n的数组共有nq个,二进制时(q=2)共有n2个。显然,nq个n维向量组成有限域GF(q)上的一个n维线性空间V,编码就是要在这个n维线性空间中选出kq个向量作为合法码字,其余的nq-kq个向量为禁用码字。如果选出的kq个作为合法码字的向量的集合构成了V的一个k维线性子空间,则称它是一个q进制[n,k]线性分组码。如果值取自GF(q)上的[n,k]分组码的kq个码字的集合C,便构成了有限域GF(q)上的n维线性空间V的一个k维线性子空间,则称C是一个q进制[n,k]线性分组码。2、循环码的编码原理在编码时,首先需要根据给定循环码的参数确定生成多项式g(x),也就是从的因子中选一个(n-k)次多项式作为g(x);然后,利用循环码的编码特点,即所有循环码多项式A(x)都可以被g(x)整除,来定义生成多项式g(x)。根据上述原理可以得到一个较简单的系统循环码编码方法:设要产生(n,k)循环码,m(x)表示信息多项式,则其次数必小于k,而·m(x)的次数必小于n,用·m(x)除以g(x),可得余数r(x),r(x)的次数必小于(n-k),将r(x)加到信息位后作监督位,就得到了系统循环码。下面就将以上各步处理加以解释:(1)用乘m(x)。这一运算实际上是把信息码后附加上(n-k)个“0”。例如,信息码为110,它相当于m(x)=+x。当n-k=7-3=4时,·m(x)=+,它相当于1100000。而希望的到得系统循环码多项式应当是A(x)=·m(x)+r(x)。(2)求r(x)。由于循环码多项式A(x)都可以被g(x)整除,也就是:因此,用·m(x)除以g(x),就得到商Q(x)和余式r(x),即这样就得到了r(x)。(3)编码输出系统循环码多项式A(x)为:例如,对于(7,3)循环码,若选用,信息码110时,则这时的编码输出为:1100101。四、具体实验方法1、对于问题一,已知线性分组码的生成矩阵G,因为要产生系统码,而给定的生成矩阵不是典型生成矩阵,因此首先要将G通过一系列初等行变换,变为典型生成矩阵。然后利用码组矩阵A等于信息矩阵C与典型生成矩阵G的乘积,将所得的矩阵A按照异或运算的规则进行相应的处理,即可求得所有的生成码字矩阵A(A中每一行为一个生成码字),将生成码字矩阵A的每一行与其他行进行比较,如果对应值相同则为0,不同则为1,将比较所得的结果保留在一个与A矩阵列数相同的矩阵M中,再对M中的所有行求和,则得到任意两个码字的汉明距离S,对所得结果S求最小值,即得到最小汉明距离。2、对于问题二,首先利用函数cyclpoly函数来产生(15,4)循环码的所有可能的生成多项式,然后在所有可能的生成多项式中任选一个作为(15,4)循环码的生成多项式g,任选一个信息码元m1求其对应的循环码字,具体过程如下:1)将信息码元m1*x^11,即将信息码元左移11位,并将其由多项式形式转化为矩阵形式m22)用g除m2得到余数R,由于在求解余数时是按照一般的算术运算计算的,而实际要求的为模2运算,所以要经过适当的转化,转化为模2运算,得到符合要求的R3)将m2与R相加,即得到对应于信息码为m1的码字T4)将得到的码字T进行循环移位运算,即得到所有码字5)利用与问题一同样的方法即可得到最小汉明距离五、实验源代码、仿真结果及分析1、已知一(10,4)线性分组码的生成矩阵为1001110111111000111001101101011101111001G试用Matlab求出该码的全部码字和最小汉明距离。(1)源代码G=[1001110111;1110001110;0110110101;1101111001]%生成矩阵%将生成矩阵标准化,化为典型生成矩阵B1=G(2,:),G(2,:)=G(3,:),G(3,:)=B1;%交换第2、3行的位置G(3,:)=(~G(3,:)&G(2,:))|(G(3,:)&(~G(2,:)));%将第2行的数据与第3行的数据进行异或运算作新的第3行的值G(4,:)=(~G(4,:)&G(2,:))|(G(4,:)&(~G(2,:)));%将第2行的数据与第4行的数据进行异或运算作为新的第4行的值G(1,:)=(~G(1,:)&G(3,:))|(G(1,:)&(~G(3,:)));%将第3行的数据与第1行的数据进行异或运算作为新的第1行的值G(4,:)=(~G(4,:)&G(3,:))|(G(4,:)&(~G(3,:)));%将第3行的数据与第4行的数据进行异或运算作为新的第4行的值B2=G(1,:),G(1,:)=G(3,:),G(3,:)=B2;%交换第1、3行的位置G(2,:)=(~G(2,:)&G(4,:))|(G(2,:)&(~G(4,:)));%将第4行的数据与第2行的数据进行异或运算作为新的第2行的值G(2,:)=(~G(2,:)&G(3,:))|(G(2,:)&(~G(3,:)));%将第3行的数据与第2行的数据进行异或运算作为新的第2行的值G(4,:)=(~G(4,:)&G(3,:))|(G(4,:)&(~G(3,:)));%将第3行的数据与第4行的数据进行异或运算作为新的第4行的值B3=G(3,:),G(3,:)=G(4,:),G(4,:)=B3;%交换第3、4行的位置%信息位码元矩阵为CC=[0000;0001;0010;0011;0100;0101;0110;0111;1000;1001;1010;1011;1100;1101;1110;1111]%生成的含有全部码字的矩阵AA=C*Gfori=1:16forj=1:10if(A(i,j)==2)|(A(i,j)==4)A(i,j)=0;endifA(i,j)==3A(i,j)=1;endendend%由于进行乘法运算中各数是进行加和,必须改为异或运算,即使生成矩阵中只含有0和1,以上即是运用异或运算的规则进行转化%求最小汉明距离t=1;fori=1:15forj=i+1:16M(t,:)=(A(i,:)~=A(j,:));t=t+1;endend%分别比较两行中不同的元素S=(sum(M,2))'%将M矩阵的每一行求和,得出任意两个码字之间的距离d=min(S)%最小汉明距离(2)仿真结果以及仿真分析1)将生成矩阵进行标准化,化为典型生成矩阵如下:分析及说明:通过一系列的初等行变换将最开始的一般生成矩阵转换为典型生成矩阵,由以上矩阵G可知,为一个标准矩阵。2)全部码字如下:说明以及分析:矩阵A的每一行表示(10,4)线性分组码的一个码字,每一个码字由10位构成,包括四位信息位和六位监督位。可知,(10,4)线性分组码总共有16个许用码字。3)任意两个码字之间的汉明距离如下:4)最小汉明距离为d=22、用Matlab求x15+1的所有因子,构造(15,4)循环码的所有可能的生成多项式;选择其中一个作为(15,4)循环码的生成多项式,求出所有的许用码字,并计算最小汉明距离。(1)源代码symsxG=cyclpoly(15,4,'all')%求出所有的生成多项式g=G(2,:)%选择任意一个作为(15,4)循环码的生成多项式r=15-4%监督位数m1=x^3+x^2+1%信息码元m11=expand(x^r*m1)%用x^r乘以m1,相当于对m1进行左移r位的操作m2=sym2poly(m11)%将多项式转化为矩阵表示形式[Q,R]=DECONV(m2,g)%求m2除以g所得的余数R=abs(R)fori=1:length(R)ifR(i)==2R(i)=0endend%由于在求解余数时是按照一般的算术运算计算的,而实际要求的为模2运算,转化为模2运算T=R+m2%T为生成的一个循环码字T2(1,:)=Tfori=1:14T2(i+1,:)=circshift(T2(i,:),[0,1])end%T2为将得到的第一个循环码字进行循环,得到其他的码字Y=[zeros(1,15);T2]%Y矩阵为生成的全部码字%求最小汉明距离t=1;fori=1:15forj=i+1:16M(t,:)=(Y(i,:)~=Y(j,:));t=t+1;endend%分别比较两行中不同的元素S=(sum(M,2))'%将M矩阵的每一行求和,得出任意两个码字之间的距离d=min(S)%最小汉明距离(2)仿真结果1)构造出(15,4)循环码的所有可能的生成多项式如下:说明以及分析:矩阵G的每一行为一个生成多项式的矩阵表示形式,g1、g2、g3为(15,4)循环码的所有生成多项式,可知总共有三个生成多项式的。2)选择g=[100110101111]作为生成多项式,得到的所有许用码字如下:说明以及分析:矩阵Y的每一行表示(15,4)循环码的一个许用码字,每一个许用码字有15位构成,包括四位信息位和十一位监督位。可知,(15,4)循环码总共有16个许用码字。3)最小汉明距离先求任意两个码字之间的汉明距离为通过对矩阵求最小值,可得最小汉明距离d=84)选择g=[111101011001]作为生成多项式,得到的所有许用码字如下:5)最小汉明距离d=86)分析及结论:根据以上所得的结果可知,在不同的生成多项式下所产生的码字是不同的,但最小汉明距离一样。六、实验总结1、通过这次实验,对matlab的使用有了一个更加熟练的掌握和了解,更加体会到matlab功能的强大。在这个实验中通过求线性分组码和循环码的生成码字和最小汉明距离等,对这些码字的构成原理有了更加深刻的理解和掌握,受益很深。2、对于线性分组码,实验中给出了生成矩阵,但不是典型生成矩阵,所以先经过一系列的初等行变换将其转化为典型生成矩阵,这样使得生成的所有码字为系统码,即信息位在前,监督码在后,并且位置不会发生变化,这样看以来更加方便。3、循环码的码字生成,只需先生成一个非零的可用码字,然后将这个码字进行循环移位即可得到所有的码字,只需知道这个原理,实验就比较简单了。通过自己编写代码,对循环码的生成原理以及具体的实现过程了解得更加透彻。4、线性分组码和循环码是信道编码中比较常见的编码方法,编码比较简单,并且具有一定的纠错和检错的能力。