循环码编译码matlab程序循环码编码程序function[C]=cyclic_encoder(Si)%C为循环编码的输出编码结果%对x^8+1进行模2因式分解得到:x^8+1=(x^3+x^2+x+1)*(x^5+x^4+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)=x^3+x^2+x+1Ai=zeros(1,8*M);%Ai用来存放所输入的码元经过循环编码后的码字Axi=zeros(1,8);%Axi用来表示循环编码后的一帧的编码输出码字mi=zeros(1,5);%mi用来存放每一帧的信息码元fori=1:Mforj=1:5mi(j)=Si(j+(i-1)*5);endAxi(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,1fori=1:8*Mifrem(abs(Ai(i)),2)==0Ai(i)=0;elseAi(i)=1;endendC=Ai;%循环编码的输出码字C=Aiend循环码译码程序function[So]=cyclic_decoder(R)%输入R为经AWGN信道传输后的二进制信息,So为循环译码器的译码结果R=1*(R0.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)=x^5+x^4+x+1hn=[];%hn(x)为监督多项式h(x)的逆多项式,hn用来放hn(x)的各项系数fori=2:5hn(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);%用来存放x^2*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表示检测出错误fori=1:Mforj=1:8Axo(j)=R(j+(i-1)*8);ends=Axo*H';%计算校正子sfork=1:3ifrem(abs(s(k)),2)==0s(k)=0;elses(k)=1;endendifs==[000]ifflag==0flag=0;endelseflag=1;endfork=1:8ifrem(abs(Axo(k)),2)==0Axo(k)=0;elseAxo(k)=1;endendSo(1+(i-1)*5:5+(i-1)*5)=Axo(4:8);endifflag==1disp('检测出有错误,但无法纠正!');elsedisp('没有错误');endend