...信道编码姓名:郭宇琦学号:xxx2009xxx一、实验目的1.复习巩固BCH码编码译码知识。2.使用matlab进行实践编写BCH,了解实际应用中BCH的编码译码过程。3.结合实践验证所学BCH码知识。二、实验原理BCH码是用于校正多个随机错误的多级、循环、错误校正、变长数字编码,是循环码的子类。本原BCH码编码原理如下:1.确定n、m、t.2.用函数构造扩域GF()mq,q=2取二进制,GF(2)m3.取本原元,根据纠错能力t,确定连续根232t,,,,。通过逐个验证每个元素来找出每一个根的全部共轭根系。根据-1242()(-)(-)(-)(-)kMxxxxx计算最小多项式。4.所有非共轭根系的最小多项式乘积得到生成多项式()gx5.利用系统码编码方程--()()=()+Rem[()]nknkgxCxxmxxmx,进行编码。BCH码译码方法主要有Peterson译码法和Berlekamp迭代译码法等,其中Peterson译码方法如下:1.计算伴随式。已知接受向量()Rx,则(),i=1,2,...2iiSRt2.求解错误位置。引入错误位置多项式,将求解错误位置的问题转化为求解线性方程组的问题1-121+1+1122+22112222++.......+=++......+s=......s......eeeeeeeeeeeeessssssssss3.用Peterson译码方法译码,解出错误位置多项式系数和错误图样,得到估值码字。(1).假设e=t,计算S行列式M的值。M=0则降阶,e=e-1,同样计算直到M≠0.(2)将上面得到的2t个连续根代入试根,求上述方程组解。取倒数即为错误位置。由此写出错误图样。(3)求出译码。...每一步具体的实现方法,详见程序源代码注释。三、程序框图编码框图输入码长度n和纠错能力t求m,判断能否生成该码NO生成扩域GF(2^m)找本原元a找2t个连续根和其共轭根系计算最小多项式计算生成多项式g(x)得到信息序列通过译码方程进行译码输出码字显示输出码字n,t输入信息序列YES结束...过信道框图发送码字信道(高斯白/理想)接收码字译码框图四、实验结果分析结果截图:...上面是较高信噪比时127位BCH正确译码下面是较低信噪比时127为BCH错误译码...结果框内容(加粗部分是手动输入内容,下划线是结果重点):---简易BCH编码译码系统---输入码长n=128错误:只支持本原BCH码输入码长n=127输入纠错能力t=6计算得码长k=85自动生成随机信息序列输入1,手动键入信息序列输入0:1随机生成的序列为m=0010101101010000011001101111001000111110110000000001111111010100001101110111010111011编码后生成码序列为0010101101010000011001101111001000111110110000000001111111010100001101110111010111011100100100001001000010111100101011010101110过高斯白信道输入1,过理想信道输入0:1输入信道信噪比(单位分贝,15左右较合适):10接收码字为0010101101010000011001101111001000111110110000000001111111110100001101110111010111001100100100001001000010111100101110010101110发送码字为0010101101010000011001101111001000111110110000000001111111010100001101110111010111011100100100001001000010111100101011010101110通过信道后出错4位错误图样为0000000000000000000000000000000000000000000000000000000000100000000000000000000000010000000000000000000000000000000101000000000译码结果为0010101101010000011001101111001000111110110000000001111111010100001101...110111010111011100100100001001000010111100101011010101110还原信息序列为m’=0010101101010000011001101111001000111110110000000001111111010100001101110111010111011译码正确五、实验小结整个过程严格按照所学BCH码相关知识编写,所得结论完全正确。六、源代码clcclearall%----------------------------------------------disp('---简易BCH编码译码系统---')flag=1;while(flag)%输入nn=input('输入码长n=');m=0;while(2^m-1~=n&&m20)%计算mm=m+1;endif(m==20)%非本原就重新输入disp('错误:只支持本原BCH码')elseflag=0;endendflag=1;while(flag)%输入tt=input('输入纠错能力t=');if((t=floor((n-1)/2))||(t=0))disp('错误:纠错能力不能为0或者不能太大')elseflag=0;endend%----------------------------------------------a=gf(2,m);%构造扩域,matlab自动只把a当做扩域中的本原元fori=1:2:(2*t-1)%求最小多项式,只找奇数项b=[1,a^i];%让b分别为a^i...找每一个(这么定义是要卷积的)l=i;whilea^i~=a^(2*l)%找共轭根系...l=2*l;b=conv(b,[1,a^l]);%求最小多项式endifi==1g=b;elseg=conv(g,b);%求生成多项式利用卷积,进行连乘endend%--------------------------------------------------gx=double(g.x);%从扩域到数域相当于变成多项式k=n-length(gx)+1;%k=n-(r+1)+1disp(['计算得码长k=',num2str(k)])flag=1;while(flag)temp=input('自动生成随机信息序列输入1,手动键入信息序列输入0:\n');iftempmx=round(rand(1,k));%随机生成信息组disp(['随机生成的序列为m=',num2str(mx)])flag=0;elseinputm=str2mat(input('输入信息序列','s'));iflength(inputm)~=kdisp(['错误:输入码长应为',num2str(k)])elseflag=0;endmx=str2num(inputm(:))';endend%----------------------------------------------------x1=zeros(1,length(gx));%循环码编码方程中的x1(1)=1;c1=conv(x1,mx);%码字的前k位,编码方程第一项[q,r]=deconv(c1,gx);r=mod(r,2);%编码方程第二项c=mod(c1+r,2);%生成系统码,转换成为二进制disp(['编码后生成码序列为',num2str(c)])%-----------------------------------------------------judge=input('过高斯白信道输入1,过理想信道输入0:\n');ifjudge==1SNR=input('输入信道信噪比(单位分贝,15左右较合适):');rr=awgn(c,SNR);%过信道elserr=c;endfori=1:n%量化为01序列ifrr(i)=0.5...r(i)=1;elser(i)=0;endenddisp(['接收码字为',num2str(r)])disp(['发送码字为',num2str(c)])enum=0;fori=1:nifr(i)~=c(i)enum=enum+1;endenddisp(['通过信道后出错',num2str(enum),'位'])%-----------------------------------------------------s=a+a;%构造伴随式,初始化sfori=1:2*ts(i)=a+a;forj=1:ns(i)=s(i)+r(j)*a^((n-j)*i);endendfore=t:-1:1%降阶A=a+a;fori=1:eforj=1:eA(i,j)=s(e+i-j);endendifdet(A)~=0break;%判断行列式是否为奇异,是就继续降endendd=rank(A);%开始求方程组B=a+a;fori=1:dB(i)=s(d+i);endifA==a+a%接受的码字出错的情况cc=r;E=zeros(1,n);elsesigma=A\(B');%错误位置多项式的系数E=zeros(1,n);x=a+a;ki=1;...fori=1:n%试根h=a^0;forj=1:dh=h+sigma(j)*a^(i*j);endifh==a+ax(k)=a^(n-i);E(i)=1;%错误图样,可以不用求具体根,找到位置即可ki=ki+1;endendcc=mod(E+r,2);%校正接收码字enddisp(['错误图样为',num2str(E)])disp(['译码结果为',num2str(cc)])m=c(1:k);disp(['还原信息序列为m’=',num2str(m)])ifcc==cdisp('译码正确')elsedisp('译码错误')end