循环码编译码matlab程序.docx
精选优质文档-倾情为你奉上循环码编译码matlab程序循环码编码程序function C = cyclic_encoder( Si )%C为循环编码的输出编码结果%对x8+1进行模2因式分解得到:x8+1=(x3+x2+x+1)*(x5+x4+x+1)y=size(Si,2);%y表示Si的列数,即输入码元的个数M=ceil(y/5);%将信息码元分成M帧,一帧5个信息码元n=8;%循环编码的一帧码长k=5;%信息位的个数r=n-k;%监督位的个数gx=1,1,1,1;%(8,5)循环码的生成多项式g(x)=x3+x2+x+1Ai=zeros(1,8*M);%Ai用来存放所输入的码元经过循环编码后的码字Axi=zeros(1,8);%Axi用来表示循环编码后的一帧的编码输出码字mi=zeros(1,5);%mi用来存放每一帧的信息码元for i=1:M for j=1:5 mi(j)=Si(j+(i-1)*5); end Axi(4:8)=mi(1:5); Axi=circshift(Axi',-r)'%实现(x(n-k)*m(x),其中m(x)的系数由mi决定 qx,rx=deconv(Axi,gx);%实现(x(n-k)*m(x)/g(x),得到商q(x)和余数r(x) Axi=Axi+rx;%实现Axi(x)=Axi(x)+r(x),得到的Axi就是循环编码的编码输出码字 Ai(8*i-4:8*i)=Axi(1:5); Ai(8*i-7:8*i-5)=Axi(6:8);end%for循环是为了实现模2相加,使循环编码的输出码字Ai中只有0,1for i=1:8*M if rem(abs(Ai(i),2)=0 Ai(i)=0; else Ai(i)=1; endendC=Ai;%循环编码的输出码字C=Aiend循环码译码程序function So = cyclic_decoder( R )%输入R为经AWGN信道传输后的二进制信息,So为循环译码器的译码结果R=1*(R>0.5);%对接收到的信号进行抽样判决y=size(R,2);%y表示R的列数,即输入码元的个数M=ceil(y/8);%将接收到的码元R分成M帧,一帧8个码元So=zeros(1,5*M);%用来存放纠检错之后的译码结果Axo=zeros(1,8);%用来存放纠检错之后每一帧的译码结果%对接收信号进行纠检错译码n=8;%循环编码的码长k=5;%信息位的个数r=n-k;%监督位的个数s=zeros(1,3);%用来存放校正子sh=1,1,0,0,1,1;%监督多项式h(x)=x5+x4+x+1hn=;%hn(x)为监督多项式h(x)的逆多项式,hn用来放hn(x)的各项系数for i=2:5 hn(i)=h(k+2-i);endhn(1)=h(1);hn(6)=h(6);%计算监督矩阵HH=zeros(r,n);%监督矩阵H为r*n阶矩阵H0=zeros(1,n);%用来存放hn(x)的系数H1=zeros(1,n);%用来存放x*hn(x)的系数H2=zeros(1,n);%用来存放x2*hn(x)的系数H0(3:8)=hn(1:6);H1(2:7)=hn(1:6);H2(1:6)=hn(1:6);H(1,:)=H2(1:8);H(2,:)=H1(1:8);H(3,:)=H0(1:8);flag=0;%出错的标志,为1表示检测出错误for i=1:M for j=1:8 Axo(j)=R(j+(i-1)*8); end s=Axo*H'%计算校正子s for k=1:3 if rem(abs(s(k),2)=0 s(k)=0; else s(k)=1; end end if s=0 0 0 if flag=0 flag=0; end else flag=1; end for k=1:8 if rem(abs(Axo(k),2)=0 Axo(k)=0; else Axo(k)=1; end end So(1+(i-1)*5:5+(i-1)*5)=Axo(4:8);endif flag=1 disp('检测出有错误,但无法纠正!');else disp('没有错误');endend专心-专注-专业