基于MATLAB的(7,4)汉明码的编译仿真分解
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
摘要
在通信系统中,要提高信息传输的有效性,我们将信源的输出经过信源编码用较少的符号来表达信源消息,这些符号的冗余度很小,效率很高,但对噪声干扰的抵抗能力很弱。
汉明码(Hamming Code)是一种能够自动检测并纠正一位错码的线性纠错码,即SEC(Single Error Correcting)码,用于信道编码与译码中,提高通信系统抗干扰的能力。
为了提高信息传输的准确性,我们引进了差错控制技术。
而该技术采用可靠的,有效的信道编码方法来实现的。
纠错码是一种差错控制技术,目前已广泛应用于各种通信系统和计算机系统中,纠错编码主要用于数字系统的差错控制,对于保证通信、存储、媒体播放和信息转移等数字传递过程的质量有着重要意义,是通信、信息类科知识结构中不可缺少的一部分。
关键字:通信系统、MATLAB 线性分组码、Hamming码
一、引言 (1)
二、设计原理 (2)
2.1 汉明码的构造原理 (2)
2.2 监督矩阵H (3)
2.3 生成矩阵G (4)
2.4 校正子(伴随式)S (5)
三、(7,4)汉明码编码的设计 (7)
3.1 (7,4)汉明码编码方法 (7)
3.2 编码流程图 (7)
3.3 (7,4)汉明码编码程序设计 (7)
四、(7,4)汉明码的译码器的设计 (8)
4.1 (7,4)汉明码译码方法 (8)
4.2 译码流程图 (10)
4.3(7,4)汉明码译码程序的设计 (10)
五、(7,4)汉明码编译码程序的编译及仿真波形 (11)
六、总结 (13)
七、参考文献 (14)
附录 (15)
一、引言
当计算机存储或移动数据时,可能会产生数据位错误,这时可以利用汉明码来检测并纠错,简单的说,汉明码是一个错误校验码码集,由Bell实验室的R.W.Hamming发明,因此定名为汉明码。
与其他的错误校验码类似,汉明码也利用了奇偶校验位的概念,通过在数据位后面增加一些比特,可以验证数据的有效性。
利用一个以上的校验位,汉明码不仅可以验证数据是否有效,还能在数据出错的情况下指明错误位置。
在接受端通过纠错译码自动纠正传输中的差错来实现码纠错功能,称为前向纠错FEC。
在数据链路中存在大量噪音时,FEC可以增加数据吞吐量。
通过在传输码列中加入冗余位(也称纠错位)可以实现前向纠错。
但这种方法比简单重传协议的成本要高。
汉明码利用奇偶块机制降低了前向纠错的成本。
二、设计原理
2.1 汉明码的构造原理
线性分组码是一类重要的纠错码,应用很广泛。
在(n ,k )分组码中,若监督码元是按线性关系模2相加而得到的,则称其为线性分组码。
一般来说,若汉明码长为n ,信息位数为k ,则监督位数r=n-k.若希望用r 个监督位构造出r 个监督关系式来指示一位错码的n 种可能位置,则要求
n r ≥-12 或 112++≥-r k r
现在以(7,4)分组码为例来说明线性分组码的特点。
设其码字为A=[6a ,
012345,,,,,a a a a a a ],前4位是信息元,后3位是监督元,可用下列线性方程组来描述该分组
码产生监督元:
显然,这3个方程是线性无关的。
代入上述公式可得(7,4)码的全部码组,如表1所示。
表1 (7,4)汉明码的全部码组
⎪ ⎩ ⎪
⎨ ⎧ ⊕ ⊕ = ⊕ ⊕ = ⊕ ⊕ = 3 4 6 0
3 5 6 1
4 5 6 2 a
a a a a a a a a a a a
由上表可知:(7,4)汉明码的最小码距0d =3,它能纠1位错或检2位错。
由此可见,汉明码是能够纠正单个错误的线性分组码,其特点是:最小码距0d =3,码长n 与监督位r 满足关系式:n r ≥-12,说明上述所说的(7,4)线性分组码就是汉明码。
同时,由于码率n r n r n n k -=-=1)(,故当n 很大和r 很小时,码率接近1,可见,汉明码是一种高效码。
2.2 监督矩阵H
式(3.1)所示的(7,4)汉明码的监督方程可以改写为:
02456=⊕⊕⊕a a a a
01356=⊕⊕⊕a a a a (式2.2.1)
00346=⊕⊕⊕a a a a
用矩阵的形式可以将上式表示为:
(摸2) (式2.2.2)
上式可以简记为:
T T A H 0=• 或 0=•A H T
式中
A =[a6 a5 a4 a3 a2 a1 a0] 0=[0 0 0]
右上标“T ”表示将矩阵转置。
例如,HT 是H 的转置,即HT 的第一行为H 的第一列,HT 的第二行为H 的第二列等等。
其中,H成为监督矩阵,只要监督矩阵H给定,编码时信息位和监督位的关系也就随即确定下来了。
2.3 生成矩阵G
上面汉明码例子中的监督位公式为
(式2.3.1)也可改写成矩阵形式:
(式2.3.2)或者写成
(式2.3.3)式中,Q为一个k*r阶矩阵,它为P的转置,即Q=PT
上式表示,在信息位给定后,用信息位的行矩阵车乘矩阵Q就产生出监督位。
若将(2.2.1式)的监督方程补充完整并写成矩阵的形式:
(式2.3.4)
即:A=G ·[
6a 3
45a a a ]=G ·M
即汉明码的编码原理 上式中
G=⎥⎥⎥⎥
⎦
⎤⎢⎢⎢
⎢⎣⎡011....0001101....0010110....0100111....1000 (式2.3.5)
G 为生成矩阵,根据式2.3.4知:由G 和信息码就能产生所有码字。
生成矩阵也可分为两部分,即
G=[]Q I k , (式2.3.6)
上式中
Q=T P =⎥⎥⎥⎥
⎦
⎤⎢⎢⎢
⎢⎣⎡011101110111 (式2.3.7) Q 为r k ⨯阶矩阵,
k
I 为k 阶单位阵。
因此,如果找到了码的生成矩阵G ,则编码的方法就完全确定了。
具有[KQ]形式的生成矩阵称为典型生成矩阵。
由典型生成矩阵得出的码组A 中,信息位的位置不变,监督位附加于其后,这种形式的码称为系统码。
2.4 校正子(伴随式)S
设一发送码组A=[0
121,,...,a a a a n n --],在传输的过程中可能发生误码。
接受码组
B=[
121,,...,,b b b b n n --],收发码组之差定义为错误图样E 。
E=B-A (式2.4.1)
其中,E=[
121,,...,,e e e e n n --],令S=T
H B •。
T T T H E H E A H B S •=+=•=)( (式2.4.2)
式中S 称为校正子,他用来表示错码位置。
可见:校正子S 与错误图样E 之间由确定的线性变换关系。
若S和E之间一一对应,则S将能代表错码位置。
(7,4)汉明码的校正子和错误图样之间的对应关系如表2所示。
表2 (7,4)汉明码S 与E 对应关系
由上表可知:
当S=001时,则出错在1 位,即b0 出错;
当S=010时,则出错在2 位,即b1 出错;
当S=100时,则出错在3 位,即b2 出错;
当S=011时,则出错在4 位,即b3 出错;
当S=101时,则出错在5 位,即b4 出错;
当S=110时,则出错在6 位,即b5 出错;
当S=111时,则出错在7 位,即b6 出错;
当S=000时,则无错。
三、(7,4)汉明码编码的设计
3.1 (7,4)汉明码编码方法
(7,4)汉明码的编码就是将输入的4 位信息码M=[ 3
456a a a a ]加上3 位监督码
12b b b 从而
编成7位汉明码[
6a 0
12345,,,,,a a a a a a ],编码输出B=[
6a 5a 4a 3a 2a 1a 0
a ].
由式A = M ·G=[3
456a a a a ]·G 可知,信息码M 与生成矩阵G 的乘积就是编好以后的(7,4)
汉明码。
3.2 编码流程图
编码程序的设计流程图
3.3 (7,4)汉明码编码程序设计
根据(7,4)汉明码的编码原理,将上式计算所得的监督位和输入的信息位一起输出,则此次编码就算完成了。
(7,4)汉明码的编码源程序见下文附录。
四、(7,4)汉明码的译码器的设计
4.1 (7,4)汉明码译码方法
(7,4)汉明码的译码器的功能就是把输入的7 位汉明码B=[23456b b b b b 0
1b b ] 译为4位信
息码
3a 2a 1a 0
a ,并且根据伴随矩阵S 从而纠正编码中可能出现的1 位错码。
根据监督矩阵H 和生成矩阵G 的关系,即:
H = [P r I ] ,其中r I 是33⨯的单位阵, G = [k I Q ] ,其中
k
I 是44⨯的单位阵,
T Q P = (式4.1.1) 生成矩阵
G=⎥⎥
⎥⎥
⎦
⎤
⎢⎢⎢⎢⎣⎡011....0001101....0010110....0100111....1000=[]Q I k , 由式(4.1.1),得P=⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡101111011110 监督矩阵
(式4.1.2)
由式(2.2.2)知T
T T H E H E A H B S •=+=•=)(,其中E=[0121,,...,,e e e e n n --]
从而即可得到校正子S 与(7,4)汉明码各位之间的关系:
24562a a a a S +++=
13561a a a a S +++= (式4.1.3)
03460a a a a S +++=
算出校正子S (012S S S )后,对照表2,即可判断出哪位出错,并纠正出错的那位,从而输出正确的码字。
[]r PI H =⎥⎥
⎥⎦
⎤
⎢⎢⎢⎣⎡=001101101011011001110
表3 (7,4)汉明码译码输入、输出对应关系
4.2 译码流程图
译码程序设计的流程图:
4.3(7,4)汉明码译码程序的设计
根据前面分析的译码原理,在程序中,C 表示错误在哪一位。
若第1 位(a0)出错,则C 输出0;若第2 位出错,则C 输出1;……;若无错,则C 输出0。
这样译码程序就可以编出来了。
译码源程序见附录
五、(7,4)汉明码编译码程序的编译及仿真波形
输入信息元序列[1 0 0 0] 输出序列为:[ 1 0 0 0 1 1 1]
hanmingencode
value
v a l u e
hanmingdecode
value
v a l u e
[ 0 0 0 0 1 1 1] 错误在第一位(蓝线表示正确的译码【0 0 0 1 0 1 1】, 红线表示错误的接收序列【1 0 0 1 0 1 1】)
输入信息元序列[1 0 0 1] 输出序列为:[ 1 0 0 1 1 0 0]
hanmingencode
value
v a l u e
hanmingdecode
value
v a l u e
[ 1 1 0 1 1 0 0] 错误在第二位
输入信息元序列[1 0 1 0] 输出序列为:[ 1 0 10 0 1 0]
hanmingencode
value
v a l u e
hanmingdecode
value
v a l u e
【 10 0 0 01 0】 错误在第三位
输入信息元序列[1 0 1 1] 输出序列为:
[ 1 0 1 1 0 0 1]
hanmingencode
value
v a l u e
hanmingdecode
value
v a l u e
【 1 0 10 001】错误在第四位
六、总结
对于本次课程设计的结束,我真切感觉到自己知识能力的匮乏,很多东西都只是知道一些浅显的知识,真正搞懂会应用的东西很少。
或许一个人的进步需要一个缓慢的过程。
在过程中需要不断地借鉴,学习,汲取别人的东西。
同别人的成果中攫取知识和营养,然后它变成自己的东西。
通过这次课程设计。
我学到了很多东西,首先,通过这次课程设计,我熟练地掌握了汉明码的纠错码的原理,了解的(7,4)汉明码的相关知识。
其次,我觉得学习理论和实践是两个层次,理论指导实践,而实践验证理论,理论往往是在理想的条件下得出的,而实践是在现实生活中进行的,所以,实践得出的结论往往与理论的结论有一定的差别,这是很正常的。
另外团结协作,互助共赢是时代的主流。
在这次课设的制作中,交流合作的精神在我们体现的可谓是淋漓尽致。
相互探讨,学习交流,优势互补,这样才最终处成了这课设。
争论与交流是解决问题很好的方法,问题也总是在思想与意见
的碰撞中得到解决而这也是我们对理论理解的更为深刻。
通过图书馆,搜索引擎查阅资料的能力也得到了相应的提升。
总之,在这次课程设计的制作的过程中学到了很多东西,能力也有相应的提升。
在此还要感谢指导老师的辛勤教导,感谢老师在此次课程设计中给以孜孜不倦的解惑。
七、参考文献
【1】李建新现代通信系统分析与仿真—MATLAB通信工具箱.西安:西安电子科技大学出版社,2000
【2】樊昌信通信原理.北京:国防工业出版社,2002
【3】刘敏 MATLAB通信仿真与应用国防工业出版社
【4】曹志刚等著现代通信原理北京:清华大学出版社,2001 5
【5】吴伟陵等著移动通信原理北京:电子工业出版社,2005
【6】韩利竹,王华 MATLAB电子仿真与应用北京:国防工业出版社,2003年. 【7】赵静基于MATLAB的通信系统仿真北京:北京航空航天大学出版社,2008年.
【8】葛哲学精通MATLAB 北京:电子工业出版社,2008年.
附录
一、(7,4)汉明码编码源程序
function f=hammingencod(a)
G=[1 0 0 0 1 1 1;0 1 0 0 1 1 0;0 0 1 0 1 0 1;0 0 0 1 0 1 1]; a=input('输入信息元序列:');
c=mod(a*G,2);
disp('编码后序列为:');
disp(c);
x=.01:.01:4;
[m,n]=size([a]'*ones(1,100));
y=reshape(([a]'*ones(1,100))',1,m*n);
plot(x,y)
axis([0 4 0 1.5]);
set(gca,'XTick',0:1:4);
set(gca,'YTick',0:0.5:1.5);
title('hanmingencode')
xlabel('value')
ylabel('value')
end
二、(7,4)汉明码译码源程序
function g=hammingdecod(B)
H=[1 1 1 0 1 0 0 ;1 1 0 1 0 1 0;1 0 1 1 0 0 1];
B=input('输入接收序列B=');
S=mod(B*H',2); %计算B的伴随式
if S==0
disp('接收到的码字无错误。
');
E=dec2bin(0,7);
end
for i=1:1:7
if S==H(:,i)'
E=dec2bin(2^(7-i),7); %计算R的错误图样
fprintf('错误出现在第%1.0f位\n',i);
break;
end
end
a=mod(B-E,2); %计算原发送码序列
disp('原发送码字为:');
disp(a)
x=.01:.01:7;
[m,n]=size([a]'*ones(1,100));
y=reshape(([a]'*ones(1,100))',1,m*n);
[m,n]=size([B]'*ones(1,100));
z=reshape(([B]'*ones(1,100))',1,m*n); plot(x,y)
hold on;
plot(x,z,'--r')
axis([0 7 0 1.5]);
set(gca,'XTick',0:1:7);
set(gca,'YTick',0:0.5:2.5);
set(gca,'ZTick',0:0.5:2.5);
title('hanmingdecode')
xlabel('value')
ylabel('value')
zlabel('value')
end。