文档库 最新最全的文档下载
当前位置:文档库 › 基于MATLAB——汉明码设计与实现

基于MATLAB——汉明码设计与实现

基于MATLAB——汉明码设计与实现
基于MATLAB——汉明码设计与实现

实验报告书------汉明码设计与实现

汉明码编译码器系统

班级: 姓名: 学号:

一.实验原理描述

1.1汉明码编码原理

一般来说,若汉明码长为n ,信息位数为k ,则监督位数r=n-k 。若希望用r 个监督位构造出r 个监督关系式来指示一位错码的n 种可能位置,则要求

21r n -≥或211r

k r -≥++(1)

下面以(7,4)汉明码为例说明原理:

设汉明码(n,k )中k=4,为了纠正一位错码,由式(1)可知,要求监督位数r ≥3。若取r=3,则n=k+r=7。我们用6543210

a a a a a a a 来表示这7个码元,

123

s s s 的值表示3个监督关系式中的校正子,则

123

s s s 的值与错误码元位置的

对应关系可以规定如表1所列。

表1 校正子和错码位置的关系

则由表1可得监督关系式:

(2)

(3)

(4)

在发送端编码时,信息位6543

a a a a 的值决定于输入信号,因此它们是随机的。

监督位

2

a 、1a 、0a 应根据信息位的取值按监督关系来确定,即监督位应使式(2)

~式(4)中1s 、2s 、3s

的值为0(表示编成的码组中应无错码)

(5)

式(5)经过移项运算,接触监督位

(6)

式(5)其等价形式为:

(7)

式(6)还可以简记为

(8)

其中

所以有

(9)

式(6)等价于

(10)

其中Q为P的转置,即

T

(11)

Q P

式(10)表示,信息位给定后,用信息位的行矩阵乘矩阵Q就产生出监督位。

我们将Q的左边加上一个k×k阶单位方阵,就构成一个矩阵G

(12)

G称为生成矩阵,因为由它可以产生整个码组,即有

(13)

或者(14)

式(13)即汉明码的编码原理

1.2汉明码纠错原理

当数字信号编码成汉明码形式(本文中即A)后在信道中传输,由于信道中噪声的干扰,可能由于干扰引入差错,使得接收端收到错码,因此在接收端进行汉明码纠错,以提高通信系统的抗干扰能力及可靠性。

一般来说接收码组与A不一定相同。若设接收码组为一n列的行矩阵B,即

(15)

则发送码组和接收码组之差为

(16)

E就是传输中产生的错码行矩阵

(17)

若e i=0,表示接收码元无错误,若e i=1,则表示该接收码元有错。式(16)可改写成

(18)

=+=,将它代人式(8),该是若E=0,即接收码组无错,则B A E A

仍成立,即有

(19)

当接收码组有错时,E≠0,将B带入式(8)后,该式不一定成立。在未超过检错能力时,式(19)不成立。假设此时式(19)

的右端为S,即

(20)

代入式(20),可得

由式(8)可知,所以

(21)

此处S 与前面的

123

s s s 有着一一对应关系,则S 能代表错码位置。

因此,纠错原理即,接收端收到码组后按式(20)计算出S,再根据表1判断错码情况,进行差错纠正。

二.实验仪器

1.通信原理综合实验系统一台

2.电脑-MATlab 一台

三.实验目的

1.熟悉掌握汉明码的原理与实现

2.观察了解汉明距离的作用

3.通过已经知道的汉明码监督方程为传输的编码进行纠错也验证

四.实验内容

1.汉明码编码规则

汉明码是1950年由美国贝尔实验室提出来的,是第一个设计用来纠正一位误码的线性分组码,汉明码及其变型已广泛应用于数字通信和数据存储系统中作为差错控制码。

汉明码的原始设计思想来自于前面讨论的奇偶监督码。 通过一个例子来说明如何具体构造这些监督关系式。

设分组码 (n,k)中k = 4。为了纠正一位错码,按汉明不等式可得r

≥3,若取r =3,则n = k +r =7。我们用

a 6 a 5 a 4 a 3 a 2 a 1 a 0 a 2= a 6 ⊕ a 5 ⊕ a 4 a 1= a 6 ⊕ a 5 ⊕ a 3

a0=a6 ⊕a4 ⊕a3

2.编码的检验与纠错

用S1,S2,S3表示三个监督关系式式中的校正子,监督方程为:

S1 =a6 ⊕a5 ⊕a4 ⊕a2

S2 =a6 ⊕a5 ⊕a3 ⊕a1

S3 =a6 ⊕a4 ⊕a3 ⊕a0则S1,S2,S3的值与错码位置的对应关系可以规定如下表:

五.实验要求

1.编写7位汉明码的程序,输出汉明码

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

输入信息元序列:1101

编码后序列为:

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

2.任意输入一个7位编码使用程序判断编码是否正确,如果错误,指出错位并纠正。

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

输入接受序列为[1 1 0 1 0 1 0]

译码后的仿真图如下:

1234567

00.51

1.5

hanmingdecode

value

v a l u e

如图上所示测接收到的码子无错误。如果输入接受序列为[1 1 0 0 0

1 0]则仿真图:

hanmingdecode

value

v a l u e

如上图所示,则四位有错误,原发送码子为[1 1 0 1 0 1 0] 如果输入的序列为[1 0 0 0 0 1 0],则仿真图为

hanmingdecode

value

相关文档