当前位置:文档之家› matlab(7-4)汉明码和(7-4)循环码的编程设计

matlab(7-4)汉明码和(7-4)循环码的编程设计

二、创新实验设计创新实验一:(7,4)汉明码的编码与译码实现1、实验目的实现(7,4)汉明码的编码与译码,通过这次实验不但加深了对汉明码编码和译码原理了解,而且对线性分组码有所了解。

2、实验原理线性分组码的构造方法比较简单、理论较为成熟,应用比较广泛。

汉明码是一种能够纠正一个错码的效率比较高的线性分组码,下面以(7,4)码为例就汉明码的编码与译码分别进行介绍:(1)编码原理一般来说,若汉明码长为n ,信息位数为k ,则监督位数r=n-k 。

若希望用r 个监督位构造出r 个监督关系式来指示一位错码的n 种可能位置,则要求21r n -≥或211rk r -≥++ (1)设汉明码(n,k )中k=4,为了纠正一位错码,由式(1)可知,要求监督位数r ≥3。

若取r=3,则n=k+r=7。

这样就构成了(7,4)码。

用6543210a a a a a a a 来表示这7个码元,用123s s s 的值表示3个监督关系式中的校正子,则123s s s 的值与错误码元位置的对应关系可以规定如表1所列。

表2.1 校正子和错码位置的关系则由表1可得监督关系式:16542s a a a a =⊕⊕⊕()226531s a a a a =⊕⊕⊕()3 36430s a a a a =⊕⊕⊕()4 在发送端编码时,信息位6543a a a a 的值决定于输入信号,因此它们是随机的。

监督位2a 、1a 、a 应根据信息位的取值按监督关系来确定,为使所编的码中无错码,则123,,S S S 等于0,即65426531643000(5)0a a a a a a a a a a a a ⊕⊕⊕=⎧⎪⊕⊕⊕=⎨⎪⊕⊕⊕=⎩方程组(5)可等效成如下矩阵形式6543210111010001101010010110010a a a a a a a ⎡⎤⎢⎥⎢⎥⎢⎥⎡⎤⎡⎤⎢⎥⎢⎥⎢⎥=⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎣⎦⎣⎦⎢⎥⎢⎥⎢⎥⎣⎦(6)式(6)可简化为0T T HA =,H 为监督矩阵,则由式(6)可得到监督矩阵11101001101010=[P I ] (7)1011001r H ⎡⎤⎢⎥=⎢⎥⎢⎥⎣⎦因为生成矩阵'=[I Q]=[I ]k k G P ,所以由(7)得生成矩阵G 如下:[]k 10001110100110[']00101010001011k G I Q I P ⎡⎤⎢⎥⎢⎥===⎢⎥⎢⎥⎣⎦然后利用信息位和生成矩阵G 相乘产生整个码组,即有[][]65432106543=(8)A a a a a a a a a a a a G=其中A 为整个码组矩阵,6543a a a a 是信息位。

根据上述原理可以得到(7,4)汉明码的整个码组。

(2)译码与检错、纠错原理当数字信号编码成汉明码后,由于信道噪声的存在,使得经过信道后的汉明码会发生差错,使得接收端接收到错码,因此需要多错码进行纠正,以提高通信系统的抗干扰能力及可靠性。

下面分析纠错译码原理。

设B 为接收码组,它是一行7列的矩阵,即1234567=[]B b b b b b b b ,B 中可能含有错码,错误图样7654321=[]E A B e e e e e e e =-,在E 的表达式中,有0(0,1,2,7)1i i i i i b a e i b a =⎧==⎨≠⎩当时当时若0i e =,表示该码元没错;若1i e =,表示该码元为错码。

由E A B =-得(9)A B E=+(9)表示接收码组和错误图样之和等于正确码组U ,通过(9)式就可以实现纠错。

可以用标准阵来表示所有可能的2n 个n 元码组的接收矢量,(n,k)码的标准阵形式如下:123452223242523233343532345234522222n kn kn kn kn kj j j j j A A A A A E A E A E A E A E E A E A E A E A E E A E A E A E A E E A E A E A E A E -----++++++++++++++++ 应该注意到,码组1A (全0码字)起两个作用:既是其中一个正确码组,也是错误图样1E ,代表1A 所在行没有错误。

标准阵中的1232,,n k A E E E -是陪集首,陪集首的选择是有规定的,第j 行的陪集首是在前j-1行中没有出现的最小码组,即错误图样E ,如果不选错误图样作为陪集首,译码将会产生错误。

对于(7,4)汉明码,其最小码重是3,设码的纠错能力为t ,根据公式min 12d t -⎡⎤=⎢⎥⎣⎦得该码的纠错能力为1,即能纠错一位错码。

由于根据完备码的定义有02(12)tn kj n j -=⎛⎫= ⎪⎝⎭∑将(7,4)码代入(12)可以得知,(7,4)汉明码为完备码组,只能纠错和检错一位错码。

对于正确码组A 而言,有(10)T AH =当接收到错码变成码组B 时,有()(11)T T T T T S BH A E H AH EH EH ==+=+=其中S 为校正子所构成的校正矩阵,由于S 和E 如(11)所示的一一对应的关系,对于(7,4)码,错误图样与伴随式的对应关系如下表2.2 伴随式查询表实现纠错。

3、实验内容由于编码涉及到矩阵的运算,而matlab在处理矩阵运算方面有独特优势,所以这次选择用matlab工具来实现(7,4)汉明码的编码和译码。

(7,4)码的编码比较简单,已知监督矩阵H,可以通过函数求生成矩阵G,然后信息位和生成矩阵G相乘就可得到所有的码组,(7,4)汉明码的编码程序如下:%%%(7,4)汉明码编码——2012.11.10clear all;clc;H=[1 1 1 0 1 0 0 ;1 1 0 1 0 1 0;1 0 1 1 0 0 1];%(7,4)码的监督矩阵G=gen2par(H)%(7,4)码的生成矩阵m=[0 0 0 0;0 0 0 1;0 0 1 0;0 0 1 1;0 1 0 0;0 1 0 1;0 1 1 0;0 1 1 1;1 0 0 0;1 0 0 1;1 0 1 0;1 0 1 1;1 1 0 0;1 1 0 1;1 1 1 0;1 1 1 1];%%所有的信息位U=[rem(m*G,2)];disp('(7,4)汉明码的编码结果:');disp(U);由原理分析可知,要实现纠错和检错译码,关键在于伴随式查询表,因此如何实现伴随式查询表是编程的关键,(7,4)汉明码的译码程序如下:%%%下面是(7,4)码译码A=input('请输入接收码组:');[r,l]=size(A);E=[0 0 0 0 0 0 0;0 0 0 0 0 0 1;0 0 0 0 0 1 0;0 0 0 0 1 0 0;0 0 0 1 0 0 0;0 0 1 0 0 0 0;0 1 0 0 0 0 0;1 0 0 0 0 0 0];%%%%%求校正子,然后将其转化成十进制数for i=1:rSx=S(i,1)*4+S(i,2)*2+S(i,3);end%%%%下面是(7,4)码检错for i=1:rswitch(Sx)case 0disp('此接收码字没错')case 1disp('注意:此接收码字的第一位有错,请纠正')case 2disp('注意:此接收码字的第二位有错,请纠正')case 4disp('注意:此接收码字的第三位有错,请纠正')case 3disp('注意:此接收码字的第四位有错,请纠正')case 5disp('注意:此接收码字的第五位有错,请纠正')case 6disp('注意:此接收码字的第六位有错,请纠正')case 7disp('注意:此接收码字的第七位有错,请纠正')endend%%%下面为在知道哪位出错的情况下,进行纠正for i=1:rswitch(Sx)case 0B(i,:)=A(i,:)+E(1,:);case 1B(i,:)=A(i,:)+E(2,:);case 2B(i,:)=A(i,:)+E(3,:);case 4B(i,:)=A(i,:)+E(4,:);case 3B(i,:)=A(i,:)+E(5,:);case 5B(i,:)=A(i,:)+E(6,:);case 6B(i,:)=A(i,:)+E(7,:);case 7B(i,:)=A(i,:)+E(8,:);endendB=rem(B,2);disp('纠错后的码字');disp(B);由于可能在纠错过程中会产生错误,在此,我们设计了检错纠错是否产生错误的程序,程序如下:%%%%下面为检查纠错是否产生错误k=1;for k=1:16if (U(k,:)==B)flag=1;breakendendif flag==1disp('纠错无误');elsedisp('注意:纠错有误,请检查')End由于译码的目的就是找出信息位c,所以,需要从纠错后的码组中提取出信息位,提取信息位的程序如下:%%%下面为提取码的信息位for j=1:4c(:,j)=B(:,j);enddisp('信息位c如下:')disp(c)4、实验结果分析运行编码程序后,得到如下结果通过理论计算,可以得出实验结果和理论编码结果吻合,可以发现,(7,4)码的最小码重是3。

当接收码组为[1 1 0 1 1 0 0]时,译码结果如下运行程序后,可以看到:当接收码组为[1 1 0 1 1 0 0]时,会出现“注意:此接收码字的第六位有错,请纠正”的提示,在程序中,为防止纠错错误,我设置了纠错后的码和编码结果的比较,如果纠错后的码和编码结果当中的某个码组相同,说明纠错无误,否则纠错有误。

当接收码组为[1 1 0 1 1 0 0]时,经过纠错后出现纠错无误的结果,说明纠错后的码是正确码组。

然后提取纠错后的码组的信息位c ,从运行结果可以看出,c=1001。

当接收码组为[0 1 0 1 1 0 1]时,运行结果如下:此接收码组本来就是一个正确码组,所以通过运行程序后,会出现“此接收码字没错”的提示,纠错后的码字和接收的码组是相同的,检查到纠错无误,然后提取信息位c ,信息位c=0101,整个译码完成。

5、改进建议(7,4)汉明码的编码与译码相对比较简单,可以通过matlab 编程实现对信道编码性能的分析,可以编程实现比较编码后的误码率和没编码的误码率,也可以编程实现在有噪声的情况下来进行译码。

创新实验二:(7,4)循环码的编码与译码1.实验编码原理: 根据循环码的代数性质建立系统编码的过程,可以把消息矢量用如下多项式表示:12211...)(m x m x m x m x m k k k k ++++=----要编码成系统循环码形式,把消息比特移入码字寄存器的最右边k 位,而把监督比特加在最左边的n-k 个中,则要用k n x -乘以m(x)得到kn x - m(x)=k n x - m(x)= q(x) g(x)+ p(x),其中p(x)可以表示为p(x)= ,则p(x)+ kn x- m(x)= + 另U(x)= p(x)+ k n x - m(x),则U=(0p ,1p ,2p ,···,1--k n p ,0m,1m ,···,1-k m )。

相关主题