Binääri Hamming-koodi | |
---|---|
| |
Nimetty | Richard Hamming |
Tyyppi | lineaarinen lohkokoodi |
Lohkon pituus | |
Viestin pituus | |
Jaa | |
Etäisyys | 3 |
Aakkosten koko | 2 |
Nimitys | |
Mediatiedostot Wikimedia Commonsissa |
Hamming-koodi on itseään tarkistava ja itsekorjaava koodi . Rakennettu viittaamalla binäärilukujärjestelmään .
Voit korjata yksittäisen virheen (virhe sanan yhdessä bitissä) ja löytää kaksinkertaisen [1] .
Nimetty amerikkalaisen matemaatikon Richard Hammingin mukaan, joka ehdotti koodia.
1940-luvun puolivälissä Bell Model V -laskentakone luotiin Bell Laboratoriesissa . Se oli relelohkoja käyttävä sähkömekaaninen kone, jonka nopeus oli erittäin alhainen: yksi toimenpide muutamassa sekunnissa. Tiedot syötettiin koneeseen rei'itetyillä korteilla epäluotettavien lukulaitteiden kanssa, joten lukuprosessissa tapahtui usein virheitä. Työpäivinä havaittiin ja korjattiin erikoiskoodeja, kun taas kuljettaja sai tietää virheestä valojen hehkusta, korjasi ja käynnisti koneen uudelleen. Viikonloppuisin, kun käyttäjiä ei ollut, kone poistui automaattisesti ohjelmasta ja aloitti uuden virheen sattuessa.
Hamming työskenteli usein viikonloppuisin ja suuttui yhä enemmän, kun hänen täytyi ladata ohjelmansa uudelleen reikäkortinlukijan epäluotettavuuden vuoksi. Hän etsi useita vuosia tehokasta virheenkorjausalgoritmia. Vuonna 1950 hän julkaisi koodausmenetelmän, joka tunnetaan nimellä Hamming-koodi.
Systemaattiset koodit muodostavat suuren ryhmän lohkoisia, erotettavia koodeja (joissa sanan kaikki symbolit voidaan jakaa varmennukseen ja informaatioon). Systemaattisten koodien ominaisuus on, että tarkistussymbolit muodostuvat informaatiosymbolien lineaaristen loogisten operaatioiden tuloksena. Lisäksi mikä tahansa sallittu koodisana voidaan saada lineaarisesti riippumattomien koodisanojen joukon lineaaristen operaatioiden tuloksena.
Hamming-koodit ovat itsevalvontakoodeja, eli koodeja, jotka havaitsevat automaattisesti tiedonsiirron virheet. Niiden rakentamiseksi riittää, että määrität jokaiseen sanaan yksi ylimääräinen (ohjaus) binäärinumero ja valitset tämän numeron numeron siten, että minkä tahansa luvun kuvassa olevien yksiköiden kokonaismäärä on esimerkiksi pariton. Yksittäinen virhe missä tahansa lähetetyn sanan numerossa (mukaan lukien ehkä tarkistusnumero) muuttaa yksiköiden kokonaismäärän pariteetin. Modulo 2 -laskurit, jotka laskevat luvun binäärinumeroiden joukossa olevia ykkösiä, antavat signaalin virheiden olemassaolosta. Tässä tapauksessa on mahdotonta tietää, missä sanan kohdassa virhe tapahtui, ja siksi sitä ei ole mahdollista korjata. Myös virheet, jotka esiintyvät samanaikaisesti kahdessa, neljässä jne. - parillisessa määrässä numeroita, jäävät huomaamatta. Oletetaan, että kaksinkertaiset, ja vielä enemmän useat virheet ovat epätodennäköisiä.
Koodit, joissa automaattinen virheenkorjaus on mahdollista, kutsutaan itsekorjautuviksi. Yksittäisten virheiden korjaamiseen tarkoitetun itsekorjaavan koodin rakentamiseen yksi tarkistusnumero ei riitä. Kuten seuraavasta voidaan nähdä, ohjausbittien lukumäärä on valittava siten, että epäyhtälö tai täyttyy , missä on koodisanan informaatiobinääribittien lukumäärä. Tämän epäyhtälön mukaisesti löydetyt k:n vähimmäisarvot annetuille m:n arvoille on annettu taulukossa.
Alue m | kmmin_ _ |
---|---|
yksi | 2 |
2-4 | 3 |
5-11 | neljä |
12-26 | 5 |
27-57 | 6 |
Binäärilohkokorjauskoodit kiinnostavat eniten . Tällaisia koodeja käytettäessä informaatio välitetään samanpituisten lohkojen muodossa ja jokainen lohko koodataan ja dekoodataan toisistaan riippumatta. Lähes kaikissa lohkokoodeissa symbolit voidaan jakaa informaatioon ja tarkastukseen tai ohjaukseen. Siten kaikki sanat jaetaan sallittuihin (joille tiedon ja tarkistusmerkkien suhde on mahdollinen) ja kiellettyihin.
Itsekorjautuvien koodien pääominaisuudet:
Plotkinin raja antaa koodin etäisyyden ylärajan:
tai:
kloHamming-raja määrittää sallittujen koodiyhdistelmien enimmäismäärän:
missä on elementtien yhdistelmien lukumäärä elementeillä. Täältä saat lausekkeen tarkistussymbolien määrän arvioimiseksi:Arvojen kohdalla ero Hammingin ja Plotkinin välillä on pieni.
Varshamov-Gilbertin rajoitus suurelle n:lle määrittää alarajan tarkistussymbolien lukumäärälle:
Kaikki yllä olevat arviot antavat kuvan ylärajasta kiinteällä ja /tai alemmalla arviolla tarkistussymbolien lukumäärästä.
Hamming-koodien rakentaminen perustuu periaatteeseen, että yksittäisten merkkien määrä tarkistetaan pariteetin varalta: sellainen elementti lisätään sekvenssiin niin, että yksittäisten merkkien määrä tuloksena olevassa sekvenssissä on parillinen:
Tämä merkki tarkoittaa modulo 2 -lisäystä :
Jos - niin ei ole virhettä, jos - niin yksi virhe.
Tällaista koodia kutsutaan nimellä tai . Ensimmäinen numero on sekvenssielementtien lukumäärä, toinen on tietomerkkien lukumäärä.
Jokaiselle tarkistussymbolien määrälle on klassinen Hamming-koodi ja merkinnät:
eli - .Muilla arvoilla saadaan ns. katkaistu koodi, esimerkiksi kansainvälinen lennätinkoodi MTK-2, jolla on . Se vaatii Hamming-koodin, joka on lyhennetty versio klassikosta
Harkitse esimerkiksi klassista Hamming-koodia . Ryhmitetään tarkistussymbolit seuraavasti:
Koodisanan saaminen näyttää tältä:
= .Dekooderin tulo vastaanottaa koodisanan , jossa symbolit on merkitty viivalla, joka voi vääristyä häiriön seurauksena. Virheenkorjaustilassa olevaan dekooderiin rakennetaan oireyhtymien sarja:
kutsutaan sekvenssisyndroomaksi.
Syndroman saaminen näyttää tältä:
= .0 | 0 | 0 | 0 | 0 | 0 | 0 | yksi | 0 | 0 | 0 | yksi | 0 | yksi |
0 | 0 | 0 | yksi | 0 | yksi | yksi | yksi | 0 | 0 | yksi | yksi | yksi | 0 |
0 | 0 | yksi | 0 | yksi | yksi | 0 | yksi | 0 | yksi | 0 | 0 | yksi | yksi |
0 | 0 | yksi | yksi | yksi | 0 | yksi | yksi | 0 | yksi | yksi | 0 | 0 | 0 |
0 | yksi | 0 | 0 | yksi | yksi | yksi | yksi | yksi | 0 | 0 | 0 | yksi | 0 |
0 | yksi | 0 | yksi | yksi | 0 | 0 | yksi | yksi | 0 | yksi | 0 | 0 | yksi |
0 | yksi | yksi | 0 | 0 | 0 | yksi | yksi | yksi | yksi | 0 | yksi | 0 | 0 |
0 | yksi | yksi | yksi | 0 | yksi | 0 | yksi | yksi | yksi | yksi | yksi | yksi | yksi |
Hamming-koodin koodisanat on annettu taulukossa.
Oireyhtymä osoittaa, että sekvenssissä ei ole vääristymiä. Jokainen nollasta poikkeava oireyhtymä vastaa tiettyä virhekuviota, joka korjataan dekoodausvaiheessa.
Oireyhtymä | 001 | 010 | 011 | 100 | 101 | 110 | 111 |
Virhe kokoonpanossa |
0000001 | 0000010 | 0001000 | 0000100 | 1000000 | 0010000 | 0100000 |
Symbolivirhe _ |
Oikeanpuoleisen taulukon koodille on ilmoitettu nollasta poikkeavat oireyhtymät ja niitä vastaavat virhekonfiguraatiot (lomakkeelle: ).
Oletetaan, että meidän on luotava Hamming-koodi jollekin informatiiviselle koodisanalle. Otetaan esimerkkinä 15-bittinen koodisana, vaikka algoritmi sopii minkä pituisille koodisanoille. Alla olevan taulukon ensimmäisellä rivillä on koodisanan paikkanumerot, toisella rivillä bittinimike ja kolmannella bittiarvot.
yksi | 2 | 3 | neljä | 5 | 6 | 7 | kahdeksan | 9 | kymmenen | yksitoista | 12 | 13 | neljätoista | viisitoista |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
x 1 | x2_ _ | x 3 | x4 _ | x5_ _ | x6 _ | x 7 | x 8 | x9_ _ | x 10 | x 11 | x 12 | x 13 | x 14 | x 15 |
yksi | 0 | 0 | yksi | 0 | 0 | yksi | 0 | yksi | yksi | yksi | 0 | 0 | 0 | yksi |
Lisätään informaatiosanaan ohjausbittejä siten, että niiden paikkanumerot ovat kahden kokonaislukupotenssit: 1, 2, 4, 8, 16 ... Saamme 20-bittisen sanan, jossa on 15 tietoa ja 5 ohjausbittiä. Aluksi ohjausbitit asetetaan nollaan. Kuvassa ohjausbitit on korostettu vaaleanpunaisella.
yksi | 2 | 3 | neljä | 5 | 6 | 7 | kahdeksan | 9 | kymmenen | yksitoista | 12 | 13 | neljätoista | viisitoista | 16 | 17 | kahdeksantoista | 19 | kaksikymmentä |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
r0_ _ | r1_ _ | x 1 | r2_ _ | x2_ _ | x 3 | x4 _ | r3_ _ | x5_ _ | x6 _ | x 7 | x 8 | x9_ _ | x 10 | x 11 | r4_ _ | x 12 | x 13 | x 14 | x 15 |
0 | 0 | yksi | 0 | 0 | 0 | yksi | 0 | 0 | 0 | yksi | 0 | yksi | yksi | yksi | 0 | 0 | 0 | 0 | yksi |
Yleensä koodisanan ohjausbittien lukumäärä on yhtä suuri kuin koodisanan bittien lukumäärää suuremman luvun binäärilogaritmi (mukaan lukien ohjausbitit); logaritmi pyöristetään ylöspäin. Esimerkiksi 1-bittinen tietosana vaatii kaksi tarkistusbittiä, 2-, 3- tai 4-bittinen informaatiosana kolme, 5...11-bittinen tietosana vaatii neljä, 12...26-bittinen tietosana bittitietosana vaatii viisi ja niin edelleen.
Lisätään taulukkoon 5 riviä (ohjausbittien lukumäärän mukaan), joihin sijoitetaan muunnosmatriisi. Jokainen rivi vastaa yhtä ohjausbittiä (nolla ohjausbitti on ylin rivi, neljäs on alempi), jokainen sarake vastaa yhtä bittiä koodatusta sanasta. Jokaiseen muunnosmatriisin sarakkeeseen sijoitamme tämän sarakkeen binääriluvun ja bittien järjestys käännetään - vähiten merkitsevä bitti sijoitetaan ylimmälle riville, merkittävin - alariville. Esimerkiksi matriisin kolmas sarake sisältää luvut 11000, mikä vastaa luvun kolme binääriesitystä: 00011.
yksi | 2 | 3 | neljä | 5 | 6 | 7 | kahdeksan | 9 | kymmenen | yksitoista | 12 | 13 | neljätoista | viisitoista | 16 | 17 | kahdeksantoista | 19 | kaksikymmentä | ||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
r0_ _ | r1_ _ | x 1 | r2_ _ | x2_ _ | x 3 | x4 _ | r3_ _ | x5_ _ | x6 _ | x 7 | x 8 | x9_ _ | x 10 | x 11 | r4_ _ | x 12 | x 13 | x 14 | x 15 | ||
0 | 0 | yksi | 0 | 0 | 0 | yksi | 0 | 0 | 0 | yksi | 0 | yksi | yksi | yksi | 0 | 0 | 0 | 0 | yksi | ||
yksi | 0 | yksi | 0 | yksi | 0 | yksi | 0 | yksi | 0 | yksi | 0 | yksi | 0 | yksi | 0 | yksi | 0 | yksi | 0 | r0_ _ | |
0 | yksi | yksi | 0 | 0 | yksi | yksi | 0 | 0 | yksi | yksi | 0 | 0 | yksi | yksi | 0 | 0 | yksi | yksi | 0 | r1_ _ | |
0 | 0 | 0 | yksi | yksi | yksi | yksi | 0 | 0 | 0 | 0 | yksi | yksi | yksi | yksi | 0 | 0 | 0 | 0 | yksi | r2_ _ | |
0 | 0 | 0 | 0 | 0 | 0 | 0 | yksi | yksi | yksi | yksi | yksi | yksi | yksi | yksi | 0 | 0 | 0 | 0 | 0 | r3_ _ | |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | yksi | yksi | yksi | yksi | yksi | r4_ _ |
Taulukon oikeaan osaan jäi tyhjäksi yksi sarake, johon sijoitamme ohjausbittien laskennan tulokset. Laskemme ohjausbitit seuraavasti: otamme yhden muunnosmatriisin riveistä (esimerkiksi ) ja etsimme sen skalaaritulon koodisanalla, eli kerromme molempien rivien vastaavat bitit ja löydämme Tuotteet. Jos summa osoittautui suuremmiksi kuin yksi, löydämme sen jaon jäännöksen 2:lla. Toisin sanoen lasketaan kuinka monta kertaa koodisanassa ja vastaavalla matriisin rivillä on yksiköitä samoissa paikoissa, ja ota tämä numero modulo 2.
Jos kuvaamme tätä prosessia matriisialgebran avulla, niin operaatio on muunnosmatriisin kertominen koodisanan matriisisarakkeella, jolloin tuloksena on ohjausbittien matriisisarake, joka on otettava modulo 2.
Esimerkiksi riville :
= (1 0+0 0+1 1+0 0+1 0+0 0+1 1+0 0+1 0+0 0+1 1+0 0+ 1 1+0 1+1 1+0 0+ 1 0+0 0+1 0+0 1) mod 2 = 5 mod 2 = 1.Tuloksena saadut ohjausbitit lisätään koodisanaan aiemmin siellä olleiden nollien sijaan. Analogisesti löydämme tarkistusbitit jäljellä olevilta riveiltä. Hamming-koodaus on valmis. Vastaanotettu koodisana on 11110010001011110001.
yksi | 2 | 3 | neljä | 5 | 6 | 7 | kahdeksan | 9 | kymmenen | yksitoista | 12 | 13 | neljätoista | viisitoista | 16 | 17 | kahdeksantoista | 19 | kaksikymmentä | ||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
r0_ _ | r1_ _ | x 1 | r2_ _ | x2_ _ | x 3 | x4 _ | r3_ _ | x5_ _ | x6 _ | x 7 | x 8 | x9_ _ | x 10 | x 11 | r4_ _ | x 12 | x 13 | x 14 | x 15 | ||
yksi | yksi | yksi | yksi | 0 | 0 | yksi | 0 | 0 | 0 | yksi | 0 | yksi | yksi | yksi | yksi | 0 | 0 | 0 | yksi | ||
yksi | 0 | yksi | 0 | yksi | 0 | yksi | 0 | yksi | 0 | yksi | 0 | yksi | 0 | yksi | 0 | yksi | 0 | yksi | 0 | r0_ _ | yksi |
0 | yksi | yksi | 0 | 0 | yksi | yksi | 0 | 0 | yksi | yksi | 0 | 0 | yksi | yksi | 0 | 0 | yksi | yksi | 0 | r1_ _ | yksi |
0 | 0 | 0 | yksi | yksi | yksi | yksi | 0 | 0 | 0 | 0 | yksi | yksi | yksi | yksi | 0 | 0 | 0 | 0 | yksi | r2_ _ | yksi |
0 | 0 | 0 | 0 | 0 | 0 | 0 | yksi | yksi | yksi | yksi | yksi | yksi | yksi | yksi | 0 | 0 | 0 | 0 | 0 | r3_ _ | 0 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | yksi | yksi | yksi | yksi | yksi | r4_ _ | yksi |
Hamming-dekoodausalgoritmi on täysin identtinen koodausalgoritmin kanssa. Vastaavan ulottuvuuden muunnosmatriisi kerrotaan koodisana-sarakematriisilla, ja tuloksena olevan sarakematriisin jokainen elementti otetaan modulo 2. Tuloksena olevaa sarakematriisia kutsutaan "syndroomatriisiksi". On helppo varmistaa, että edellisessä osiossa kuvatun algoritmin mukaisesti generoitu koodisana antaa aina nollasyndroomamatriisin.
Syndroomamatriisista tulee nollasta poikkeava, jos virheen seurauksena (esimerkiksi lähetettäessä sanaa kohinaisen viestintälinjan yli) jokin alkuperäisen sanan biteistä on muuttanut arvoaan. Oletetaan esimerkiksi, että edellisessä osiossa saadussa koodisanassa kuudes bitti on muuttanut arvonsa nollasta yhdeksi (merkitty kuvassa punaisella). Sitten saadaan seuraava oireyhtymämatriisi.
yksi | 2 | 3 | neljä | 5 | 6 | 7 | kahdeksan | 9 | kymmenen | yksitoista | 12 | 13 | neljätoista | viisitoista | 16 | 17 | kahdeksantoista | 19 | kaksikymmentä | ||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
r0_ _ | r1_ _ | x 1 | r2_ _ | x2_ _ | x 3 | x4 _ | r3_ _ | x5_ _ | x6 _ | x 7 | x 8 | x9_ _ | x 10 | x 11 | r4_ _ | x 12 | x 13 | x 14 | x 15 | ||
yksi | yksi | yksi | yksi | 0 | yksi | yksi | 0 | 0 | 0 | yksi | 0 | yksi | yksi | yksi | yksi | 0 | 0 | 0 | yksi | ||
yksi | 0 | yksi | 0 | yksi | 0 | yksi | 0 | yksi | 0 | yksi | 0 | yksi | 0 | yksi | 0 | yksi | 0 | yksi | 0 | s0_ _ | 0 |
0 | yksi | yksi | 0 | 0 | yksi | yksi | 0 | 0 | yksi | yksi | 0 | 0 | yksi | yksi | 0 | 0 | yksi | yksi | 0 | s 1 | yksi |
0 | 0 | 0 | yksi | yksi | yksi | yksi | 0 | 0 | 0 | 0 | yksi | yksi | yksi | yksi | 0 | 0 | 0 | 0 | yksi | s2_ _ | yksi |
0 | 0 | 0 | 0 | 0 | 0 | 0 | yksi | yksi | yksi | yksi | yksi | yksi | yksi | yksi | 0 | 0 | 0 | 0 | 0 | s3_ _ | 0 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | yksi | yksi | yksi | yksi | yksi | s4_ _ | 0 |
Huomaa, että yhdellä virheellä oireyhtymämatriisi on aina binääritietue (vähiten merkitsevä numero ylimmällä rivillä) paikan numerosta, jossa virhe tapahtui. Yllä olevassa esimerkissä oireyhtymämatriisi (01100) vastaa binaarilukua 00110 tai desimaalilukua 6, mikä tarkoittaa, että virhe tapahtui kuudennessa bitissä.
Hamming-koodia käytetään joissakin tallennussovelluksissa, erityisesti RAID 2 :ssa . Lisäksi Hamming-menetelmää on käytetty pitkään ECC -muistissa ja sen avulla voit korjata yksittäiset virheet ja havaita kaksoisvirheet lennossa.