循环码编译码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
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,1
for i=1:8*M
if rem(abs(Ai(i)),2)==0
Ai(i)=0;
else
Ai(i)=1;
end
end
C=Ai;%循环编码的输出码字C=Ai
end
循环码译码程序
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);%用来存放校正子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;
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); end
if flag==1
disp('检测出有错误,但无法纠正!'); else
disp('没有错误');
end
end。