循环码编译码matlab程序.docxVIP

  • 3
  • 0
  • 约1.91千字
  • 约 3页
  • 2022-04-08 发布于广西
  • 举报
循环码编译码 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+1 Ai=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 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); %for 循环是为了实现模 2 相加,使循环编码的输出码字 Ai 中只有 0,1 for i=1:8*M if rem(abs(Ai(i)),2)==0 Ai(i)=0; end else end  Ai(i)=1; C=Ai;%循环编码的输出码字 C=Ai end 循环码译码程序 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);%用来存放校正子 s h=[1,1,0,0,1,1];%监督多项式h(x)=x^5+x^4+x+1 hn=[];%hn(x)为监督多项式h(x)的逆多项式,hn 用来放hn(x)的各项系数for i=2:5 hn(i)=h(k+2-i); end hn(1)=h(1); hn(6)=h(6); %计算监督矩阵H H=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 表示检测出错误 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; end else end  s(k)=1; 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; end else end  Axo(k)=1; So(1+(i-1)*5:5+(i-1)*5)=Axo(4:8); end if flag==1 disp(检测出有错误,但无法纠正!); else end end  disp(没有错误);

文档评论(0)

1亿VIP精品文档

相关文档