您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 电子设计/PCB > 通信工程基于matlab的(7_4)循环码和(7_4)汉明码的编程设计
实验设计实验一:(7,4)循环码的编码与译码1.实验编码原理:根据循环码的代数性质建立系统编码的过程,可以把消息矢量用如下多项式表示:要编码成系统循环码形式,把消息比特移入码字寄存器的最右边k位,而把监督比特加在最左边的n-k个中,则要用knx乘以m(x)得到knxm(x)=knxm(x)=q(x)g(x)+p(x),其中p(x)可以表示为p(x)=,则p(x)+knxm(x)=+另U(x)=p(x)+knxm(x),则U=(0p,1p,2p,···,1knp,0m,1m,···,1km)。本实验根据以上原理,用matlab实现书上例6.8系统形式的循环码,生成多项式为g(x)=2.实验译码原理:译码的实验原理g(x)=,在(n,k)循环码中,由于g(x)能除尽,因此1nx可分解成g(x)和其他因式的乘积,记为)()(1xhxgxn即可写成)(1)(xgxxhn即h(x)=则)(*xh=,其中)(*xh式h(x)的逆多项式。监督矩阵多项式可表示为)()()()(***2xhxxhxhxxH,3.(7,4)循环码的编码(4位)的程序:012211...)(mxmxmxmxmkkkkknknnknkxmxmxmxm0112211...0111...pxpxpknkn0111...pxpxpknknknknnknkxmxmxmxm0112211...31xx31xx124xxx134xxxclear;clc;a=input('请输入消息矢量:');%高次项系数在前的生成多项式Gx=[1011];%将数组a的高位依次放在数组Data的低位Data=zeros(1,7);Data(1)=a(4);Data(2)=a(3);Data(3)=a(2);Data(4)=a(1);%Data除以Gx得到余数Rx[Qx,Rx]=deconv(Data,Gx);b=Rx+Data;%将数组b的高位放在后面c=b(1);b(1)=b(7);b(7)=c;c=b(2);b(2)=b(6);b(6)=c;c=b(3);b(3)=b(5);b(5)=c;%将数组b校正fori=1:7ifrem(abs(b(i)),2)==0b(i)=0;endendfori=1:7ifrem(abs(b(i)),2)==1b(i)=1;endenddisp('输入序列:');adisp('编码输出序列:');b程序运行结果为:改变输入序列运行结果的编码如下:序号输入序列输出序列序号输入序列输出序列10000000000091000110100020001101000110100101110013001011100101110100011010400110100011121011100101150100011010013110010111006010111001011411010001101701101000110151110010111080111001011116111111111114.相对应的译码和纠错(7位)程序:clear;clc;r=[1001111];h=[1,0,0;1,1,0;1,1,1;0,1,1;1,0,1;0,1,0;0,0,1];b=flipud(h);s=r*b;fori=1:3ifrem(abs(s(i)),2)==0s(i)=0;endendfori=1:3ifrem(abs(s(i)),2)==1s(i)=1;endendifs==[000]e=[0000000];elseifs==[100]e=[0000001];elseifs==[110]e=[0000010];elseifs==[111]e=[0000100];elseifs==[011]e=[0001000];elseifs==[101]e=[0010000];elseifs==[010]e=[0100000];elses==[001]e=[1000000];endu=r+e;fori=1:7ifrem(abs(u(i)),2)==0u(i)=0;endendfori=1:7ifrem(abs(u(i)),2)==1u(i)=1;endendData=zeros(1,4);Data(1)=u(4);Data(2)=u(5);Data(3)=u(6);Data(4)=u(7);ife==[0000000]disp('没有错误:')k=0,elsedisp('第几位错误:')k=find(e);enddisp('接收码字')rdisp('译码输出序列:')Data第几位错误:k=5接收码字r=1001111译码输出序列:Data=1011以上编码有个缺点,就是它只能对一个消息矢量(4位)进行编码,我又在这个基础上编写了一个可以同时对位数是4的倍数的消息矢量进行编码。5.多位循环码(4的倍数)的编码程序如下:clear;clc;a=[11001011];[X,N]=size(a);%将信息码分为M帧,1帧4个信息码M=ceil(N/4);d=zeros(1,4);b=zeros(1,7*M);Data=zeros(1,7);fork=1:Mforj=1:4d(j)=a(j+(k-1)*4);end%生成多项式Gx=[1011];Data(1)=d(4);Data(2)=d(3);Data(3)=d(2);Data(4)=d(1);%Data除以Gx得到余数Rx[Qx,Rx]=deconv(Data,Gx);e=Rx+Data;b(7*k-6:7*k)=e(1:7);c=b(1+(k-1)*7);b(1+(k-1)*7)=b(7+(k-1)*7);b(7+(k-1)*7)=c;c=b(2+(k-1)*7);b(2+(k-1)*7)=b(6+(k-1)*7);b(6+(k-1)*7)=c;c=b(3+(k-1)*7);b(3+(k-1)*7)=b(5+(k-1)*7);b(5+(k-1)*7)=c;endfori=1:M*7ifrem(abs(b(i)),2)==0b(i)=0;endendfori=1:M*7ifrem(abs(b(i)),2)==1b(i)=1;endenddisp('输入序列:');adisp('编码输出序列:');b程序运行结果如下:输入序列:a=11001011编码输出序列:b=Columns1through131011100100101Column1416.多位译码(7的倍数)纠错程序:clear;clc;r=[10011001001001];[X,N]=size(r);%将接收到的码分为M帧,1帧7个信息位M=ceil(N/7);h=[1,0,0;1,1,0;1,1,1;0,1,1;1,0,1;0,1,0;0,0,1];b=flipud(h);d=zeros(1,7);U=zeros(1,4*M);Data1=zeros(1,7*M);Data=zeros(1,7*M);fori=1:Mforj=1:7d(j)=r(j+(i-1)*7);ends=d*b;fork=1:3ifrem(abs(s(k)),2)==0s(k)=0;endendfork=1:3ifrem(abs(s(k)),2)==1s(k)=1;endendifs==[000]e=[0000000];elseifs==[100]e=[0000001];elseifs==[110]e=[0000010];elseifs==[111]e=[0000100];elseifs==[011]e=[0001000];elseifs==[101]e=[0010000];elseifs==[010]e=[0100000];elses==[001]e=[1000000];endu=d+e;fork=1:7ifrem(abs(u(k)),2)==0u(k)=0;endendfork=1:7ifrem(abs(u(k)),2)==1u(k)=1;endendData(1+7*(i-1))=e(1);Data(2+7*(i-1))=e(2);Data(3+7*(i-1))=e(3);Data(4+7*(i-1))=e(4);Data(5+7*(i-1))=e(5);Data(6+7*(i-1))=e(6);Data(7+7*(i-1))=e(7);U(1+(i-1)*4)=u(4);U(2+(i-1)*4)=u(5);U(3+(i-1)*4)=u(6);U(4+(i-1)*4)=u(7);endifData==Data1disp('没有错误:')m=0,elsedisp('第几位错误:')m=find(Data);enddisp('接收到的码字:');rdisp('译码输出序列:');U运行结果:第几位错误:m=313接收到的码字:r=Columns1through131001100100100Column141译码输出序列:U=11001011若把接受序列r改为r=[1011001],即1100的编码1011100的第5位和第7位同时该变,则运行结果为:第几位错误:m=4接收到的码字:r=1011001译码输出序列:U=0001而0001的编码为1010001分析总结:这两组实验基本上完成了循环码的编码和译码,但是该实验的缺点就是不能同时对7位信息码进行两位的纠错,即只能完成一位信息码的纠错。实验二:(7,4)汉明码的编码与译码实现1、实验目的实现(7,4)汉明码的编码与译码,通过这次实验不但加深了对汉明码编码和译码原理了解,而且对线性分组码有所了解。2、实验原理线性分组码的构造方法比较简单、理论较为成熟,应用比较广泛。汉明码是一种能够纠正一个错码的效率比较高的线性分组码,下面以(7,4)码为例就汉明码的编码与译码分别进行介绍:(1)编码原理一般来说,若汉明码长为n,信息位数为k,则监督位数r=n-k。若希望用r个监督位构造出r个监督关系式来指示一位错码的n种可能位置,则要求21rn或211rkr(1)设汉明码(n,k)中k=4,为了纠正一位错码,由式(1)可知,要求监督位数r≥3。若取r=3,则n=k+r=7。这样就构成了(7,4)码。用6543210aaaaaaa来表示这7个码元,用123sss的值表示3个监督关系式中的校正子,则123sss的值与错误码元位置的对应关系可以规定如表1所列。表2.1校正子和错码位置的关系123sss错码位置123sss错码位置0010a1014a0101a1105a1002a1116a0113a000无错码则由表1可得监督关系式:16542saaaa226531saaaa336430saaaa4在发送端编码时,信息位6543aaaa的值决定于输入信号,因此它们是随机的。监督位2a、1a、0a应根据信息位的取值按监督关系来确定,为使所编的码中无错码,则123,,SSS等于0,即65426531643000(5)0aaaaaaaaaaaa方程组(5)可等效成如下矩阵形式6543210111010001101010010110010aaaaaaa(6)式(6)可简化为0TTHA,H为监督矩阵,则由式(6)可得到监督矩阵11101001101010=[PI](7)1011001rH因为生成矩阵'=[IQ]=[I]kkGP,所以由(7)得生成矩阵G如下:k10001110100110[']00101010001011kGIQIP然后利用信息位和生成矩阵G相乘产生整个码组,即有65432106543=(8)AaaaaaaaaaaaG其中A为整个码组矩阵,6543aaaa是信息位。根据上述原理
本文标题:通信工程基于matlab的(7_4)循环码和(7_4)汉明码的编程设计
链接地址:https://www.777doc.com/doc-4048772 .html