SuansuJiema(bm,k) end
if YN==2
disp('你选择了不译码。')
disp('%%%%%%%%%%%%%%%%%%%%%%%%%%%%end%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%') end
解码函数:
functionSuansuJiema(bm,num) 18
format long
pa=0.2;pb=0.3;pc=0.1;pd=0.15;pe=0.25; i=1; ym={};
ym{1}(1)=YM(bm); bm0=bm;
whilei>=1&i caseym{1}(i)=='a' bm0=(bm0-0)/pa; caseym{1}(i)=='b' bm0=(bm0-pa)/pb; caseym{1}(i)=='c' bm0=(bm0-pa-pb)/pc; caseym{1}(i)=='d' bm0=(bm0-pa-pb-pc)/pd; caseym{1}(i)=='e' bm0=(bm0-pa-pb-pc-pd)/pe; end i=i+1; ym{1}(i)=YM(bm0); end disp('%%%%%%%%%%%%%%%%%%%%%%%%%%%jiema_start%%%%%%%%%%%%%%%%%%%%%%%') disp(['译码结果是',ym{1}]) disp('%%%%%%%%%%%%%%%%%%%%%%%%%%%jiema_end%%%%%%%%%%%%%%%%%%%%%%%%%') 函数二: functionym=YM(A) pa=0.2;pb=0.3;pc=0.1;pd=0.15;pe=0.25; switch 1 case 0<=A&A case pa<=A&A casepa+pb<=A&A casepa+pb+pc<=A&A casepa+pb+pc+pd<=A&A case A>=1|A<0 disp('该码子为错误编码') end 19 实验六线性分组码的信道编码和译码(2 学时) 一、实验目的 1.熟悉MATLAB 工作环境及工具箱; 2.掌握线性分组码的编码、译码原理以及纠错原理。 二、实验内容 用MATLAB 软件编程实现线性分组码的信道编码和译码。 三、实验仪器、设备 1.计算机-系统最低配置256M 内存、P4 CPU; 2.MATLAB 编程软件。 四、实验原理 1.线性分组码基本原理 首先,将信息序列分成K 个符号一组,然后,在信息组中加入一些校验码 元,组成N 长码字,由此得到(N,K)分组码。(N,K)分组码中任一码字的 码长为N,所含的信息位数目为K,校验位数目为r=N-K,且码中任意两个码 字的和仍为码字。例如,对于(5,2)分组码,N=5,K=2,其编码函数f 为: 1 1 C ?M 2 2 C ?M 3 1 2 1 2 C ?M ?M ?C ?C 4 1 1 C ?M ?C 5 1 2 1 2 C ?M ?M ?C ?C 编码函数可知:c(码字)=m(信息矩阵)G(生成矩阵)其中,生成矩阵为: 1 0 1 1 1 0 1 1 0 1 G ?? ??? ?? 当生成矩阵G 确定后,编码的问题就解决了。又由编码函数的后3 个方程 可以确定校验方程,对应的矩阵形式为0 T CH ? 或0 T GH ? ,式中,H 称为一致 性校验矩阵,一致性校验矩阵如下: 1 1 1 0 0 1 0 0 1 0 1 1 0 0 1 H ?? ?? ? ?? ???? H 和G 的关系为:??K*K K*r G ?I A ,??K*r r*r H ?A I 。 纠错译码时,若发送码字为C,则接收序列为y,校正子* * T T s ?y H ?e H , 因此,可以得到译码c ?y?e(模2 和)。其中,e 称为差错图样。S 是传输 是否出错的标志,称为伴随式。(5,2)线性分组码的最小汉明距离为dmin=3, 20 能够检出2 位错误或纠正1 位错误。 2.线性分组编码、译码算法: (1)线性分组码信道编码: (a)输入生成矩阵G 和原序列; (b)由矩阵G 得到n,k 和H; (c)根据公式生成编码。 (2)线性分组码信道译码: (a)输入生成矩阵G 和接收序列; (b)由矩阵G 得到n,k 和H; (c)根据公式生得到校正S; (d)求错误图样e; (e)译码c ?y ?e。 五、实验步骤 1.根据实验原理能设计出线性分组编码、译码程序; 2.输入矩阵G 和原序列验证编码程序是否正确; 3.输入矩阵G 和接收序列验证译码程序是否正确。 六、实验报告要求 1.按照本节内容后实验报告形式书写; 2.实验总结和心得要详细,可以根据自己实验情况,写出建议。 七、实验注意事项 1.线性分组码中生成矩阵、校验矩阵、伴随式之间的关系。 2.在计算矩阵时,注意位操作运算。 八、思考题 优化程序,提高运算速度? 附录1:实验报告样式: 实验报告 班级:姓名:学号:组别:同组人: 课程名称:实验室:实验时间: (使用实验报告纸的,以上内容可按照实验报告纸格式填写) 实验六线性分组码的信道编码和译码 一、实验目的: 二、实验内容与原理: 三、实验器材(设备、元器件、软件工具、平台): 四、实验步骤: 21 五、程序流程图: 六、实验数据及结果分析: 七、实验结论: 八、思考题: 九、编程、调试过程中遇到的问题及解决方法: 十、其他:实验总结、心得体会及对本实验方法、手段及过程的改进建议等。 附录二: 附录二: 线性分组码的信道编码和译码 close all; clc; G=input('请输入生产矩阵G,例如:G=[1 0 1 1 1;0 1 1 0 1]\\n G='); G; [k,n]=size(G); r=n-k; m=input('请输入需传送消息m,如m=[0 0 0 1 1 0 1 1]\\n m='); l=length(m); if(mod(l,k)) disp('输入消息有误'); else ge=l/k; temp1=[]; fori=1:ge temp1(i,:)=m(k*(i-1)+1:i*k); end m=temp1; c=mod(m*G,2); A=G(:,k+1:n); H=[A',eye(r)]; disp('校验矩阵'); H disp('编码矩阵'); c end disp('敲回车键继续'); pause y=input('输入接收序列y,如:y=[0 0 0 0 0 0 1 1 0 1 1 0 1 1 1 1 0 0 1 0]\\n y='); temp2=[]; fori=1:ge temp2(i,:)=y(1,n*(i-1)+1:i*n); end y=temp2 s=mod(y*H',2); e=s*pinv(H'); 22 fori=1:ge for j=1:n if(e(i,j)>0.5-eps) e(i,j)=1; else e(i,j)=0; end end end cc=mod(y+e,2); sc=cc(:,1:2); disp('差错图样); e disp('估计值'); cc disp('译码序列'); sc__ clear all; close all; clc; 13 n=input('ê?è?D??′·?o?êy:'); p=zeros(1,n); fori=1:n p(1,i)=input('ê?è?D??′·?o????ê:'); end q=p; if sum(p)<1||sum(p)>1 error('ê?è????ê2?·?o????ê·?2?') end a=zeros(n-1,n); n=length(p); fori=1:n-1 [q,l]=sort(q); a(i,:)=[l(1:n-i+1),zeros(1,i-1)]; q=[q(1)+q(2),q(3:n),1]; end fori=1:n-1 c(i,1:n*n)=blanks(n*n); end c(n-1,n)='1'; c(n-1,2*n)='0'; fori=2:n-1 c(n-i,1:n-1)=c(n-i+1,n*(find(a(n-i+1,:)==1))-(n-2):n*(find(a(n-i+1,:)==1))); c(n-i,n)='1'; c( n-i,n+1:2*n-1)=c(n-i,1:n-1); c(n-i,2*n)='0';