海明码的校验Word文档格式.docx
《海明码的校验Word文档格式.docx》由会员分享,可在线阅读,更多相关《海明码的校验Word文档格式.docx(13页珍藏版)》请在冰豆网上搜索。
=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位出错,就会导致这种情况。
七参考资料
《计算机网络(第二版)》吴功宜清华大学出版社