这样,一个k比特信息的线性分组码可以映射到一个长度为n码组上,该码组是从M=2k个码组构成的码集中选出来的,这样剩下的码组就可以对这个分组码进行检错或纠错。
第1章设计目标
要设计一个(6,3)线性分组码的编译码程序,最基本的是要具备对输入的信息码进行编码,让它具有抗干扰的能力。
同时,还要让它具有对接收到的整个码组中提取信息码组的功能。
但是,在实际的通信系统中,由于信道传输特性不理想以及加性噪声的影响,接收到的信息中不可避免地会发生错误,影响通信系统的传输可靠性,因而,本设计还要让该程序具有纠正错误的能力,当接收到的码组中有一位码,发生错误时可以检测到这一位错码,并且可以纠正这一位错码,并且让系统从纠正后的码组中提取正确的信息码组。
针对给定的矩阵
Q=
完成如下的工作:
1完成对任意信息序列的编码
2根据生成矩阵,形成监督矩阵;
3根据得到的监督矩阵,得到伴随式,并根据它进行译码;
4验证工作的正确性。
第2章MATLAB简介
MATLAB是很实用的数学软件它在数学类科技应用软件中在数值运算方面首屈一指。
MATLAB可以进行运算、绘制函数和数据、实现算法、创建用户界面、连接接其他编程语言的程序等,主要应用于工程计算、控制设计、信号处理与通讯、金融建模设计与分析等领域。
MATLAB的基本数据单位是矩阵,它的指令表达式与数学、工程中常用的形式十分相似,故用MATLAB来解算问题要比用C,FORTRAN等语言完成相同的事情简捷得多,并且mathwork也吸收了像Maple等软件的优点,使MATLAB成为一个强大的数学软件。
可以直接调用,用户也可以将自己编写的实用程序导入到MATLAB函数库中方便自己以后调用,此外许多的MATLAB爱好者都编写了一些经典的程序,用户可以直接进行下载就可以用。
第3章基本原理
3.1线性分组码的编码
3.1.1生成矩阵
线性分组码(n,k)中许用码字(组)为2k个。
定义线性分组码的加法为模二加法,乘法为二进制乘法。
即1+1=0、1+0=1、0+1=1、0+0=0;1×1=1、1×0=0、0×0=0、0×1=0。
且码字
与码字
的运算在各个相应比特位上符合上述二进制加法运算规则。
线性分组码具有如下性质(n,k)的性质:
1、封闭性。
任意两个码组的和还是许用的码组。
2、码的最小距离等于非零码的最小码重。
对于码组长度为n、信息码元为k位、监督码元为r=n-k位的分组码,常记作(n,k)码,如果满足2r-1≥n,则有可能构造出纠正一位或一位以上错误的线性码。
下面我们通过(7,3)分组码的例子来说明如何具体构造这种线性码。
设分组码(n,k)中,k=3,为能纠正一位误码,要求r≥3。
现取r=4,则n=k+r=7。
该例子中,信息组为(c6c5c4),码字为(c6c5c4c3c2c1c0).当已知信息组时,按以下规则得到四个校验元,即
c3=c6+c4
c2=c6+c5+c4(3-1)
c1=c6+c5
c0=c5+c4
这组方程称为校验方程。
(7,3)线性分组码有23(8)个许用码字或合法码字,另有27-23个禁用码字。
发送方发送的是许用码字,若接收方收到的是禁用码字,则说明传输中发生了错误。
为了深化对线性分组码的理论分析,可将其与线性空间联系起来。
由于每个码字都是一个二进制的n重,及二进制n维线性空间Vn中的一个矢量,因此码字又称为码矢。
线性分组码的一个重要参数是码率r=k/n,它说明在一个码字中信息位所占的比重,r越大,说明信息位所占比重越大,码的传输信息的有效性越高。
由于(n,k)线性分组,线性分组码的2k个码字组成了n维线性空间Vn的一个K维子空间。
因此这2k个码字完全可由k个线性无关的矢量所组成。
设此k个矢量为c1,c2,…,ck,有生成矩阵形式为
G=
(3-2)
(n,k)码字中的任一码字ci,均可由这组基底的线性组合生成,即
ci=mi ·G=[mn-1mn-2…mn-k]·G式中,mi =[mn-1mn-2…mn-k]是k个信息元组成的信息组。
表3-1(7,3)线性分组码
信息组
码字
000
0000000
001
0011101
010
0100111
011
0111010
100
100110
101
1010011
110
1101001
111
1110100
对于表3-1给出的(7,3)线性分组码,可将写成矩阵形式
[c6c5c4c3c2c1c0]=[c6c5c4]·
故(7,3)码的生成矩阵为
G=
可以看到,从(7,3)码的8个码字中,挑选出k=3个线性无关的码字(1001110)(0100111),(00111101)作为码的一组基底,用c=m·G计算得码字。
一个系统码的生成矩阵G,其左边k行k列应是一个k阶单位方阵Ik,因此生成矩阵G表示为G=[IkP](3-3)
式中,P是一个k×(n-k)阶矩阵。
3.1.2校验矩阵
表3-1所示的(7,3)线性分组码的四个校验元由式(3-1)所示的线性方程组决定的。
把(3-1)移相,有
c6+c4+c3=0
c6+c5+c4+c2=0
c6+c1+c5=0(3-4)
c5+c4+c0=0
上式的矩阵形式为
·
=
这里的四行七列矩阵称为(7,3)码的一致校验矩阵,用H表示,即
H=(3-5)
由H矩阵得到(n,k)线性分组码的每一码字ci,(i=1,2,…,2k),都必须满足由H矩阵各行所确定的线性方程组,即ci·HT=0.(7,3)码的生成矩阵G中每一行及其线性组合都是(n,k)码的码字,所以有G·HT=0。
由G和H构成的行生成的空间互为零空间,即G和H彼此正交。
H=[PTIr]其右边r行r列组成一个单位方阵。
3.2伴随式与译码
3.2.1码的距离及纠检错能力
1.码的距离
两个码字之间,对应位取之不同的个数,称为汉明距离,用d表示。
一个吗的最小距离dmin定义为dmin=min{d(ci,cj),i≠j,ci,cj∈(n,k)},两个码字之间的距离表示了它们之间差别的大小。
距离越大,两个码字的差别越大,则传送时从一个码字错成另一码字的可能性越小。
码的最小距离愈大,其抗干扰能力愈强。
2.线性码的纠检错能力
对于任一个(n,k)线性分组码,若要在码字内
(1)检测出e个错误,则要求码的最小距离d≥e+1;
(2)纠正t个错误,则要求码的最小距离d≥2t+1;(3)纠正t个错误同时检测e(≥t)个错误,则要求d≥t+e+1;
3.2.2伴随式与译码
假设接收端收到的码字为B,那么它和原来发送端发送的码字A之间就有可能存在着误差。
即在码组A={a6a5a4a3a2a1a0}中的任意一位就有可能出错。
这样我们在接收端接收到一个码组是就有可能判断错发送端原来应该要表达的意思。
为了描述数据在传输信道中出现错误的情况,引入了错误图样E,在错误图样中,0代表对应位没有传错,1代表传输错误。
实际上错误图样E就是收序列与发送序列的差。
所以在译码中用接收到的码字B模尔加错误图样E就可以得到发送端的正确码字A。
因此译码的过程就是要找到错误图样E。
定义:
校正子S
S=B*H
=(A+E)*H
=A*H
+E*H
=E*H
因为A是编得的正确码字。
根据前面所叙述,它和监督矩阵的转置相乘为0。
显然,S仅与错误图样有关,它们之间是一一对应的关系。
找到了校正子S,也就可以找到E。
而与发送的码字无关。
若E=0,则S=0;因此根据S是否为0可进行码字的检错。
如果接收码字B中只有一位码元发生错误,又设错误在第i位。
即Ei-1=1,其他的Ei均为0。
在后面的译码程序中,建立了一个校正子S与错误图样E对应的表。
也就是收到一个B序列,就可以通过计算得到一个校正子,而每一个校正子都对应着一个错误图样E,再通过B模尔加上E,就可以得到正确的码字A。
因为在不同的错误序列B中,同一位码元错误时对应的E是一样的,所以可以利用0000000这个正确的码字让它每位依次错误,来求得它的八个校正子。
而这时的矩阵B就是错误图样E。
这样就算得了8个校正子S。
而这时的错误序列B,就是错误图样E,所以有:
E与S都已经得到,这时就可以建立一个表来将它们一一对应起来,以便在编程过程中用SWITCH语句。
第4章推导过程
4.1编码过程
监督矩阵H与生成矩阵G的关系:
由H与G的分块表示的矩阵形式
H=[PIn-k](4-1)
G=[IkQ](4-2)
P=QT(4-3)
则有G·HT=0(4-4)或 H·GT=0(4-5)
已知给出的(6,3)码的Q矩阵
Q=(4-6)
则可以根据G=[IkQ]求出生成矩阵
G=(4-7)
由 P=QT和 H=[PIn-k]可求出监督矩阵H为
H=
有了生成矩阵后则可以根据输入的四位信息位和生成矩阵相乘得到编码矩阵,即
MATLAB函数为:
C=rem(I*G,2);(4-8)
其中C为编码后的结果,I为信息矩阵,G为生成矩阵。
则编码的所有情况为:
编码序列:
信息位||监督位
C=(4-9)
4.2译码过程
对于译码过程来说,同样由上知道监督矩阵:
H=
H矩阵与(n,k)码的任何一个许用码字进行相乘的结果必等于0,即若C=m·G是任一(n,k)码字,则必有C·HT=0。
若不属于许用码字,或有传输差错,且差错
位数在(n,k)码纠错能力内,则运算结果将为非0值,此时,可以纠错或检错重发。
S0=B·H
=[000000]·=000(4-10)
S1=B·H
=[000001]·=001(4-11)
S2=B·H
=[000010]·=010(4-12)
S3=B·H
=[000100]·=011(4-13)
S4=B·H
=[001000]·=100(4-14)
S5=B·H
=[010000]·=101(4-15)
S6=B·H
=[100000]·=110(4-16)
S7=B·H
=[100100]·=111(4-17)
当编码矩阵与生成矩阵的转置矩阵相乘时,若当其中的一位编码或两位出现差错时会有八种情况,则这些情况列出错码矩阵如下:
错码矩阵:
表4-1(6,3)线性分组码的译码表
校正子S
错误图样E
000
000000
001
000001
010
000010
011
000100
100
001000
101
010000
110
100000
111
100100
而这些情况正好是和校验子有某种对应关系的,根据这些对应关系可以进行相关编程。
若编程检测到了那一位错误可以根据
A=B+E(4-18)
其中A为纠错输出码序列,E为错码矩阵,R为信道输出码。
对接收到的信息进行改正求出正确的编码,从而再提去更正后的接收序列的前三位来提取信息位,以至获得信息矩阵I。
第5章仿真程序及结果分析
5.1仿真程序
%H监督矩阵
%G生成矩阵
%C编码矩阵
%I输入信息序列
%R信道输出码
%A纠错输出码序列
%E错码矩阵
%S校验子矩阵
%M校验子的行的十进制序列
%信道编码程序
clearall
closeall
H=[011100;
101010;
110001];%监督矩阵H
G=gen2par(H);%求H阵的生成矩阵G
I=[000;001;010;011;100;101;110;111];
C=rem(I*G,2);%求码字C
disp('所得的编码结果为:
C=');%显示输出码字C
disp(C);
%信道译码程序
clearall;
closeall;
H=[011100;
101010;
110001];%监督矩阵H
B=input('请输入接收码组B:
');
[a,b]=size(B);%返回数组B的维数
E=[000000;000001;000010;000100;
001000;010000;100000;100100];
S=rem(B*H',2);%求校验子S
i=1;
fori=1:
1:
a
M(i,1)=S(i,1).*4+S(i,2).*2+S(i,3);%求校验子所表示的十进制整数
end
fori=1:
1:
a
switch(M(i,1))
case0
A(i,:
)=B(i,:
)+E(1,:
);
case1
A(i,:
)=B(i,:
)+E(2,:
);
case2
A(i,:
)=B(i,:
)+E(3,:
);
case3
A(i,:
)=B(i,:
)+E(4,:
);
case4
A(i,:
)=B(i,:
)+E(5,:
);
case5
A(i,:
)=B(i,:
)+E(6,:
);
case6
A(i,:
)=B(i,:
)+E(7,:
);
case7
A(i,:
)=B(i,:
)+E(8,:
);
end
end
fori=1:
1:
a
switch(M(i,1))
case0
disp(‘没有出现错误!
’);
case1
disp(‘注意:
第1位出现一个错误!
请纠正!
’);
case2
disp(‘注意:
第2位出现一个错误!
请纠正!
’);
case3
disp(‘注意:
第3位出现一个错误!
请纠正!
’);
case4
disp(‘注意:
第4位出现一个错误!
请纠正!
’);
case5
disp(‘注意:
第5位出现一个错误!
请纠正!
’);
case6
disp(‘注意:
第6位出现一个错误!
请纠正!
’);
case7
disp(‘注意:
第6位和第3位出现两个错误!
请纠正!
’);
end
end
A=rem(A,2);%求出正确的编码
disp('检纠错后的码组A=');
disp(A);%显示正确的编码
j=1;
whilej<=3%提取信息位
I(:
j)=A(:
j);
j=j+1;
end
disp('译出的信息序列I=');
disp(I);%显示原信息码
5.2仿真结果图
1.输出编码结果及输入正确接收码的译码结果:
根据仿真程序得出仿真结果如下图所示:
图5-1输出编码结果和正确输入时显示图
2.输入一位错误时的结果显示图
图5-2有一位错误输入时的显示图
3.输入两位特定位错误时的结果显示
图5-3有两位特定位错误输入时的显示图
5.3结果分析
1.输出编码结果及输入正确接收码的译码结果分析
由图5-1输出编码结果和正确输入时显示图所示的结果可以看出编码的结果的八种情况和在推导过程中运算的结果是一致的,可以见得程序的编码过程是正确的。
对于译码过程而言,当界面显示“请输入接收码组B:
”,然后从提示符后输入:
[000000],由于输入的接收码组与编码后的码字一致,它提取了每个码组的前四位,即信息位,由结果看出译码过程是正确的,并没有出现错译的情况,可见程序的译码片段是正确的。
2.输入一位错误时的结果分析
对于纠错过程而言,当界面显示“请输入接收码组B:
”。
然后从提示符后输入:
[101000],由图5-2有一位错误输入时的显示图所知,接收码组的第五位发生了错误,经程序纠检错误后改正了接收序列的错误,并且正确译出了信息位。
可见程序的纠错功能也是可以实现的,以上结果进一步证实了,系统译码程序的正确性。
3.输入两位特定位错误时的结果分析
由图5-3有两位特定位错误输入时的显示图知,当输入B=[100100]时,校正子是111,错误图样是100100,所以结果显示与理论相符。
参考文献
[1]孙丽华编.信息论与纠错编码.电子工业出版社.2005,3
[2]郭文彬桑林编.通信原理-基于MATLAB的计算机仿真.北京邮电大学出版社.2006.2
[3]苏金明阮沈勇编.MATLAB实用教程(第二版).电子工业出版社.2008.2
[4]徐东艳孟晓刚编.MATLAB函数库查询词典.中国铁道出版社.2006.4
[5]潘新民编.计算机通信技术.电子工业出版社.2003.7
[6]吴玲达李国辉杨冰等编.计算机通信原理与技术.国防科技大学出版社.2003.3
[7]曹志刚钱压生编.现代通信原理.清华大学出版社.1992.2
[8]梅志红杨万铨编.MATLAB程序设计基础及其应用.清华大学出版社.2005
[9]樊昌兴.通信原理编.国防工业出版社.1999.10
[10]王华李有军编.MATLAB电子仿真与应用教程(第二版).国防工业出版社.2007.3
[11]孙屹主编.MATLAB通信仿真开发手册.国防工业出版社.2005.1
总结
通过对线性分组码中的线性分组码的编译码编程实现,了解到线性分组码的构成方式是把信息序列分成每k个码元一段,并由这k个码元按一定规则产生r个校验位,组成长度为n=k+r的码字,用(n,k)表示。
信息码元与校验位之间为线性关系。
并且知道了线性分组码的编码过程信息码元与校验位之间的线性关系实现起来是十分简单的.
对于码组长度为n、信息码元为k位、监督码元为r=n-k位的分组码,如果满足2r-1≥n,则有可能构造出纠正一位或一位以上错误的线性码。
就像本设计的(6,3)分组码的(n,k)中,n=6,k=3,r≥3能纠正一位误码,检测到两位误码。
运用MATLAB语言进行编程,可以较明显的知道编码的过程和译码时出现的错误,码字的最小距离是3时,可以纠正一位错误,当输入特定的两位错误时,该码字还可以纠正这两位错误,这种情况在编程结果的命令窗口中可以明显看到。
线性分组码具有编译码简单,封闭性好等特点,采用差错控制编码技术是提高数字通信可靠性的有效方法,是目前较为流行的差错控制编码技术之一。