海明码的校验Word文档格式.docx

上传人:b****3 文档编号:17921830 上传时间:2022-12-12 格式:DOCX 页数:13 大小:104.10KB
下载 相关 举报
海明码的校验Word文档格式.docx_第1页
第1页 / 共13页
海明码的校验Word文档格式.docx_第2页
第2页 / 共13页
海明码的校验Word文档格式.docx_第3页
第3页 / 共13页
海明码的校验Word文档格式.docx_第4页
第4页 / 共13页
海明码的校验Word文档格式.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

海明码的校验Word文档格式.docx

《海明码的校验Word文档格式.docx》由会员分享,可在线阅读,更多相关《海明码的校验Word文档格式.docx(13页珍藏版)》请在冰豆网上搜索。

海明码的校验Word文档格式.docx

=k+r+1。

海明码的编码效率为:

R=k/(k+r);

式中k为信息位位数,

r为增加冗余位位数,

2.2海明码的原理

在数据中间加入几个校验码,将玛距均匀拉大,将数据的每个二进制位分配在几个奇偶校验组里,当某一位出错,会引起几个校验位的值发生变化。

海明不等式:

校验码个数为K,2的K次幂个信息,1个信息用来指出“没有错误”,其余2K-1个指出错误发生在那一位,但也可能是校验位错误,故有N<

=2的K次-1-K能被校验。

2.3海明码的编码规则

若为011是第六位错1.每个校验位Ri被分配在海明码的第2的i次的位置上,

2.海明玛的每一位(Hi)是由多个/1个校验值进行校验的,被校验玛的

位置玛是所有校验这位的校验位位置玛之和。

一个例题:

4个数据位d0,d1,d2,d3,3个校验位r0,r1,r2,对应的位置为:

d3d2d1r2d0r1r0======b7b6b5b4b3b2b1

校验位的取值,就是他所能校验的数据位的异或

b1为b3,b5,b7的异或,b2为b3,b6,b7b4为b5,b6,b7[/font]

海明玛传送到接受方后,将上三式的右边(b1,b2,b4)的逻辑表达式分别

异或上左边的值就得到了校验方程,如果上题采用偶校验

G1=b1b3b5b7的异或

G2=b2b3b6b7的异或

G3=b4b5b6b7的异或

若G1G2G3为001是第四位错

2.4海明码的生成与接收

特注:

以下的+均代表异或

方法一:

1)海明码的生成。

例1.已知:

信息码为:

"

0010"

海明码的监督关系式为:

S2=a2+a4+a5+a6

S1=a1+a3+a5+a6

S0=a0+a3+a4+a6

求:

海明码码字。

解:

1)由监督关系式知冗余码为a2a1a0。

2)冗余码与信息码合成的海明码是:

0010a2a1a0"

设S2=S1=S0=0,由监督关系式得:

异或运算:

a2=a4+a5+a6=1

a1=a3+a5+a6=0

a0=a3+a4+a6=1

因此,海明码码字为:

0010101"

2)海明码的接收。

例2.已知:

接收码字为:

0011101"

(n=7)

发送端的信息码。

1)由海明码的监督关系式计算得S2S1S0=011。

2)由监督关系式可构造出下面错码位置关系表:

S2S1S0

000

001

010

100

011

101

110

111

错码位置

无错

a0

a1

a2

a3

a4

a5

a6

3)由S2S1S0=011查表得知错码位置是a3。

4)纠错--对码字的a3位取反得正确码字:

0010101"

5)把冗余码a2a1a0删除得发送端的信息码:

方法二:

(不用查表,方便编程)

1)海明码的生成(顺序生成法)。

例3.已知:

11001100"

(k=8)

1)把冗余码A、B、C、…,顺序插入信息码中,得海明码

码字:

AB1C100D1100"

码位:

123456789101112

其中A,B,C,D分别插于2的k次方位(k=0,1,2,3)。

码位分别为1,2,4,8。

2)冗余码A,B,C,D的线性码位是:

(相当于监督关系式)

A->

1,3,5,7,9,11;

B->

2,3,6,7,10,11;

C->

4,5,6,7,12;

(注5=4+1;

6=4+2;

7=4+2+1;

12=8+4)

D->

8,9,10,11,12。

3)把线性码位的值的偶校验作为冗余码的值(设冗余码初值为0):

A=∑(0,1,1,0,1,0)=1

B=∑(0,1,0,0,1,0)=0

C=∑(0,1,0,0,0)=1

D=∑(0,1,1,0,0)=0

4)海明码为:

101110001100"

例4.已知:

接收的码字为:

100110001100"

(k=8)

1)设错误累加器(err)初值=0

2)求出冗余码的偶校验和,并按码位累加到err中:

A=∑(1,0,1,0,1,0)=1err=err+20=1

B=∑(0,0,0,0,1,0)=1err=err+21=3

C=∑(1,1,0,0,0)=0err=err+0=3

D=∑(0,1,1,0,0)=0err=err+0=3

由err≠0可知接收码字有错,

3)码字的错误位置就是错误累加器(err)的值3。

4)纠错--对码字的第3位值取反得正确码字:

5)把位于2的k次方位的冗余码删除得信息码:

11001100"

三流程图

四运行代码

编码(encode)和纠错(check)的相关程序。

#include<

iostream>

fstream>

stdio.h>

#defineN1270

#defineK1200

#defineG70

//#defineHAIMING

usingnamespacestd;

intlen[N];

inti_2_r(inta)//求一个2^n次方的数的幂

{

intcount=0;

if(a==1)

return0;

while(a>

1)

a=a/2;

count++;

}

returncount;

voidin_to_Group(inta[],intb,intn)//添加到各组中

inti;

for(i=1;

i<

=n;

i++)

if(a[i]==-1)

a[i]=b;

int_2_r_gt_k_r(intk,intr)//判断2^r>

=k+r+1

inti,s=1;

for(i=1;

i<

=r;

s=2*s;

if(s>

=k+r+1)

return1;

else

intis_i_2_r(inti)//判断i是否为2^n位

if(i==1)

if(i%2!

=0)

while(i%2==0&

&

i!

=1)

i=i/2;

if(i==1)

intint_to_invdec(inta[],intn)//求一个整数的逆序的二进制码

inti=1;

//以计算校验位号

while(n)

a[i++]=n%2;

n/=2;

returni-1;

//返回位数

intcount1(inta[],intn)//计算1的个数

inti,count=0;

=n;

if(a[i]==1)

if(count%2==0)

voidmain()

#ifdefHAIMING

freopen("

海明码.txt"

"

r"

stdin);

#endif

intinfor[N],i,k,r,findr=1;

intgroup[G][K],g,j;

//group用于分组检测1的个数

inta[N],a_l;

printf("

\n输入有效信息位位数k(0=<

k<

=1200):

);

scanf("

%d"

&

k);

i=2;

while(findr)//找所需检测位数r的值

r=i;

if(_2_r_gt_k_r(k,r))

findr=0;

i++;

\n需添加%d位检测位.\n"

r);

\n输入信息码:

\n"

=k+r;

infor[i]=-1;

if(!

is_i_2_r(i))

infor[i]);

=r;

for(j=1;

j<

=k;

j++)

group[i][j]=-1;

//***初始化各组为-1表示空信息

len[i]=0;

//***初始化各组元素个数为0

海明码(偶校验)为:

=k+r;

i++)//!

!

*从添加检测位后的第1位开始进行分组(关键)

a_l=int_to_invdec(a,i);

//**将位号转化为逆序的二进制数存入数组a[]中,返回数组长度

for(g=1;

g<

g++)//共分为r组

=a_l;

if(a[j]==1)//**查转化后a[]中为1的下标位(如为1则分给第1组,为2则分给第二组等等)

if(g==j)//若分组号与下标位相同,

in_to_Group(group[g],infor[i],len[g]);

//**将该信息码添加到第g小组中

len[g]++;

//*第g小组长度增1

break;

i++)//******检测各小组中1的个数

{if(is_i_2_r(i)&

count1(group[i_2_r(i)+1],len[i_2_r(i)+1]))//如果位号为2^n位即检测位

infor[i]=0;

//***且该小组中1的个数为偶数,则该检测位上添为0用以校验

if(is_i_2_r(i)&

infor[i]=1;

//***且该小组中1的个数为奇数,则该检测位上添为1用以校验

cout<

<

infor[i]<

"

;

//输出编写好的海明码

}

五运行界面及截图

六总结

海明码的纠错位数是1位,最多检测错位为2位,所需要记录海明码的位数,现在我参照程序来解释一下海明码是怎么纠的1位错,最多能检测2位错。

设数据位数,依此存储在数组中,计算所需要的海明码的位数,并声明存储海明码的数组。

计算海明码的实际代码,可以看出海明码的计算是根据相应数据位的二进制数来计算的,例如对于7而言,它的二进制代码为000111,所以它对海明码的贡献就是影响了海明码第1,2,3位的值,那么假设在只有一个数据位p错的话,它所导致的校验不一致的海明码的位,就是它二进制代码所影响的海明码的位,反过来,只要我们找出所有校验不一致的海明码的位数,那么也就知道了相应数据位的二进制的值,也就知道是第几位出错,从而可以把相应的位取反,达到纠错的效果。

那么为什么海明码最多能检测2位错呢,现在我们来看看海明码是如何检验出两位的错误的,假设第p1,p2(p1<

>

p2)位数据错误,可以知道,他们相应的二进制位所影响位必不完全相同,因为p1,p2是不同的数,所以必然导致海明码某个校验位不一致,也就检测出错误,但是我们并不能从所得到的不一致的位来推测出p1,p2的值,例如:

第3位与第7位都错,那么最后导致不一致的校验位是第3位,根据程序显然得出的是第4位出错(实质上是x+y=z,由z求x,y的不定方程问题,解是不唯一的)。

那么为什么海明码无法检测3位或3位以上的错误呢,这是因为3位或3位以上的错误有可能互相影响使得最后的校验值全部一致,例如:

取第3,4,7位出错,就会导致这种情况。

七参考资料

《计算机网络(第二版)》吴功宜清华大学出版社

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育 > 数学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1