74循环码的编码和译码Word下载.docx
《74循环码的编码和译码Word下载.docx》由会员分享,可在线阅读,更多相关《74循环码的编码和译码Word下载.docx(10页珍藏版)》请在冰豆网上搜索。
Data(4)=a
(1);
%Data除以Gx得到余数Rx
[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校正
fori=1:
7
ifrem(abs(b(i)),2)==0
b(i)=0;
end
ifrem(abs(b(i)),2)==1
b(i)=1;
disp('
输入序列:
'
);
a
编码输出序列:
b
程序运行结果为:
a=
1100
b=
1011100
改变输入序列a=[1011],运行结果:
1011
1001011
运行结果的编码如下:
序号
输入序列
输出序列
1
0000
0000000
9
1000
1101000
2
0001
1010001
10
1001
0111001
3
0010
1110010
11
1010
0011010
4
0011
0100011
12
5
0100
0110100
13
6
0101
1100101
14
1101
0001101
0110
1000110
15
1110
0101110
8
0111
0010111
16
1111
1111111
译码的实验原理g(x)=,在(n,k)循环码中,由于g(x)能除尽,因此可分解成g(x)和其他因式的乘积,记为
即可写成
即h(x)=
则=,其中式h(x)的逆多项式。
监督矩阵多项式可表示为
,
相对应的译码和纠错(一位)程序如下:
r=[1001111];
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;
ifrem(abs(s(i)),2)==0
s(i)=0;
ifrem(abs(s(i)),2)==1
s(i)=1;
ifs==[000]
e=[0000000]
elseifs==[100]
e=[0000001]
elseifs==[110]
e=[0000010]
elseifs==[111]
e=[0000100]
elseifs==[011]
e=[0001000]
elseifs==[101]
e=[0010000]
elseifs==[010]
e=[0100000]
elses==[001]
e=[1000000]
u=r+e;
ifrem(abs(u(i)),2)==0
u(i)=0;
ifrem(abs(u(i)),2)==1
u(i)=1;
Data=zeros(1,4);
Data
(1)=u(4);
Data
(2)=u(5);
Data(3)=u(6);
Data(4)=u(7);
ife==[0000000]
第几位错误:
)
k=0,else
k=find(e)
;
接受码字'
r
Data
运行程序结果如下:
e=0000100
k=5
接受码
r=1001111
Data=1011
以上编码有个缺点,就是它只能对一个消息矢量(4位)进行编码,我又在这个基础上编写了一个可以同时对位数是4的倍数的消息矢量进行编码,多位循环码的编码程序如下:
a=[11001011];
[X,N]=size(a);
%将信息码分为M帧,1帧4个信息码
M=ceil(N/4);
d=zeros(1,4);
b=zeros(1,7*M);
fork=1:
M
forj=1:
d(j)=a(j+(k-1)*4);
%生成多项式
Data
(1)=d(4);
Data
(2)=d(3);
Data(3)=d
(2);
Data(4)=d
(1);
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;
M*7
程序运行结果如下:
11001011
Columns1through13
1011100100101
Column14
相应的多位译码纠错程序如下:
r=[10011001001001];
[X,N]=size(r);
%将接收到的码分为M帧,1帧7个信息位
M=ceil(N/7);
d=zeros(1,7);
U=zeros(1,4*M);
Data=zeros(1,7*M);
d(j)=r(j+(i-1)*7);
s=d*b;
ifrem(abs(s(k)),2)==0
s(k)=0;
ifrem(abs(s(k)),2)==1
s(k)=1;
u=d+e;
ifrem(abs(u(k)),2)==0
u(k)=0;
ifrem(abs(u(k)),2)==1
u(k)=1;
Data(1+7*(i-1))=e
(1);
Data(2+7*(i-1))=e
(2);
Data(3+7*(i-1))=e(3);
Data(4+7*(i-1))=e(4);
Data(5+7*(i-1))=e(5);
Data(6+7*(i-1))=e(6);
Data(7+7*(i-1))=e(7);
U(1+(i-1)*4)=u(4);
U(2+(i-1)*4)=u(5);
U(3+(i-1)*4)=u(6);
U(4+(i-1)*4)=u(7);
ifData==zeros(1,7*M);
m=0,else
[j,m]=find(Data);
m
接收到的码字:
U
运行结果如下:
e=0010000
e=0000010
m=313
r=Columns1through13
1001100100100
U=11001011
分析:
这两组实验基本上完成了循环码的编码和译码,但是该实验的缺点就是不能同时对7位信息码进行两位的纠错,即只能完成一位信息码的纠错。