天天看點

3分鐘學會海明碼

海明碼

基本概念

海明碼:能糾正所有單個比特的高效線性分組碼。

最大似然譯碼:接收到的碼字,最像某一允許碼,就判決為這個碼。

碼元:碼字中的二進制位。

碼字:碼元的組合。

碼長:碼字中碼元的個數。

碼組:所有許用碼字構成的碼字空間。

碼距:兩碼字間對應位上的碼元取值不同的位數。

海明距離(d):碼組中的最小碼字。決定了碼組的糾錯能力。

對于3位編碼的碼距,可用三維空間表示,每個碼字對應立方體的各個頂點,碼距可用對應兩頂點間沿立方體各棱行走的最短幾何距離表示。如果僅用“000”和“111”為許用碼,則碼距為3。

海明距離與糾錯能力的關系:

1、當碼組用于檢錯時:設檢錯個數為e,則:d>=e+1。

說明:碼字a和b出現e個錯誤時,仍沒有變成對方,和對方至少有一個碼元位不同。

2、當碼組用于糾正t重錯時:則:d>=2t+1。

說明:碼字a和b同時出現t個錯誤時,仍能看出出錯後的碼字最像誰(最大似然譯碼)。

3、當碼組用于糾正t重錯,同時檢測e個錯誤時,要求(e>t),則:d>=e+t+1。

碼字a和b出現e個錯誤時,仍沒有變成對方,且碼字a和b同時出現t個錯誤時,仍能看出出錯後的碼字最像誰。

海明碼糾正單比特差錯。

原理:在d位資訊位後增加r位備援位,構成一個n=d+r位的碼字,且滿足關系:2r>=d+r+1,即用r個監督關系式産生的r個校正因子來區分無錯和在碼字中的n個不同位置的一位錯。将r位備援位安插在碼字的2的幂次方的位置,将碼字中資訊位的位置用二進制表示,備援位的值是碼字中位置相應位為“1”的資訊位的異或。接收方按上述方法進行校驗,并降序排列備援位,值不為“0”則表示對應位置的碼元出錯。

海明碼的編碼效率為:r=d/d+r)

式中 d為資訊位位數,為增加備援位位數。

海明碼的生成與接收

方法一:(按教科書)

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位取反得正确碼字:"0 0 1 0 1 0 1"

5)把備援碼a2a1a0删除得發送端的資訊碼:"0010"

***方法二:(不用查表,友善程式設計)

1)海明碼的生成(順序生成法)。

例3.已知:資訊碼為:" 1 1 0 0 1 1 0 0 "(d=8)

解:1)把備援碼a、b、c、…,順序插入資訊碼中,得海明碼

碼字:" a b 1 c 1 0 0 d 1 1  0  0 "

碼位: 1 2 3 4 5 6 7 8 9 10 11 12  

其中a,b,c,d分别插于2k位(k=0,1,2,3)。碼位分别為1,2,4,8。

3分鐘學會海明碼
3分鐘學會海明碼
3分鐘學會海明碼

111.jpg (15.23 kb)

2007-10-26 10:54

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)海明碼為:"1 0 1 1 1 0 0 0 1 1 0 0"

例4.已知:接收的碼字為:"1 0 0 1 1 0 0 0 1 1 0 0"(k=8)

解:1)設錯誤累加器(err)初值=0

2)求出備援碼的偶校驗和,并按碼位累加到err中:

a=∑(1,0,1,0,1,0)=1

b=∑(0,0,0,0,1,0)=1

c=∑(1,1,0,0,0)=0

由err≠0可知接收碼字有錯,

3)碼字的錯誤位置就是錯誤累加器(err)的值dcba=0011:3。

4)糾錯--對碼字的第3位值取反得正确碼字:

"1 0 1 1 1 0 0 0 1 1 0 0"

5)把位于2k位的備援碼删除得資訊碼:"1 1 0 0 1 1 0 0"

繼續閱讀