(7,4)循环码的编码和译码
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
(7,4)循环码的编码译码
编码的实验原理: 根据循环码的代数性质建立系统编码的过程,可以把消息矢量用如下多项式表示:
要编码成系统循环码形式,把消息比特移入码字寄存器的最右边k 位,而把监督比特加在最左边的n-k 个中,则要用k
n x
-乘以m(x)得到
k n x - m(x)= k n x - m(x)= q(x) g(x)+ p(x),其中p(x)可以表示为
p(x)= ,则p(x)+ k
n x - m(x)
= + 另U(x)= p(x)+ k
n x - m(x),则U=(0p ,1p ,2p ,·,1--k n p ,0m ,1m ,·,1-k m )。
本实验根据以上原理,用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 [Qx,Rx]=deconv(Data,Gx);
12211...)(m x m x m x m x m k k k k ++++=----k
n k n n k n k x m x m x m x m
-+-----++++0112211
(011)
1...p x p x
p k n k n +++----0
111...p x p x p k n k n +++----k n k n n k n k x m x m x m x m -+-----++++0112211 (3)
1x x ++
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('输入序列:');
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 运行结果的编码如下:
译码的实验原理 g(x)= ,在(n ,k )循环码中,由于g(x)
能除尽,因此1+n
x 可分解成g(x)和其他因式的乘积,记为
)()(1x h x g x n =+
即可写成
31x x ++
)(1
)(x g x x h n
+=即h (x) = 则 )(*x h =
,其中)(*
x h 式h(x)的逆多项式。
监督矩阵多项式可表示为
⎥⎥⎥
⎦
⎤
⎢⎢⎢⎣⎡=)()()()(***2x h x xh x h x x H ,
相对应的译码和纠错(一位)程序如下: 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
1
24+++x
x x 134+++x x x
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
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 0