设计目的数字信号在传输中往往由于各种原因,使得在传送的数据流中产生误码,从而使接收端产生图像跳跃,不连续,出现马赛克等现象。通过信道编码可实现对数据流进行相应的处理,使系统具有一定的纠错能力和抗干扰能力,可极大地避免码流传送中误码的发生。设计要求通过线性分组码实现信道编码,提高系统的可靠性。设计原理信道编码是在数据传输/存储中所采用的降低系统差错率,提高系统可靠性的一种数字处理技术。提高数据传输效率,降低误码率是信道编码的任务。信道编码的本质是增加通信的可靠性。但信道编码会使有用的信息数据传输减少,信道编码的过程是在源数据码流中加查一些码元,从而达到在接收端进行判错和纠错的目的。在宽带固定的信道中,总的传送码率也是固定的,由于信道编码增加了数据量,其结果只能是以降低传送有用信息码率为代价。将有用比特数除以总比特数就等于编码效率,不同的编码方式,其编码效率有所不同。信道编码的目的是改善编码系统模型:图1.通信系统编码模型图(1)信道编码的分类:按差错控制编码的不同功能:检错码:发现错误的码;纠错码:自动纠正错误的码;按信息码元与附加监督码元间检验关系:线性码:监督码元与信息码元满足线性关系;非线性码:监督码元与信息码元不满足线性关系;按信息码元在编码后是否保持原来的形式:系统码;非系统码;按纠正错误的类型:纠正随机错误率的码纠正突发错误率的码按每个码元取值:二进制码;多进制码;按信息码元与监督码元间约束方式:分组码:信息序列每K位分成一组,产生r位监督元,输出长度为n=r+k的码字,r位监督元只与本分组的k位信息元有关,记为(n,k)。(n,k)码中有2k个n重码子,nbit的二进制序列具有2n种不同的组合序列;卷积码:编码器给每k0位信息加上r0位监督元得到长度为n0的码子,该码子的运算,不仅与本组k0位信息有关,还与其前面m组k0位信息有关,记为(n0,k0,m);图2.差错控制编码分类间的关系(2)分组码中的主要参数:1)信息分组:m=(mk−1,mk−2,…..m1,m0)2)码字:c=(ck−1,ck−2,…..c1,c0)3)码长n,信息位个数k,校验位个数r=n−k4)码字个数(二进制):2k5)编码效率:R=kn⁄分组码的编码规则是从2n种不同序列中选择2k个码字,建立信息序列与码字的对应关系,其中2k个码字组成的集合为许用码组,剩余的2n−2k个n重向量组成的集合成为禁用码组。码重:分组码中“1”的个数称为码组的重量,简称码重。码距:码字x与码字y对应位取值不同的个数,又称为汉明距离。最小码距:(n,k)分组码中,任何两个码字之间距离的最小值,成为该分组码的最小汉明距离,用d来表示。最小距离描述分组码特性的重要参数,决定了码的纠错,检错性能。检错能力:一个(n,k)分组码,如果能检出码字内的所有小于或等于e个(位)错误,则称该码的检错能力为e。码的最小距离为d0=e+1,其检错能力为e。纠错能力:一个(n,k)分组码,如果能纠正码字内的所有小于或等于t个(位)错误,则称该码的纠错能力为e。码的最小距离为d0=2t+1,其纠错能力为t,当d∗=2t+1或d∗=2t+2时,都不能纠错t+1个错误。(3)线性分组码基本构造设分组码(7,4)中,用c[6]c[5]c[4]c[3]c[2]c[1]c[0]表示7个码元,用S1,S2,S3表示由三个监督方程式计算得到的校正子,并假设三位S1,S2,S3校正子码与误码位置的对应关系如表1所示。S1S2S3错码位置S1S2S3错码位置000无错码011C3001C0101C4010C1110C5100C2111C6表1.校正子与错码位置关系当误码位置在C2,C4,C5,C6时,校正子Si=1;否则Si=0。因此S1=C2⨁C4⨁C5⨁C6,同理S2=C1⨁C3⨁C5⨁C6和S3=C0⨁C3⨁C4⨁C6。在编码时C3,C4,C5,C6为信息码元,C2,C1,C0为监督码元,则监督码元由以下监督方程唯一确定:{C2⨁C4⨁C5⨁C6=0C1⨁C3⨁C5⨁C6=0C0⨁C3⨁C4⨁C6=0(1)也即:{C2=C4⨁C5⨁C6C1=C3⨁C5⨁C6C0=C3⨁C4⨁C6(2)由上面方程得到表2所示的16个许用码组:信息位监督位信息位监督位c6c5c4c3c2c1c0c6c5c4c3c2c1c00000000100011100010111001100001010110100100011110101100101001101100001010110111010100110011111010001110001111111表2.许用码组和禁用码组(4)监督矩阵将表达式(1)改写成:{1∗C6⨁1∗C5⨁1∗C4⨁0∗C3⨁1∗C2⨁0∗C1⨁0∗C0=01∗C6⨁1∗C5⨁0∗C4⨁1∗C3⨁0∗C2⨁1∗C1⨁0∗C0=01∗C6⨁0∗C5⨁1∗C4⨁1∗C3⨁0∗C2⨁0∗C1⨁1∗C0=0(3)将其表示成如下的矩阵形式:[111010011010101011001][c6c5c4c3c2c1c0]=[000](4)记为:H∗CT=0或C∗HT=0其中H称为监督矩阵,其行数为监督关系式的数目r,H的每一行中的“1”的位置表示相应码元之间存在的监督关系。H可表示为如下形式:H=[PIx],其中P为r*k阶矩阵,Ix为r*r阶单位仿真。(5)生成矩阵由上式可知H矩阵的各行是线性无关的,为实现此特性对上述式进行如下变换:[c2c1c0]=[111011011011][c6c5c4c3](5)或者:[c2c1c0]=[c6c5c4c3][111110101011]=[c6c5c4c3]Q(6)其中Q为k*K阶矩阵,为P的转置,即Q=PT。上式表示在信息位给定后,用信息位的行矩阵乘矩阵Q就产生出监督位。G=[IKQ]G为生成矩阵,[C6C5C4C3C2C1C0]=[c6c5c4c3]G=C。MATLAB仿真实验结果及分析本文中采用的是(15,11)的线性分组码,线性分组码的编码由监督矩阵和生成矩阵实现。监督矩阵H为(4×11)的矩阵,由监督方程和(4×4)的单位矩阵构成,生成矩阵G为(11×15)的矩阵,由(11×11)的单位矩阵和监督矩阵的转置矩阵构成。信噪比为1时的结果图信噪比为10时的结果图随着信噪比的降低解调信号错误率越高,由于(15,11)线性分组码只能纠正一位错误,对于等于或大于2位的错误不能纠正,所以信噪比低的情况下,会出现较多的误码。编程时具体实现方法如下:线性编码:function[n,C]=xxbm(n)a=randint(1,n);disp('编码序列:');disp(a);subplot(3,2,1);stairs(a);axis([1length(a)-0.51.5])title('编码序列');%判断生成的随机序列个数是否是11的整数倍iflength(a)/11==fix(length(a)/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);%4行4列的单位矩阵G=[F,S];H=[S',K];C=rem(M*G,2);disp('生成矩阵G:');disp(G);disp('监督矩阵H:');disp(H);disp('码字:');disp(C);%得到a/11行15列的编码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(1,:));axis([1length(C)-0.51.5]);title('编码后的码字');译码:functionI=xxym(n,C)[a,b]=size(C);%返回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('注意:第8位出现一个错误!已纠错!');G(i,:)=C(i,:)+E(9,:);case9disp('注意:第9位出现一个错误!已纠错!');G(i,:)=C(i,:)+E(10,:);case10disp('注意:第10位出现一个错误!已纠错!');G(i,:)=C(i,:)+E(11,:);case11disp('注意:第11位出现一个错误!已纠错!');G(i,:)=C(i,:)+E(12,:);case12disp('注意:第12位出现一个错误!已纠错!');G(i,:)=C(i,:)+E(13,:);case13disp('注意:第13位出现一个错误!已纠错!');G(i,:)=C(i,:)+E(14,:);case14disp('注意:第14位出现一个错误!已纠错!');G(i,:)=C(i,:)+E(15,:);case15disp('注意:第15位出现一个错误!已纠错!');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);%将I变为1行m1*n1列的fori=1:nC1(i)=I(i);enddisp('译出的序列:');disp(C1);%显示原信息码