什么是海明碼呀?通俗一點(diǎn),但又能深刻一點(diǎn)!謝謝了?。?!
海明碼其實(shí)也不難,相對(duì)于寄偶檢驗(yàn)碼 它不僅可以檢驗(yàn)出錯(cuò)誤,還能修正錯(cuò)誤!但只能是檢驗(yàn)、修正一位錯(cuò)誤!說一大堆理論是沒什么意思,下面將通過一個(gè)例子,盡可能的用最通俗易懂的方式進(jìn)行講解!最后大家會(huì)發(fā)現(xiàn)海明碼很神奇?。?/p>
假設(shè)要傳送的數(shù)據(jù)為:1011 0011
校驗(yàn)流程如下:
一:確定校驗(yàn)位并插入到有效數(shù)據(jù)位中。
相比奇偶校驗(yàn)只插入一個(gè)檢驗(yàn)碼,海明碼需要插入多個(gè)檢驗(yàn)碼,插入的位數(shù)與有效數(shù)據(jù)位數(shù)相關(guān),公式如下
公式:2^r-r>k+1,其中r就是要插入檢驗(yàn)碼的個(gè)數(shù),取滿足條件的最小整數(shù),k是有效數(shù)據(jù)位數(shù)。因?yàn)槲覀円獋魉偷臄?shù)據(jù)是:1011 0011,顯然k=8,推出r=4。也就說我們要將4個(gè)校驗(yàn)位插入到有效數(shù)據(jù)中,怎么插入呢?按照如下規(guī)則:
插入位置固定為2^N(N:0,1,2,3,4,5……)處,因?yàn)閞=4,即只需要取4個(gè)有{2^0,2^1,2^2,2^3},對(duì)應(yīng)位置即是1,2,4,8,當(dāng)然了,如果r=5,那么插入位置為:1,2,4,8,16.同類可以推出其他情況,不再啰嗦。(之所以選擇這樣的位置插入,是為了有效的分組,保證后面的校驗(yàn)分組能有效的錯(cuò)開,不會(huì)互相干擾,這句話不需要理解,到后面就能體會(huì)?。?/p>
通過分析得到待傳送的數(shù)據(jù)為:xx1x 011x 0011,4位校驗(yàn)位+8為有效數(shù)據(jù)位。
二、確定校驗(yàn)位的數(shù)值。
顯然X只能取0,1,下面確定x的值:
由一可知待傳送數(shù)據(jù)為:xx1x 011x 0011。
規(guī)則:以X的位置為長(zhǎng)度,依次從待傳送數(shù)據(jù)中取X個(gè)數(shù),然后跳過X個(gè)數(shù),再取X個(gè)數(shù),直到待傳送數(shù)據(jù)串尾,得到一個(gè)子串,然后統(tǒng)計(jì)子串中1的個(gè)數(shù),如果為奇數(shù),則x=0,為偶數(shù),x=1(當(dāng)然,反過來也行,其實(shí)這就是奇偶校驗(yàn)的規(guī)則,想了解奇偶校驗(yàn)可以參見我以前的回答的,這里不了解也行)
第1個(gè)X:位置為1,從第1個(gè)位置開始依次取1個(gè)數(shù)據(jù),并跳過1個(gè)數(shù)據(jù)再取,直到串尾得到一個(gè)子串:
{x 1 0 1 0 1},這個(gè)串可記為第1個(gè)校驗(yàn)組, 因?yàn)?的個(gè)數(shù)是3個(gè)為奇數(shù),故x=0.
第2個(gè)X:位置為2,故從第2個(gè)位置開始依次取2個(gè)數(shù)據(jù),并跳過2個(gè)數(shù)據(jù)再取,直到串尾得到一個(gè)子串:
{x1 11 01} ,記為第2個(gè)校驗(yàn)組,因?yàn)?的個(gè)數(shù)為4是偶數(shù),故x=1.
第3個(gè)X:位置是4,故從第4個(gè)位置開始依次取4個(gè)數(shù)據(jù),并跳過4個(gè)數(shù)據(jù)再取,直到串尾得到一個(gè)子串:
{x011 1},記為第3個(gè)校驗(yàn)組,因?yàn)?的個(gè)數(shù)為3是奇數(shù),故x=0.
第4個(gè)X:位置是8,故從第8個(gè)位置開始依次取8個(gè)數(shù)據(jù),并跳過8個(gè)數(shù)據(jù)再取,直到串尾得到一個(gè)子串:
{x0011 },記為第4個(gè)校驗(yàn)組,……,X=1。
故得到最終的待傳送的數(shù)據(jù)串為:011001110011。
這里其實(shí)就可以看到了,為什么X的位置要取2^N,這樣才能保證各個(gè)校驗(yàn)位不會(huì)相互干擾。
經(jīng)過以上一、二步驟就完整了海明碼的構(gòu)造過程,下面講解校驗(yàn)過程:
三、根據(jù)步驟二中的構(gòu)造規(guī)則,取出各校驗(yàn)組
發(fā)送的數(shù)據(jù)串為:011001110011。
假設(shè)接受到的數(shù)據(jù)串為:011001111011(注意和傳送數(shù)據(jù)串相比,第9為出現(xiàn)了錯(cuò)誤?。?/p>
規(guī)則:以X的位置為長(zhǎng)度,依次從待傳送數(shù)據(jù)中取X個(gè)數(shù),然后跳過X個(gè)數(shù),再取X個(gè)數(shù),直到待傳送數(shù)據(jù)串尾,得到一個(gè)子串,然后統(tǒng)計(jì)子串中1的個(gè)數(shù),如果為奇數(shù),則x=0,為偶數(shù),x=1(規(guī)則必須和步驟二中一樣)
根據(jù)二中制定的規(guī)則再次取出各個(gè)校驗(yàn)組。
第1個(gè)校驗(yàn)組:從第1個(gè)位置開始依次取1個(gè)數(shù)據(jù),并跳過1個(gè)數(shù)據(jù)再取,直到串尾得到一個(gè)子串:{0 1 0 1 1 1}。
第2個(gè)校驗(yàn)組:從第2個(gè)位置開始依次取2個(gè)數(shù)據(jù),并跳過2個(gè)數(shù)據(jù)再取,直到串尾得到一個(gè)子串:{11 11 01}
第3個(gè)校驗(yàn)組:從第4個(gè)位置開始依次取4個(gè)數(shù)據(jù),并跳過4個(gè)數(shù)據(jù)再取,直到串尾得到一個(gè)子串:{0011 1}
第4個(gè)校驗(yàn)組:從第8個(gè)位置開始依次取8個(gè)數(shù)據(jù),并跳過8個(gè)數(shù)據(jù)再取,直到串尾得到一個(gè)子串:{11011}.
四、根據(jù)步驟二的構(gòu)造規(guī)則,確定存在錯(cuò)誤的校驗(yàn)組,并通過錯(cuò)誤校驗(yàn)組的交集,最終確定出錯(cuò)的位置。
由步驟三得到4個(gè)校驗(yàn)組:
1:{0 1 0 1 1 1}。 對(duì)應(yīng)位置為{1 3 5 7 9 11}
2:{11 11 01}。對(duì)應(yīng)位置為{2 3 6 7 10 11}
3:{0011 1} 。對(duì)應(yīng)位置為{4567 12}
4:{11011}。 對(duì)應(yīng)位置為{8 9 10 11 12}
因?yàn)槲覀兊臉?gòu)造規(guī)則是:統(tǒng)計(jì)子串中1的個(gè)數(shù),如果為奇數(shù),則x=0,為偶數(shù),x=1。
所以正確的校驗(yàn)組中1的個(gè)數(shù)絕對(duì)是奇數(shù)!(好好琢磨,很容易就想通了,如果我們的規(guī)則是為奇數(shù),則x=1,為偶數(shù),x=0。那么正確的校驗(yàn)組中1的個(gè)數(shù)絕對(duì)是偶數(shù)),所以如果校驗(yàn)組1的個(gè)數(shù)不是奇數(shù),那么這個(gè)校驗(yàn)組就存在問題。因而可以判斷第1個(gè)和第4個(gè)校驗(yàn)組出現(xiàn)問題了。
確定了第1個(gè)和第4個(gè)校驗(yàn)組出現(xiàn)問題后,找到這兩個(gè)校驗(yàn)組的交集即第9個(gè)位置和第11個(gè)位置是它們交集,即共同校驗(yàn)的位置。于是判斷出現(xiàn)問題的位置要么就是第9個(gè)位置,要么就是第11個(gè)位置!因?yàn)樵诘?個(gè)校驗(yàn)組中有第11個(gè)位置,故第11個(gè)位置絕對(duì)沒有出錯(cuò),因?yàn)榫涂梢耘袛嗍堑?個(gè)位置出現(xiàn)錯(cuò)誤!
到這里,應(yīng)該懂了吧?但是不是覺得找出錯(cuò)位置有點(diǎn)麻煩???下面就給出一個(gè)具體的實(shí)現(xiàn)方法,理解了上面的描述,再了解下面實(shí)現(xiàn)的方法,立馬就能確定出錯(cuò)誤的位置:
首先:我們對(duì)各個(gè)校驗(yàn)組求異或。
第一個(gè)校驗(yàn)組:{0 1 0 1 1 1} 異或的結(jié)果為:0
第二個(gè)校驗(yàn)組:{11 11 01}異或的結(jié)果為:1
第三個(gè)校驗(yàn)組:{0011 1}異或的結(jié)果為:1
第四個(gè)校驗(yàn)組:{11011}異或的結(jié)果為:0
接著:倒置拼接異或結(jié)果,得到:0110,
最后:按位取反的到:1001,。
大家有沒有驚奇的發(fā)現(xiàn)1001的十進(jìn)制數(shù)就是9,這不就是出錯(cuò)的位置嗎?這是巧合嗎?
不急再看一個(gè)例子:
傳送的數(shù)據(jù)串為: 011001110011(還是我們開始的那個(gè)串)
接受到的數(shù)據(jù)串為:011011110011(和正確數(shù)據(jù)串相比,第5個(gè)位置出錯(cuò)了)
第一個(gè)校驗(yàn)組:{0 1 1 1 0 1} 異或的結(jié)果為:0
第二個(gè)校驗(yàn)組:{11 11 01}異或的結(jié)果為:1
第三個(gè)校驗(yàn)組:{0111 1}異或的結(jié)果為:0
第四個(gè)校驗(yàn)組:{10011}異或的結(jié)果為:1
倒置拼接:1010 反轉(zhuǎn)為:0101 對(duì)應(yīng)十進(jìn)制數(shù)為5!
也就是說方法是真確的??!不用懷疑?。∵@也就是海明碼的奇妙之處!
再來看看一個(gè)例子:
傳送的數(shù)據(jù)串為: 011001110011(還是我們開始的那個(gè)串)
接受到的數(shù)據(jù)串為:011001100011(和正確數(shù)據(jù)串相比,第8個(gè)位置校驗(yàn)位出錯(cuò)了)
顯然這是校驗(yàn)位出錯(cuò)了,那么能不能校驗(yàn)出來呢?
第一個(gè)校驗(yàn)組:{0 1 0 1 0 1} 異或的結(jié)果為:1
第二個(gè)校驗(yàn)組:{11 11 01}異或的結(jié)果為:1
第三個(gè)校驗(yàn)組:{0011 1}異或的結(jié)果為:1
第四個(gè)校驗(yàn)組:{00011}異或的結(jié)果為:0
倒置反轉(zhuǎn)結(jié)果為1000 正好是8,所以也沒問題。
下面我們來說下規(guī)則:(其實(shí)就是說異或與奇偶的關(guān)系,想拓展的就可以看看)
上面的例子中,我們規(guī)定: 統(tǒng)計(jì)子串中1的個(gè)數(shù),如果為奇數(shù),則x=0,為偶數(shù),x=1。如果是按這樣的規(guī)定,那么校驗(yàn)組中1的個(gè)數(shù)必定是奇數(shù),正是因?yàn)槿绱耍孕r?yàn)組中如果1的個(gè)數(shù)不是奇數(shù)那么肯定出現(xiàn)了錯(cuò)誤!而如果一個(gè)串中1的個(gè)數(shù)是奇數(shù),那么串異或的結(jié)果一定為1,其實(shí)這個(gè)規(guī)則對(duì)應(yīng)的就是奇校驗(yàn)!反之,如果為奇數(shù),則x=1,為偶數(shù),x=0,那么對(duì)應(yīng)的就是偶校驗(yàn)!
故得到以下結(jié)論:
如果采用奇檢驗(yàn)構(gòu)造海明碼,那么出錯(cuò)校驗(yàn)組中的1的個(gè)數(shù)必為偶數(shù),即異或的結(jié)果必定為0!
如果采用奇檢驗(yàn)構(gòu)造海明碼,那么出錯(cuò)的位置是校驗(yàn)組異或結(jié)果倒置拼接并反轉(zhuǎn)的十進(jìn)制數(shù)
如果采用偶檢驗(yàn)構(gòu)造海明碼,那么出錯(cuò)校驗(yàn)組中的1的個(gè)數(shù)必為奇數(shù),即異或的結(jié)果必定為1!
如果采用偶檢驗(yàn)構(gòu)造海明碼,那么出錯(cuò)位置是校驗(yàn)組異或結(jié)果直接倒置拼接的十進(jìn)制數(shù)!
關(guān)于偶檢驗(yàn)構(gòu)造海明碼這里就不再詳細(xì)展開,如果你能用偶檢驗(yàn)的方法在把上面的例子都做一遍,那么海明碼你就已經(jīng)完全弄懂了!試試吧!
關(guān)于奇偶檢驗(yàn)碼 建議還是看看,因?yàn)楹C鞔a是基于奇偶校驗(yàn)的改進(jìn)!而且奇偶校驗(yàn)更簡(jiǎn)單!
關(guān)于海明碼的原理和計(jì)算
綜合上面我們求一下信息1011的海明碼是多少?
答:
我們知道信息位有4位,即為n=4,求得公式中校驗(yàn)位K=3。所以海明碼一共7位:H7-H1 ; 信息位:D3-D0; 校驗(yàn)位:P3-P1。
求P3-P1在海明碼中的位置。根據(jù)圖中下面這句話。我們可以求得位置。
p1= 2的(1-1)次方=1
p2=>2
p3=>4
校驗(yàn)位在海明碼中的位置:P1----1 P2----2 P3----4
現(xiàn)在我們需要求得P1-P3的值,我們的海明碼就出來了。
eg: H7 下標(biāo)為7, 校驗(yàn)碼下標(biāo)有1,2,4。 則需要7=4+2+1 。所以P1,P2,P3都參與了D3的校驗(yàn)。
接下來我們統(tǒng)計(jì)一個(gè)各個(gè)校驗(yàn)位校驗(yàn)的信號(hào)位有哪些。
P1---->P1,D0,D1,D3
P2---->P2,D0,D2,D3
P3---->P3,D1,D2,D3
進(jìn)行異或運(yùn)算(相同為0,相異為1)
P1=D0⊕D1⊕D3=1 1 1=1
P2=D0⊕D2⊕D3=1 0 1=0
P3=D1⊕D2⊕D3=1 0 1=0
所以海明碼為:1010101。
檢錯(cuò)計(jì)算: 本來是1011,假如傳過來的是1001。(D1出錯(cuò)了)
則從又到左D0=1 D1=0, D2=0, D3=1
G1=P1⊕D0⊕D1⊕D3=1 1 0 1=1
G2=P2⊕D0⊕D2⊕D3=0 1 0 1=0
G3=P3⊕D1⊕D2⊕D3=0 0 0*1=1
G3G2G1=101
如果是偶校驗(yàn),則需要全部為0,如果是奇校驗(yàn)全部為1。
101的10進(jìn)制。則是海明碼里面的第5位出錯(cuò)。H5(D1)出錯(cuò)。則D1取反,得到。1001-->1011 。 這樣就實(shí)現(xiàn)了檢錯(cuò),改錯(cuò)了。
如何理解海明碼可以發(fā)現(xiàn)雙比特錯(cuò),但是只能糾正單比特錯(cuò)?
糾錯(cuò)編碼:
不僅可以發(fā)現(xiàn)錯(cuò)位,還可以指出錯(cuò)位的位置,為自動(dòng)糾錯(cuò)提供數(shù)據(jù)。
海明碼:
可以發(fā)現(xiàn)雙比特錯(cuò),但只能糾正單比特錯(cuò)。
海明碼工作原理:
動(dòng)一發(fā)而牽全身(在數(shù)據(jù)中有多個(gè)校驗(yàn)碼,可能一個(gè)比特受多個(gè)校驗(yàn)碼校驗(yàn),當(dāng)一個(gè)比特出了差錯(cuò),可以通過校驗(yàn)碼看出哪個(gè)比特出錯(cuò))
海明碼工作流程:
1.確定校驗(yàn)碼位數(shù)r
n為有效信息的位數(shù),k位校驗(yàn)碼位數(shù):
2^k>=n+k+1;
例如:D=1010 (n=4)
帶入上述公式得出 :
k = 3 得出對(duì)應(yīng)的海明碼位數(shù)為 4+3=7位
2.確定校驗(yàn)碼和數(shù)據(jù)的位置
Note:二進(jìn)制從0001開始,千萬不要從0開始
校驗(yàn)碼只能放在2的幾次方的位置
p1 放在2的0次方 = 1p2 放在2的1次方 = 2p3 放在2的2次方 = 4D = 1 0 1 0 (D4--D1)| 二進(jìn)制 | 0111 | 0110 | 0101 | 0100 | 0011 | 0010 | 0001 || 數(shù)據(jù)位 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | | 代 碼 | D4 | D3 | D2 | p3 | D1 | p2 | p1 | | 實(shí)際值 | 1 | 0 | 1 | | 0 | | | 剩下的位置放置原數(shù)據(jù)
3.求出校驗(yàn)碼的值
Note:二進(jìn)制從0001開始,千萬不要從0開始| 二進(jìn)制 | 0111 | 0110 | 0101 | 0100 | 0011 | 0010 | 0001 || 數(shù)據(jù)位 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | | 代 碼 | D4 | D3 | D2 | p3 | D1 | p2 | p1 | | 實(shí)際值 | 1 | 0 | 1 | | 0 | | | 以p1為例,p1二進(jìn)制位末位是 1找所有二進(jìn)制位位 1 的校驗(yàn)位 p1,D1,D2,D4 ==(?,0,1,1)
令所有要校驗(yàn)的位 異或 = 0: p1,D1,D2,D4 相互異或 (同0異1) 得到p1 = 0同理求出剩余
p2 找第二位是 1p3 找第三位是 1| 二進(jìn)制 | 0111 | 0110 | 0101 | 0100 | 0011 | 0010 | 0001 || 數(shù)據(jù)位 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | | 代 碼 | D4 | D3 | D2 | p3 | D1 | p2 | p1 | | 實(shí)際值 | 1 | 0 | 1 | 0 | 0 | 1 | 0 |
4.檢錯(cuò)并糾錯(cuò)
| 二進(jìn)制 | 0111 | 0110 | 0101 | 0100 | 0011 | 0010 | 0001 || 數(shù)據(jù)位 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | | 代 碼 | D4 | D3 | D2 | p3 | D1 | p2 | p1 | | 實(shí)際值 | 1 | 0 | 1->0 | 0 | 0 | 1 | 0 |假設(shè)D2從 1變成了0 接收端做第三步的逆操作
令所有要檢驗(yàn)的位異或運(yùn)算
p1 = (0,0,0,1) = 1p2 = 0p3 = 1可以看出出錯(cuò)的是第 三 位和第 一 位是 1 的數(shù) 也就是 D2 出錯(cuò)了 將D2改正
簡(jiǎn)單理解海明校驗(yàn)碼
二進(jìn)制數(shù)據(jù)經(jīng)過傳送、存取等環(huán)節(jié),會(huì)發(fā)生誤碼(1變成0或0變成1),這就有如何發(fā)現(xiàn)及糾正誤碼的問題。所有解決此類問題的方法就是在原始數(shù)據(jù)(數(shù)碼位)基礎(chǔ)上增加幾位校驗(yàn)位。我們常使用的檢驗(yàn)碼有三種. 分別是奇偶校驗(yàn)碼、海明校驗(yàn)碼和循環(huán)冗余校驗(yàn)碼(CRC)。
海明校驗(yàn)碼是由RichardHamming于1950年提出、目前還被廣泛采用的一種很有效的校驗(yàn)方法。它的實(shí)現(xiàn)原理,是在k個(gè)數(shù)據(jù)位之外加上r個(gè)校驗(yàn)位,從而形成一個(gè)k+r位的新的碼字,使新的碼字的碼距比較均勻地拉大。把數(shù)據(jù)的每一個(gè)二進(jìn)制位分配在幾個(gè)不同的偶校驗(yàn)位的組合中,當(dāng)某一位出錯(cuò)后,就會(huì)引起相關(guān)的幾個(gè)校驗(yàn)位的值發(fā)生變化,這不但可以發(fā)現(xiàn)出錯(cuò),還能指出是哪一位出錯(cuò),為進(jìn)一步自動(dòng)糾錯(cuò)提供了依據(jù)。但是因?yàn)檫@種海明校驗(yàn)的方法只能檢測(cè)和糾正一位出錯(cuò)的情況。所以如果有多個(gè)錯(cuò)誤,就不能查出了。
什么是碼距?
兩個(gè)碼組對(duì)應(yīng)位上數(shù)字的不同位的個(gè)數(shù)稱為碼組的距離,簡(jiǎn)稱碼距,又稱海明(Hamming)距離。例如00110和00100碼距為1,12345和13344碼距為2,Caus和Daun碼距為2。
海明校驗(yàn)碼公式(假設(shè)為k個(gè)數(shù)據(jù)位設(shè)置r個(gè)校驗(yàn)位)
公式怎么得出來的呢?
假設(shè)有r個(gè)校驗(yàn)位,一個(gè)位子有0或1兩種情況,r個(gè)位子就有2 r種排列情況,能表示2 r種狀態(tài)。其中一個(gè)狀態(tài)用來表示正確(沒有錯(cuò)誤發(fā)生)的這種情況。其余的2 r-1種狀態(tài)來表示錯(cuò)誤發(fā)生在哪一位??偣灿衚+r位,所以2 r-1一定要>=總位子k+r。
按照該不等可以得出k與r的對(duì)應(yīng)關(guān)系
注意:海明校驗(yàn)碼是放在2的冪次位上的,即“1,2,4,8,16,32······”
實(shí)戰(zhàn)求1011的海明碼
第一步:求r的值(即校驗(yàn)位數(shù))
直接根據(jù)公式代入得:
2^r-1 ≥ 4 + r
2^r-r ≥ 5
得到r最小為3
所以海明碼的位數(shù)是4+3=7位
第二步:校驗(yàn)位和信息位對(duì)號(hào)入座
注意: 信息位的位置分配是從高位到低位依次存放
注意: 海明校驗(yàn)碼是放在2的冪次位上的
位數(shù)|1|2|3|4|5|6|7
:-:|:-:|:-:|:-:|:-:|:-:|:-:
信息位|||1||1|0|1
校驗(yàn)位|r1|r2||r3|||
第三步:確定校驗(yàn)位的值
校驗(yàn)原則:被校驗(yàn)的海明位的下標(biāo)等于所有參與校驗(yàn)該為的校驗(yàn)位的下標(biāo)之和
然后將校驗(yàn)碼校驗(yàn)的信息位的位置記錄下來:
然后做對(duì)應(yīng)信息位的異或運(yùn)算(異或的運(yùn)算法則為:0⊕0=0,1⊕0=1,0⊕1=1,1⊕1=0(同為0,異為1))
代入表格得到
注意:按照從低位到高位的排列順序得到海明碼:1010101
海明碼的原理
海明碼是一種可以糾正一位差錯(cuò)的編碼。它是利用在信息位為k位,增加r位冗余位,構(gòu)成一個(gè)n=k+r位的碼字,然后用r個(gè)監(jiān)督關(guān)系式產(chǎn)生的r個(gè)校正因子來區(qū)分無錯(cuò)和在碼字中的n個(gè)不同位置的一位錯(cuò)。它必需滿足以下關(guān)系式: r 2^r ≥ k r 1 或 2^r ≥ n 1海明碼的編碼效率為: R=k/(k+r) 式中 k為信息位位數(shù) r為增加冗余位位數(shù)
目錄
1.海明碼的原理
2.海明碼的生成與接收
3.海明碼的計(jì)算
4.海明碼校驗(yàn)程序設(shè)計(jì)原理分析參考
編輯本段1.海明碼的原理
在數(shù)據(jù)中間加入幾個(gè)校驗(yàn)碼,碼距均勻拉大,將數(shù)據(jù)的每個(gè)二進(jìn)制位分配在幾個(gè)奇偶校驗(yàn)組里,當(dāng)某一位出錯(cuò),會(huì)引起幾個(gè)校驗(yàn)位的值發(fā)生變化。
海明不等式:
校驗(yàn)碼個(gè)數(shù)為K,2的K次方個(gè)信息,1個(gè)信息用來指出“沒有錯(cuò)誤”,其余(2^K)-1個(gè)指出錯(cuò)誤發(fā)生在那一位,但也可能是校驗(yàn)位錯(cuò)誤,故有N<=(2^K)-1-K能被校驗(yàn)。
海明碼的編碼規(guī)則:
1.每個(gè)校驗(yàn)位Ri被分配在海明碼的第2的i次方的位置上,
2.海明碼的每一位(Hi)是由多個(gè)/1個(gè)校驗(yàn)值進(jìn)行校驗(yàn)的,被校驗(yàn)碼的
位置碼是所有校驗(yàn)位的校驗(yàn)位位置碼之和。
一個(gè)例題:
4個(gè)數(shù)據(jù)位d0,d1,d2,d3, 3個(gè)校驗(yàn)位r0,r1,r2,對(duì)應(yīng)的位置為:
d3 d2 d1 r2 d0 r1 r0 ======b7 b6 b5 b4 b3 b2 b1
校驗(yàn)位的取值,就是他所能校驗(yàn)的數(shù)據(jù)位的異或
b1為b3,b5,b7的異或,b2為b3,b6,b7 b4為b5,b6,b7
海明v傳送到接受方后,將上三式的右邊(b1,b2,b4)的邏輯表達(dá)式分別
異或上左邊的值就得到了校驗(yàn)方程,如果上題采用偶校驗(yàn)
G1=b1 b3 b5 b7的異或
G2=b2 b3 b6 b7的異或
G3=b4 b5 b6 b7的異或
若G1G2G3為001是第一位錯(cuò)
若為011是第三位錯(cuò)
編輯本段2.海明碼的生成與接收
特注:以下的+均代表異或
方法一:
1)海明碼的生成。
例1.已知:信息碼為:"0010"。海明碼的監(jiān)督關(guān)系式為:
S2=a2+a4+a5+a6
S1=a1+a3+a5+a6
S0=a0+a3+a4+a6
求:海明碼碼字。
解:1)由監(jiān)督關(guān)系式知冗余碼為a2a1a0。
2)冗余碼與信息碼合成的海明碼是:"0010a2a1a0"。
設(shè)S2=S1=S0=0,由監(jiān)督關(guān)系式得:
異或運(yùn)算:
a2=a4+a5+a6=1
a1=a3+a5+a6=0
a0=a3+a4+a6=1
因此,海明碼碼字為:"0010101"
對(duì)以上這道題目的第二問的疑問:
冗余碼與信息碼合成的海明碼是:"0010a2a1a0"。為什么a2a1a0直接加在信息碼后面,而不是按照1,2,4,8位的順序加在信息碼后面【例如:001(a2)0(a1)(a0)=0011001】
2)海明碼的接收。
例2.已知:海明碼的監(jiān)督關(guān)系式為:
S2=a2+a4+a5+a6
S1=a1+a3+a5+a6
S0=a0+a3+a4+a6
接收碼字為:"0011101"(n=7)
求:發(fā)送端的信息碼。
解:1)由海明碼的監(jiān)督關(guān)系式計(jì)算得S2S1S0=011。
2)由監(jiān)督關(guān)系式可構(gòu)造出下面錯(cuò)碼位置關(guān)系表:
S2S1S0
000
001
010
100
011
101
110
111
錯(cuò)碼位置
無錯(cuò)
a0
a1
a2
a3
a4
a5
a6
3)由S2S1S0=011查表得知錯(cuò)碼位置是a3。
4)糾錯(cuò)--對(duì)碼字的a3位取反得正確碼字:"0 0 1 0 1 0 1"
5)把冗余碼a2a1a0刪除得發(fā)送端的信息碼:"0010"
方法二:(不用查表,方便編程)
1)海明碼的生成(順序生成法)。
例3.已知:信息碼為:" 1 1 0 0 1 1 0 0 " (k=4代表冗余位數(shù),即校驗(yàn)碼位數(shù))
求:海明碼碼字。
解: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分別插于2的k次方位(k=0,1,2,3)。碼位分別為1,2,4,8。
2)冗余碼A,B,C,D的線性碼位是:(相當(dāng)于監(jiān)督關(guān)系式)
監(jiān)督關(guān)系式的推導(dǎo):
D C B A
1 0 0 0 1
2 0 0 1 0
3 0 0 1 1
4 0 1 0 0
5 0 1 0 1
6 0 1 1 0
7 0 1 1 1
8 1 0 0 0
9 1 0 0 1
10 1 0 1 0
11 1 0 1 1
12 1 1 0 0
根據(jù)上面表格得到 A B C D
需要說明的是公式中參與計(jì)算的是表格中出現(xiàn)"1"的那個(gè)位 右邊是數(shù)據(jù)位的二進(jìn)制數(shù),公式中的"+"表示異或
故此有如下表達(dá)式:
A->1,3,5,7,9,11;(這里的1 3 5 7 9 11均為A那一列出現(xiàn)1的位)
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)把線性碼位的值的偶校驗(yàn)作為冗余碼的值(設(shè)冗余碼初值為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"
2)海明碼的接收。
例4.已知:接收的碼字為:"1 0 0 1 1 0 0 0 1 1 0 0"(k=4代表冗余位數(shù),即校驗(yàn)碼位數(shù))
求:發(fā)送端的信息碼。
解:1)設(shè)錯(cuò)誤累加器(err)初值=0
2)求出冗余碼的偶校驗(yàn)和,并按碼位累加到err中:
A=∑(1,0,1,0,1,0)=1 err=err+2^0=1
B=∑(0,0,0,0,1,0)=1 err=err+2^1=3
C=∑(1,1,0,0,0) =0 err=err+0 =3
D=∑(0,1,1,0,0) =0 err=err+0 =3
由err≠0可知接收碼字有錯(cuò),
3)碼字的錯(cuò)誤位置就是錯(cuò)誤累加器(err)的值3。
4)糾錯(cuò)--對(duì)碼字的第3位值取反得正確碼字:
"1 0 1 1 1 0 0 0 1 1 0 0"
5)把位于2的k次方位的冗余碼刪除得信息碼:"1 1 0 0 1 1 0 0"
編輯本段3.海明碼的計(jì)算
海明碼(Hamming Code )編碼的關(guān)鍵是使用多余的奇偶校驗(yàn)位來識(shí)別一位錯(cuò)誤。
碼字(Code Word) 按如下方法構(gòu)建:
1、把所有2的冪次方的數(shù)據(jù)位標(biāo)記為奇偶校驗(yàn)位(編號(hào)為1, 2, 4, 8, 16, 32, 64等的位置)
2、其他數(shù)據(jù)位用于待編碼數(shù)據(jù). (編號(hào)為3, 5, 6, 7, 9, 10, 11, 12, 13, 14, 15, 17等的位置)
3、每個(gè)奇偶校驗(yàn)位的值代表了代碼字中部分?jǐn)?shù)據(jù)位的奇偶性,其所在位置決定了要校驗(yàn)和跳過的比特位順序。
位置1:校驗(yàn)1位,跳過1位,校驗(yàn)1位,跳過1位(1,3,5,7,9,11,13,15,…)
位置2:校驗(yàn)2位,跳過2位,校驗(yàn)2位,跳過2位 (2,3,6,7,10,11,14,15,…)
位置4:校驗(yàn)4位,跳過4位,校驗(yàn)4位,跳過4位 (4,5,6,7,12,13,14,15,20,21,22,23,…)
位置8:校驗(yàn)8位,跳過8位,校驗(yàn)8位,跳過8位(8-15,24-31,40-47,…)
…
如果全部校驗(yàn)的位置中有奇數(shù)個(gè)1,把該奇偶校驗(yàn)位置為1;如果全部校驗(yàn)的位置中有偶數(shù)個(gè)1,把該奇偶校驗(yàn)位置為0.
舉例說明:
一個(gè)字節(jié)的數(shù)據(jù):10011010
構(gòu)造數(shù)據(jù)字(Data Word),對(duì)應(yīng)的校驗(yàn)位留空_ _ 1 _ 0 0 1 _ 1 0 1 0
計(jì)算每個(gè)校驗(yàn)位的奇偶性 ( ?代表要設(shè)置的比特位):
位置1檢查1,3,5,7,9,11:
? _ 1 _ 0 0 1 _ 1 0 1 0. 偶數(shù)個(gè)1,因此位置1設(shè)為0,即: 0 _ 1 _ 0 0 1 _ 1 0 1 0
位置2檢查2,3,6,7,10,11:
0 ? 1 _ 0 0 1 _ 1 0 1 0. 奇數(shù)個(gè)1,因此位置2設(shè)為1,即: 0 1 1 _ 0 0 1 _ 1 0 1 0
位置4檢查4,5,6,7,12:
0 1 1 ? 0 0 1 _ 1 0 1 0. 奇數(shù)個(gè)1,因此位置4設(shè)為1,即: 0 1 1 1 0 0 1 _ 1 0 1 0
位置8檢查8,9,10,11,12:
0 1 1 1 0 0 1 ? 1 0 1 0. 偶數(shù)個(gè)1,因此位置8設(shè)為0,即: 0 1 1 1 0 0 1 0 1 0 1 0
因此碼字為: 011100101010.
查找并糾錯(cuò)一位錯(cuò)誤
上例中構(gòu)建了一個(gè)碼字 011100101010,假定實(shí)際接收到的數(shù)據(jù)是011100101110. 則接收方可以計(jì)算出哪一位出錯(cuò)并對(duì)其進(jìn)行更正。方法就是驗(yàn)證每一個(gè)校驗(yàn)位。記下所有出錯(cuò)的校驗(yàn)位,可以發(fā)現(xiàn)校驗(yàn)位2和8的數(shù)據(jù)不正確. 錯(cuò)誤校驗(yàn)位 2 + 8 = 10, 則位置10的數(shù)據(jù)出錯(cuò)。一般說來,對(duì)所有校驗(yàn)位進(jìn)行檢查, 將所有出錯(cuò)的校驗(yàn)位置相加, 得到的就是錯(cuò)誤信息所在的位置.
編輯本段4.海明碼校驗(yàn)程序設(shè)計(jì)原理分析參考
海明碼校驗(yàn)是為了保證數(shù)據(jù)傳輸正確而提出的,本來就是一串要傳送的數(shù)據(jù),如:D7,D6,D5,D4,D3,D2,D1,D0,這里舉的是八位數(shù)據(jù),可以是n位數(shù)據(jù)。就這樣傳送數(shù)據(jù),不知道接收到后是不是正確的。所以,要加入校驗(yàn)位數(shù)據(jù)才能檢查是否出錯(cuò)。這里涉及到一個(gè)問題,要多少位校驗(yàn)數(shù)據(jù)才能查出錯(cuò)誤呢?
我們只要能檢測(cè)出一位出錯(cuò),則對(duì)于8位信息數(shù)據(jù),校驗(yàn)位為4位。滿足下列條件:2的k次方大于等于n+k+1,其中k為校驗(yàn)位位數(shù),n為信息數(shù)據(jù)位位數(shù)。驗(yàn)證一下,2的4次方等于16,n+k+1等于8+4+1等于13。 8位信息數(shù)據(jù)與4位校驗(yàn)位總共有12位數(shù)據(jù),怎么排列呢?我們先把校驗(yàn)位按P4,P3,P2,P1排列,用通式Pi表示校驗(yàn)位序列,i為校驗(yàn)位在校驗(yàn)序列中的位置。 傳送的數(shù)據(jù)流用M12,M11,M10,M9,M8,M7,M6,M5,M4,M3,M2,M1表示,接下來的問題是如何用D7,D6,D5,D4,D3,D2,D1,D0與P4,P3,P2,P1來表M12,M11,M10,M9,M8,M7,M6,M5,M4,M3,M2,M1了。校驗(yàn)位在傳送的數(shù)據(jù)流中位置為2的i-1次方,則P1在M1位,P2在M2位,P3在M4位,P4在M8位。其余的用信息數(shù)據(jù)從高到低插入。 傳送的數(shù)據(jù)流為D7,D6,D5,D4,P4,D3,D2,D1,P3,D0,P2,P1。 接下來,我們要弄明白如何找出錯(cuò)誤位的問題。引進(jìn)4位校驗(yàn)和序列S4,S3,S2,S1。S4,S3,S2,S1等于0,0,0,0表示傳送的數(shù)據(jù)流正確;如S4,S3,S2,S1等于0,0,1,0則表示傳送的數(shù)據(jù)流中第2位出錯(cuò);如S4,S3,S2,S1等于0,0,1,1則表示傳送的數(shù)據(jù)流中第3位出錯(cuò);依次類推。
用M12,M11,M10,M9,M8,M7,M6,M5,M4,M3,M2,M1如何表示S4,S3,S2,S1呢,簡(jiǎn)單的方法就是S1=1時(shí),S4,S3,S2從0,0,0到1,1,1的所有的Mx異或。即S1等于M1異或M3異或M5異或M7異或M9異或M11。也就是S1等于P1異或D0異或D1異或D3異或D4異或D6。S2=1時(shí),S4,S3,S1從0,0,0到1,1,1的所有的Mx異或。即S2等于M2異或M3異或M6異或M7異或M10異或M11。S3=1時(shí),S4,S2,S1從0,0,0到1,1,1的所有的Mx異或。即S3等于M4異或M5異或M6異或M7異或M12。S4=1時(shí),S3,S2,S1從0,0,0到1,1,1的所有的Mx異或。即S4等于M8異或M9異或M10異或M11異或M12。這樣,對(duì)于一串碼流,知道幾位校驗(yàn)位,可以很快確定哪一位出錯(cuò)。而在發(fā)送端,可以根據(jù)S4,S3,S2,S1的表達(dá)式求出P4,P3,P2,P1的表達(dá)式,只要把式子右邊的P4或P3或P2或P1移到左邊替換掉S4或S3或S2或S1就可以了。面舉例說明:用^表示異或
D7,D6,D5,D4,D3,D2,D1,D0=11010001
S4=M8^M9^M10^M11^M12=D7^D6^D5^D4^P4; P4=D7^D6^D5^D4;
S3=M4^M5^M6^M7^M12 =D7^D3^D2^D1^P3; P3=D7^D3^D2^D1;
S2=M2^M3^M6^M7^M10^M11 =D6^D5^D3^D2^D0^P2; P2=D6^D5^D3^D2^D0;
S1=M1^M3^M5^M7^M9^M11=D6^D4^D3^D1^D0^P1; P1=D6^D4^D3^D1^D0;
所以,
P4=D7^D6^D5^D4=1^1^0^1=1
P3=D7^D3^D2^D1=1^0^0^0=1
P2= D6^D5^D3^D2^D0=1^0^0^0^1=0 P1=D6^D4^D3^D1^D0=1^1^0^0^1=1
故,傳送碼流為D7,D6,D5,D4,P4,D3,D2,D1,P3,D0,P2,P1等于
110110001101
若接收端收到110110001101,則
S4=M8^M9^M10^M11^M12=1^1^0^1^1=0
S3=M4^M5^M6^M7^M12=1^0^0^0^1=0
S2=M2^M3^M6^M7^M10^M11=0^1^0^0^0^1=0
S1=M1^M3^M5^M7^M9^M11=1^1^0^0^1^1=0
故,接收碼流正確。
若M6出錯(cuò),由0變?yōu)?。則
S4=M8^M9^M10^M11^M12=1^1^0^1^1=0
S3=M4^M5^M6^M7^M12=1^0^1^0^1=1
S2=M2^M3^M6^M7^M10^M11=0^1^1^0^0^1=1 S1=M1^M3^M5^M7^M9^M11=1^1^0^0^1^1=0
即S4S3S2S1=0110,此為十進(jìn)制的6,說明第六位出錯(cuò),也就是M6出錯(cuò)。完全符合。
5.海明碼的表格計(jì)算
如果對(duì)于m位的數(shù)據(jù),增加k位冗余位,則組成位n=m+k位的糾錯(cuò)碼。對(duì)于2^m個(gè)有效碼字中的每一個(gè),都有n個(gè)無效但可以糾錯(cuò)的碼字。這些可糾錯(cuò)的碼字與有效碼字的距離是1,含單個(gè)錯(cuò)誤位。這樣,對(duì)于一個(gè)有效的消息總共有n+1個(gè)可識(shí)別的碼字。這n+1個(gè)碼字相對(duì)于其他2^m-1個(gè)有效消息的距離都大于1。這意味著總共有2^m(n+1)個(gè)有效的或是可糾錯(cuò)的碼字。顯然這個(gè)數(shù)應(yīng)小于等于碼字的所有的可能的個(gè)數(shù)2^n。于是我們有
2^m(n+1)<2^n
因?yàn)閚=m+k,我們得出
m+k+1<2^k
對(duì)于給定的數(shù)據(jù)位m,上式給出了k的下界,即要糾正單個(gè)錯(cuò)誤,k必須取最小的值。海明建議了一種方案,可以達(dá)到這個(gè)下界,并能直接指出錯(cuò)在哪一位。首先把碼字的位從1到n編號(hào),,并把這個(gè)編號(hào)表示成二進(jìn)制數(shù),即2的冪之和。然后對(duì)2的每一個(gè)冪設(shè)置一個(gè)奇偶位。例如對(duì)于6號(hào)位,由于6=110(二進(jìn)制),所以6號(hào)位參加第2位和第4位的奇偶校驗(yàn),而不參加第1位奇偶校驗(yàn)。類似的9號(hào)位參加第1位和第8位的奇偶校驗(yàn)而不參加第2位和第4位的奇偶校驗(yàn)。海明把奇偶校驗(yàn)分配在1,2,4,8等位置上,其他位置放數(shù)據(jù)。下面根據(jù)海明編碼的例圖,舉例說明編碼的方法
海明編碼的例
海明編碼的例
例如傳送的消息為:1001011
我們把數(shù)據(jù)放在3,5,6,7,9,10,11等位置上,1,2,4,8則為校驗(yàn)位。
1
0 0 1
0 1 1
1 2 3 4 5 6 7 8 9 10 11
根據(jù)海明編碼的例,3、5、7、9、11的二進(jìn)制編碼的第一位為1,所以3、5、7、9、11號(hào)位參加第一位校驗(yàn)位,若按偶校驗(yàn)計(jì)算,1號(hào)位應(yīng)為1
1
1
0 0 1
0 1 1
1 2 3 4 5 6 7 8 9 10 11
類似的,3、6、7、10、11號(hào)位參加2號(hào)位校驗(yàn),5、6、7號(hào)位參加4號(hào)位校驗(yàn),9、10、11號(hào)位參加8號(hào)位校驗(yàn),全部按偶校驗(yàn)計(jì)算,最終得到如下結(jié)果
1 0 1 1 0 0 1 0 0 1 1
1 2 3 4 5 6 7 8 9 10 11
如果這個(gè)碼字傳輸中有錯(cuò)誤,比如說6號(hào)位出錯(cuò)。就會(huì)變成
√ ╳ ╳ √
1 0 1 1 0 1 1 0 0 1 1
1 2 3 4 5 6 7 8 9 10 11
當(dāng)接收端按照同樣的規(guī)則計(jì)算奇偶位時(shí),就會(huì)發(fā)現(xiàn)1號(hào)位和8號(hào)位的奇偶性正確而2號(hào)位和4號(hào)位的奇偶性不對(duì),于是2+4=6,,立即可以判斷錯(cuò)在6號(hào)位。
上例中k=4,因而m<2^4-4-1=11,即數(shù)據(jù)位可以用到11位,共組成15位的碼字,可檢測(cè)出單個(gè)位置的錯(cuò)誤。
怎么理解海明碼?
海明碼1.海明碼的概念海明碼是一種可以糾正一位差錯(cuò)的編碼。它是利用在信息位為k位,增加r位冗余位,構(gòu)成一個(gè)n=k+r位的碼字,然后用r個(gè)監(jiān)督關(guān)系式產(chǎn)生的r個(gè)校正因子來區(qū)分無錯(cuò)和在碼字中的n個(gè)不同位置的一位錯(cuò)。它必需滿足以下關(guān)系式:2^r>=n+1 或 2^r>=k+r+1海明碼的編碼效率為:R=k/(k+r)式中 k為信息位位數(shù)r為增加冗余位位數(shù) 2.海明碼的生成與接收方法一:1)海明碼的生成。例1.已知:信息碼為:"0010"。海明碼的監(jiān)督關(guān)系式為:S2=a2+a4+a5+a6S1=a1+a3+a5+a6S0=a0+a3+a4+a6求:海明碼碼字。解:1)由監(jiān)督關(guān)系式知冗余碼為a2a1a0。2)冗余碼與信息碼合成的海明碼是:"0010a2a1a0"。設(shè)S2=S1=S0=0,由監(jiān)督關(guān)系式得:a2=a4+a5+a6=1a1=a3+a5+a6=0a0=a3+a4+a6=1因此,海明碼碼字為:"0010101"2)海明碼的接收。例2.已知:海明碼的監(jiān)督關(guān)系式為:S2=a2+a4+a5+a6S1=a1+a3+a5+a6S0=a0+a3+a4+a6接收碼字為:"0011101"(n=7)求:發(fā)送端的信息碼。解:1)由海明碼的監(jiān)督關(guān)系式計(jì)算得S2S1S0=011。2)由監(jiān)督關(guān)系式可構(gòu)造出下面錯(cuò)碼位置關(guān)系表: S2S1S0000001010100011101110111錯(cuò)碼位置無錯(cuò)a0a1a2a3a4a5a63)由S2S1S0=011查表得知錯(cuò)碼位置是a3。4)糾錯(cuò)--對(duì)碼字的a3位取反得正確碼字:"0 0 1 0 1 0 1"5)把冗余碼a2a1a0刪除得發(fā)送端的信息碼:"0010"方法二:(不用查表,方便編程)1)海明碼的生成(順序生成法)。例3.已知:信息碼為:" 1 1 0 0 1 1 0 0 " (k=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。2)冗余碼A,B,C,D的線性碼位是:(相當(dāng)于監(jiān)督關(guān)系式)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)把線性碼位的值的偶校驗(yàn)作為冗余碼的值(設(shè)冗余碼初值為0):A=∑(0,1,1,0,1,0)=1B=∑(0,1,0,0,1,0)=0C=∑(0,1,0,0,0) =1D=∑(0,1,1,0,0) =04)海明碼為:"1 0 1 1 1 0 0 0 1 1 0 0"2)海明碼的接收。例4.已知:接收的碼字為:"1 0 0 1 1 0 0 0 1 1 0 0"(k=8)求:發(fā)送端的信息碼。解:1)設(shè)錯(cuò)誤累加器(err)初值=02)求出冗余碼的偶校驗(yàn)和,并按碼位累加到err中:A=∑(1,0,1,0,1,0)=1 err=err+20=1B=∑(0,0,0,0,1,0)=1 err=err+21=3C=∑(1,1,0,0,0) =0 err=err+0 =3D=∑(0,1,1,0,0) =0 err=err+0 =3由err≠0可知接收碼字有錯(cuò),3)碼字的錯(cuò)誤位置就是錯(cuò)誤累加器(err)的值3。4)糾錯(cuò)--對(duì)碼字的第3位值取反得正確碼字:"1 0 1 1 1 0 0 0 1 1 0 0"5)把位于2k位的冗余碼刪除得信息碼:"1 1 0 0 1 1 0 0"