lab的(7_4)循环码和(7_4)汉明码的编程设计.docx
- 文档编号:169520
- 上传时间:2022-10-05
- 格式:DOCX
- 页数:15
- 大小:51.84KB
lab的(7_4)循环码和(7_4)汉明码的编程设计.docx
《lab的(7_4)循环码和(7_4)汉明码的编程设计.docx》由会员分享,可在线阅读,更多相关《lab的(7_4)循环码和(7_4)汉明码的编程设计.docx(15页珍藏版)》请在冰豆网上搜索。
.
实验设计
实验一:
(7,4)循环码的编码与译码
1.实验编码原理:
根据循环码的代数性质建立系统编码的过程,可以把消息矢量用如下多项式表示:
.
m(x)=m
xk-1+m
xk-2+...+mx+m
k-1 k-2 1 0
要编码成系统循环码形式,把消息比特移入码字寄存器的最右边k位,而把监
督比特加在最左边的n-k个中,则要用xn-k乘以m(x)得到xn-k
m(x)=
mk-1
xn-1+m
k-2
xn-2+...+mxn-k+1+m
xn-k
1
1
0
0
xn-k
m(x)=q(x)g(x)+p(x),其中p(x)可以表示为
1
1
0
0
p(x)=
pn-k-1
xn-k-1+...+px+p
,则p(x)+
xn-k
m(x)
= mk-1
xn-1+m
k-2
xn-2+...+mxn-k+1+m
xn-k+
pn-k-1
xn-k-1+...+px+p
另U(x)= p(x)+
xn-k
m(x),则U=(p0,p1,p2,···,pn-k-1,m0
,m1,···,mk-1)。
本实验根据以上原理,用matlab实现书上例6.8系统形式的循环码,生成
多项式为g(x)=
1+x+x3
2.实验译码原理:
译码的实验原理g(x)= ,在(n,k)循环码中,
1+x+x3
由于g(x)能除尽,因此xn+1可分解成g(x)和其他因式的乘积,记为
xn+1=
g(x)h(x)
即可写成
h(x)=
xn+1
g(x)
即h(x)=
x4+x2+x+1
h*(x)
x4+x3+x+1
h*(x)
则 = ,其中 式h(x)的逆多项式。
监督矩阵多项式可表示为
éx2h*(x)ù
ê
ú
H(x)=êxh*(x)ú
ë
û
êh*(x)ú
,
3.(7,4)循环码的编码(4位)的程序:
clear;clc;
a=input('请输入消息矢量:
');
%高次项系数在前的生成多项式Gx=[1011];
%将数组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);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)==0b(i)=0;end
end
fori=1:
7
ifrem(abs(b(i)),2)==1b(i)=1;end
end
disp('输入序列:
');a
disp('编码输出序列:
');b
程序运行结果为:
改变输入序列
运行结果的编码如下:
序号
输入序列
输出序列
序号
输入序列
输出序列
1
0000
0000000
9
1000
1101000
2
0001
1010001
10
1001
0111001
3
0010
1110010
11
1010
0011010
4
0011
0100011
12
1011
1001011
5
0100
0110100
13
1100
1011100
6
0101
1100101
14
1101
0001101
7
0110
1000110
15
1110
0101110
8
0111
0010111
16
1111
1111111
4.相对应的译码和纠错(7位)程序:
clear;
clc;
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;
fori=1:
3
ifrem(abs(s(i)),2)==0s(i)=0;end
end
fori=1:
3
ifrem(abs(s(i)),2)==1s(i)=1;end
end
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];
endu=r+e;fori=1:
7
ifrem(abs(u(i)),2)==0u(i)=0;end
end
fori=1:
7
ifrem(abs(u(i)),2)==1u(i)=1;end
endData=zeros(1,4);
Data
(1)=u(4);
Data
(2)=u(5);
Data(3)=u(6);
Data(4)=u(7);
ife==[0000000]
disp('没有错误:
')k=0,else
disp('第几位错误:
')k=find(e)
;end
disp('接收码字')r
disp('译码输出序列:
')
Data
第几位错误:
k=5
接收码字
r=1 0 0 1 1 1 1
译码输出序列:
Data=1 0 1 1
以上编码有个缺点,就是它只能对一个消息矢量(4位)进行编码,我又在这个基础上编写了一个可以同时对位数是4的倍数的消息矢量进行编码。
5.多位循环码(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);fork=1:
M
forj=1:
4d(j)=a(j+(k-1)*4);end
%生成多项式Gx=[1011];
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
fori=1:
M*7
ifrem(abs(b(i)),2)==0b(i)=0;end
end
fori=1:
M*7
ifrem(abs(b(i)),2)==1b(i)=1;end
end
disp('输入序列:
');
a
disp('编码输出序列:
');b
程序运行结果如下:
输入序列:
a=
1 1 0 0 1 0 1 1
编码输出序列:
b=Columns1through13
1 0 1 1 1 0 0 1 0 0 1 0
1
Column14
1
6.多位译码(7的倍数)纠错程序:
clear;
clc;
r=[10011001001001];
[X,N]=size(r);
%将接收到的码分为M帧,1帧7个信息位M=ceil(N/7);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);d=zeros(1,7);U=zeros(1,4*M);
Data1=zeros(1,7*M);Data=zeros(1,7*M);fori=1:
M
forj=1:
7
d(j)=r(j+(i-1)*7);ends=d*b;
fork=1:
3
ifrem(abs(s(k)),2)==0s(k)=0;end
end
fork=1:
3
ifrem(abs(s(k)),2)==1s(k)=1;end
end
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];
endu=d+e;fork=1:
7
ifrem(abs(u(k)),2)==0u(k)=0;end
end
fork=1:
7
ifrem(abs(u(k)),2)==1u(k)=1;end
end
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);
end
ifData==Data1
disp('没有错误:
')m=0,else
disp('第几位错误:
')m=find(Data)
;end
disp('接收到的码字:
');r
disp('译码输出序列:
');U
运行结果:
第几位错误:
m=3 13
接收到的码字:
r=Columns1through13
1 0 0
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- lab _4 循环码 汉明码 编程 设计