您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 数据通信与网络 > 基于matlab线性分组码实验设计
重庆交通大学信息论与编码综合设计实验报告班级:级班姓名:学号:实验项目名称:线性分组码编译码实验实验项目性质:设计性实验实验所属课程:信息论与编码理论实验室(中心):网络实验中心指导教师:实验完成时间:年月日一、设计题目线性分组码编译码实验二、实验目的:1.掌握线性分组码的编码原理、编码步骤和译码方法2.熟悉matlab软件的基本操作,学会用matlab软件进行线性分组码的编码和译码三、实验主要内容及要求:设计(15,11)或(255,247)线性分组码,利用随机生成的二进制序列及BPSK调制方式,比较使用信道编码与未使用信道编码的误比特率曲线四、实验设备及软件:PC机一台、Matlab软件五、设计方案①(15,11)线性分②①②教师评阅意见:签名:年月日实验成绩:信源编码信道编码BPSK调制信道传输噪声解调信道译码信源译码统计误码率该实验系统框图如上图所示,其中信源编码在本实验不做讨论,编号①采用线性分组码编码和译码,编号②为不采用信道编译码,通过这两种方法的对比,得出误码率曲线。1.线性分组码编码本实验采用的是(15,11)的线性分组码,线性分组码的编码由监督矩阵和生成矩阵实现,监督矩阵H为(4×11)的矩阵,由监督方程和(4×4)的单位矩阵构成,生成矩阵G为(11×15)的矩阵,由(11×11)的单位矩阵和监督矩阵的转置矩阵构成。具体实现方法如下:①将要编码的序列先整形,整为11列②如果序列不能被11整除在后边补0使其能被11整除③将整形后的序列与生成矩阵G相乘即得到编码后的码字其实现代码如下:function[n,C]=xxbm(n)a=randint(1,n);%生成01随机序列disp('编码序列:');disp(a);subplot(3,2,1);stairs(a);axis([1length(a)-0.51.5])title('编码序列');%判断生成的随机序列个数是否是11的整数倍iflength(a)/11==fix(length(a)/11)%随机序列个数是11的整数倍,直接编码b=reshape(a,11,(length(a)/11));M=b';F=eye(11);S=[0011;0101;0110;0111;1001;1010;1011;1100;1101;1110;1111];K=eye(4);G=[F,S];H=[S',K];C=rem(M*G,2);disp('生成矩阵G:');disp(G);disp('监督矩阵H:');disp(H);disp('码字:');disp(C);else%随机序列个数不是11的整数倍,补0后编码s1=[a,zeros(1,(fix(length(a)/11)+1)*11-length(a))];%补0b=reshape(s1,11,(length(s1)/11));M=b';F=eye(11);S=[0011;0101;0110;0111;1001;1010;1011;1100;1101;1110;1111];K=eye(4);G=[F,S];H=[S',K];%监督矩阵C=rem(M*G,2);disp('生成矩阵G:');disp(G);disp('监督矩阵H:');disp(H);disp('码字:');disp(C);endsubplot(3,2,2);stairs(C);axis([1length(C)-0.51.5]);title('编码后的码字');2.BPSK调制BPSK调制实现方法为:①将0、1序列变为-1、1序列;②将序列与载波相乘,为‘1’时与载波相位相同,为‘-1’时与载波相位相反。其实现代码如下:function[fc,fs,datarate,modusignal]=BPSKmodu(bits,datarate)fc=datarate*2;fs=fc*8;modusignal=[];t=linspace(0,2,16);carriar=cos(2*pi*t);bits=bits*2-1;fori=1:length(bits)modusignal=[modusignal,bits(i)*carriar];endsubplot(3,2,3);plot(modusignal);title('BPSK调制后的波形');3.信道加噪使用awgn函数对调制信号进行加噪,其实现代码如下:functioncs=channel(modusignal,bits)cs=awgn(modusignal,1);subplot(3,2,4);plot(cs);title('相乘后信号频谱');title('加噪后的波形');4.BPSK解调产生一个与载波频率相同的本地载波,与经信道加噪后的调制信号相乘,得到解调信号。然后通过低通滤波器滤波器再抽样判决,得出解调后的原始信号。(要减去滤波器的延时时间t,t=(滤波器长度+1)/2)其实现代码如下:functionk=designal(modusignal)designal=[];t=linspace(0,2,16);carrier=cos(2*pi*t);fori=1:16:length(modusignal)designal=[designal,modusignal(i:i+15).*carrier];endsubplot(3,2,5);plot(designal);title('解调后的波形');loadlppassL=(length(lppass)+1)/2;y=filter(lppass,1,designal);fori=1:length(y);ify(i)0y(i)=-1;elsey(i)=1;endendsubplot(3,2,6);plot(y);axis([Llength(y)+L-1.51.5]);title('抽样判决后的波形');%-----------------------------------%抽样判决fori=1:1:length(y)/16k(i)=0;forj=1:16k(i)=k(i)+y((i-1)*16+j);endk(i)=k(i)/16;ifk(i)0k(i)=0;elsek(i)=1;endend5.信道译码(线性分组码译码)译码原理:利用错误图样和伴随式纠错。本实验所采用的为(15,11)线性分组码,最小汉明距离为3,所以具有纠错1位检错两位的功能。设一个接收码字矩阵为R,R*H'=S(模2乘),则S为码字对应的伴随式矩阵如果S=0则说明接受码字无差错;如果S不为0,查看矩阵S中不为0的那行所在行数,该行即收码字错误所在行i;将S转置,将不为0的一列与H每一列进行比较,找到H中相同列,该列的列数即为错误所在列;④由步骤得到错误具体位置,模2加对应的错误图样就可得到正确码字。其实现代码如下:functionI=xxym(n,C)[a,b]=size(C);S=[0011;0101;0110;0111;1001;1010;1011;1100;1101;1110;1111];K=eye(4);H=[S',K];A=[000000000000000];B=eye(15);E=[A;B];%生成错误图样S=rem(C*H',2);Q=H';m=zeros(1,a);fori=1:aforj=1:bifS(i,:)==Q(j,:)%找出出错的位置m(i)=j;%数组m记录出错的位置endendendfori=1:a%在错误的位置给出提示并纠错switch(m(i))case0disp('没有出现错误!');G(i,:)=C(i,:)+E(1,:);case1disp('注意:第1位出现一个错误!已纠错!');G(i,:)=C(i,:)+E(2,:);case2disp('注意:第2位出现一个错误!已纠错!');G(i,:)=C(i,:)+E(3,:);case3disp('注意:第3位出现一个错误!已纠错!');G(i,:)=C(i,:)+E(4,:);case4disp('注意:第4位出现一个错误!已纠错!');G(i,:)=C(i,:)+E(5,:);case5disp('注意:第5位出现一个错误!已纠错!');G(i,:)=C(i,:)+E(6,:);case6disp('注意:第6位出现一个错误!已纠错!');G(i,:)=C(i,:)+E(7,:);case7disp('注意:第7位出现一个错误!已纠错!');G(i,:)=C(i,:)+E(8,:);case8disp('注意:第7位出现一个错误!已纠错!');G(i,:)=C(i,:)+E(9,:);case9disp('注意:第7位出现一个错误!已纠错!');G(i,:)=C(i,:)+E(10,:);case10disp('注意:第7位出现一个错误!已纠错!');G(i,:)=C(i,:)+E(11,:);case11disp('注意:第7位出现一个错误!已纠错!');G(i,:)=C(i,:)+E(12,:);case12disp('注意:第7位出现一个错误!已纠错!');G(i,:)=C(i,:)+E(13,:);case13disp('注意:第7位出现一个错误!已纠错!');G(i,:)=C(i,:)+E(14,:);case14disp('注意:第7位出现一个错误!已纠错!');G(i,:)=C(i,:)+E(15,:);case15disp('注意:第7位出现一个错误!已纠错!');G(i,:)=C(i,:)+E(16,:);endendG=rem(G,2);%求出正确的编码disp('检错并纠错后的码组:');disp(G);%显示正确的编码j=1;whilej=11%提取信息位I(:,j)=G(:,j);j=j+1;end[m1,n1]=size(I);I=I';I=reshape(I,1,m1*n1);fori=1:nC1(i)=I(i);enddisp('译出的序列:');disp(C1);%显示原信息码六、测试结果及说明:1.信噪比为1时,结果如图:246810-0.500.511.5编码序列51015-0.500.511.5编码后的码字0100200300-101BPSK调制后的波形0100200300-505加噪后的波形0100200300-101解调后的波形50100150200-101抽样判决后的波形2.信噪比为5时,结果如图:246810-0.500.511.5编码序列51015-0.500.511.5编码后的码字0100200300-101BPSK调制后的波形0100200300-505加噪后的波形0100200300-101解调后的波形50100150200-101抽样判决后的波形3.信噪比为10时,结果如图:246810-0.500.511.5编码序列51015-0.500.511.5编码后的码字0100200300-101BPSK调制后的波形0100200300-202加噪后的波形0100200300-101解调后的波形50100150200-101抽样判决后的波形4.译码时,当检测到误码时,结果如图:实验结果分析:由以上实验结果可知,该程序基本完成了线性分组码的编码、调制、加噪、解调、译码(包括检错纠错)等一系列操作。随着信噪比的降低解调信号错误率越高,由于(15,11)线性分组只能纠正一位错误,对于大于等于2位的错误不能纠正,所以信噪比低低的情况下,会出现教的误码。需要采取纠错能力更强的信道编码方法进行编码。七、实验体会:该实验是综合了matlab编程,信息论与编码的知识,实验中涉及到编码与译码、调制与解调、检错与纠错等内容,对初学者难度较大。对于实验中的难点,要经过仔细分析思考,反复实验,最终才可能取得理想的效果。该程序中编码采用生成矩阵才获得码字,所以具有一定的局限性,解调中用到的滤波器由自己设计,由于滤波器的参数对实验结果影响较大,所以滤波器的设计也是非常重要的。通过实验,让我明白一个道理,理论的学习远远不能满足实际需要,即使课本
本文标题:基于matlab线性分组码实验设计
链接地址:https://www.777doc.com/doc-7315147 .html