(7,4)循环码的编码和译码
- 格式:doc
- 大小:117.00 KB
- 文档页数:14
执行部门 页脚内容1
(7,4)循环码的编码译码 编码的实验原理: 根据循环码的代数性质建立系统编码的过程,可以把消息矢量用如下多项式表示:
要编码成系统循环码形式,把消息比特移入码字寄存器的最右边k位,而把监督比特加在最左边的n-k个中,则要用knx乘以m(x)得到knx m(x)= knx m(x)= q(x) g(x)+ p(x),其中p(x)可以表示为
p(x)= ,则p(x)+ knx m(x) = + 另U(x)= p(x)+ knx m(x),则U=(0p,1p,2p,···,1knp,0m ,
1m,···,
1km
)。
本实验根据以上原理,用matlab实现书上例6.8系统形式的循环码,生成多项式为g(x)= (7,4)循环码的编码的程序如下:clear;
clc; a=[1 0 1 1]; %高次项系数在前的生成多项式 Gx=[1 0 1 1]; %将数组a的高位依次放在数组Data的低位 Data=zeros(1,7); Data(1)=a(4); Data(2)=a(3); Data(3)=a(2); Data(4)=a(1); %Data除以Gx得到余数Rx
012211...)(mxmxmxmxmkkkkknknnknkxmxmxmxm0112211...
0111...pxpxpknkn0111...pxpxpknknknknnknkxmxmxmxm0112211...
31xx执行部门
页脚内容2 [Qx,Rx]=deconv(Data,Gx); b=Rx+Data; %将数组b的高位放在后面 c=b(1); b(1)=b(7); b(7)=c; c=b(2); b(2)=b(6); b(6)=c; c=b(3); b(3)=b(5); b(5)=c; %将数组b校正 for i=1:7 if rem(abs(b(i)),2)==0 b(i)=0;end end for i=1:7 if rem(abs(b(i)),2)==1 b(i)=1;end end disp('输入序列:'); 执行部门 页脚内容3 a disp('编码输出序列:'); b 程序运行结果为:输入序列:a = 1 1 0 0 编码输出序列:b = 1 0 1 1 1 0 0 改变输入序列a=[1 0 1 1],运行结果:输入序列:a = 1 0 1 1 编码输出序列:b = 1 0 0 1 0 1 1 运行结果的编码如下: 序号 输入序列 输出序列 序号 输入序列 输出序列 1 0000 000 0000 9 1000 110 1000 2 0001 101 0001 10 1001 011 1001 3 0010 111 0010 11 1010 001 1010 4 0011 010 0011 12 1011 100 1011 5 0100 011 0100 13 1100 101 1100 6 0101 110 0101 14 1101 000 1101 7 0110 100 0110 15 1110 010 1110 8 0111 001 0111 16 1111 111 1111 译码的实验原理 g(x)= ,在(n,k)循环码中,由于
g(x)能除尽,因此1nx可分解成g(x)和其他因式的乘积,记为 )()(1xhxgxn
31xx执行部门
页脚内容4 即可写成
)(1)(xgxxhn即h (x) = 则 )(*xh= ,其中)(*xh式h(x)的逆多项式。
监督矩阵多项式可表示为 )()()()(***2xhxxhxhxxH , 相对应的译码和纠错(一位)程序如下: clear; clc; r=[1 0 0 1 1 1 1]; h=[1,0,0;1,1,0;1,1,1;0,1,1;1,0,1;0,1,0;0,0,1]; b=flipud(h); s=r*b; for i=1:3 if rem(abs(s(i)),2)==0 s(i)=0;end end for i=1:3 if rem(abs(s(i)),2)==1 s(i)=1;end
124xxx134xxx执行部门
页脚内容5 end if s==[0 0 0] e=[0 0 0 0 0 0 0 ] elseif s==[1 0 0] e=[0 0 0 0 0 0 1] elseif s==[1 1 0] e=[0 0 0 0 0 1 0] elseif s==[1 1 1] e=[0 0 0 0 1 0 0] elseif s==[0 1 1] e=[0 0 0 1 0 0 0] elseif s==[1 0 1] e=[0 0 1 0 0 0 0] elseif s==[0 1 0] e=[0 1 0 0 0 0 0] else s==[0 0 1] e=[1 0 0 0 0 0 0] end u=r+e; for i=1:7 if rem(abs(u(i)),2)==0 u(i)=0;end 执行部门 页脚内容6 end for i=1:7 if rem(abs(u(i)),2)==1 u(i)=1;end end Data=zeros(1,4); Data(1)=u(4); Data(2)=u(5); Data(3)=u(6); Data(4)=u(7); if e==[0 0 0 0 0 0 0] disp('第几位错误:') k=0,else disp('第几位错误:') k=find(e)
;end disp('接受码字') r disp('编码输出序列:') Data 运行程序结果如下:e = 0 0 0 0 1 0 执行部门 页脚内容7 0 第几位错误:k = 5 接受码 r = 1 0 0 1 1 1 1 编码输出序列: Data =1 0 1 1 以上编码有个缺点,就是它只能对一个消息矢量(4位)进行编码,我又在这个基础上编写了一个可以同时对位数是4的倍数的消息矢量进行编码,多位循环码的编码程序如下:clear; clc; a=[1 1 0 0 1 0 1 1]; [X,N]=size(a); %将信息码分为M帧,1帧4个信息码 M=ceil(N/4); d=zeros(1,4); b=zeros(1,7*M); Data=zeros(1,7); for k=1:M for j=1:4 d(j)=a(j+(k-1)*4);end %生成多项式 Gx=[1 0 1 1]; 执行部门 页脚内容8 Data(1)=d(4); Data(2)=d(3); Data(3)=d(2); Data(4)=d(1);
%Data除以Gx得到余数Rx [Qx,Rx]=deconv(Data,Gx); e=Rx+Data; b(7*k-6:7*k)=e(1:7); c=b(1+(k-1)*7); b(1+(k-1)*7)=b(7+(k-1)*7); b(7+(k-1)*7)=c; c=b(2+(k-1)*7); b(2+(k-1)*7)=b(6+(k-1)*7); b(6+(k-1)*7)=c; c=b(3+(k-1)*7); b(3+(k-1)*7)=b(5+(k-1)*7); b(5+(k-1)*7)=c; end for i=1:M*7 if rem(abs(b(i)),2)==0 执行部门 页脚内容9 b(i)=0;end end for i=1:M*7 if rem(abs(b(i)),2)==1 b(i)=1;end end disp('输入序列:'); a disp('编码输出序列:'); b 程序运行结果如下:输入序列:a = 1 1 0 0 1 0 1 1 编码输出序列:b = Columns 1 through 13 1 0 1 1 1 0 0 1 0 0 1 0 1 Column 14 1
相应的多位译码纠错程序如下:clear; clc;