Binární Hammingův kód | |
---|---|
| |
Pojmenoval podle | Richard Hamming |
Typ | lineární blokový kód |
Délka bloku | |
Délka zprávy | |
podíl | |
Vzdálenost | 3 |
Velikost abecedy | 2 |
Označení | |
Mediální soubory na Wikimedia Commons |
Hammingův kód je samokontrolující a samoopravující kód . Postaveno s odkazem na binární číselný systém .
Umožňuje opravit jednu chybu (chybu v jednom bitu slova) a najít dvojitou [1] .
Pojmenován po americkém matematikovi Richardu Hammingovi , který kód navrhl.
V polovině 40. let 20. století byl v Bellových laboratořích vytvořen počítací stroj Bell Model V. Byl to elektromechanický stroj využívající reléové bloky, jehož rychlost byla velmi nízká: jedna operace za pár sekund. Data byla do stroje zadávána pomocí děrných štítků s nespolehlivými čtecími zařízeními, takže během procesu čtení často docházelo k chybám. V pracovní dny byly k detekci a opravě nalezených chyb používány speciální kódy, přičemž obsluha se o chybě dozvěděla podle svitu kontrolek, opravila a restartovala stroj. O víkendech, kdy nebyli žádní operátoři, pokud došlo k chybě, stroj automaticky ukončí program a spustí jiný.
Hamming často pracoval o víkendech a byl čím dál tím otrávenější, když musel znovu načíst svůj program kvůli nespolehlivosti čtečky děrných štítků. Několik let hledal účinný algoritmus opravy chyb. V roce 1950 publikoval metodu kódování známou jako Hammingův kód.
Systematické kódy tvoří velkou skupinu blokových, oddělitelných kódů (ve kterých lze všechny symboly slova rozdělit na ověřovací a informační). Charakteristickým rysem systematických kódů je, že kontrolní symboly se tvoří jako výsledek lineárních logických operací s informačními symboly. Kromě toho může být jakékoli povolené kódové slovo získáno jako výsledek lineárních operací na sadě lineárně nezávislých kódových slov.
Hammingovy kódy jsou samokontrolující kódy, tedy kódy, které automaticky detekují chyby při přenosu dat. K jejich sestavení stačí ke každému slovu přiřadit jednu další (řídicí) dvojkovou číslici a zvolit číslici této číslice tak, aby celkový počet jednotek v obrázku libovolného čísla byl např. lichý. Jediná chyba v libovolné číslici přenášeného slova (možná včetně kontrolní číslice) změní paritu celkového počtu jednotek. Čítače Modulo 2, počítající počet jedniček, které jsou obsaženy mezi binárními číslicemi čísla, dávají signál o přítomnosti chyb. V tomto případě není možné zjistit, na jaké pozici slova se chyba vyskytla, a proto neexistuje způsob, jak ji opravit. Chyby, které se vyskytují současně ve dvou, čtyřech atd. - v sudém počtu číslic, také zůstávají bez povšimnutí. Předpokládá se, že dvojité a ještě více vícenásobné chyby jsou nepravděpodobné.
Kódy, ve kterých je možná automatická oprava chyb, se nazývají samoopravné. K vytvoření samoopravného kódu určeného k opravě jednotlivých chyb nestačí jedna kontrolní číslice. Jak je patrné z následujícího, počet řídicích bitů musí být zvolen tak, aby byla splněna nerovnost nebo , kde je počet informačních binárních bitů kódového slova. Minimální hodnoty k pro dané hodnoty m, nalezené v souladu s touto nerovností, jsou uvedeny v tabulce.
Rozsah m | km _ |
---|---|
jeden | 2 |
2-4 | 3 |
5-11 | čtyři |
12-26 | 5 |
27-57 | 6 |
Největší zájem je o binární blokové korekční kódy . Při použití takových kódů jsou informace přenášeny ve formě bloků stejné délky a každý blok je zakódován a dekódován nezávisle na druhém. Téměř ve všech blokových kódech lze symboly rozdělit na informační a kontrolní nebo kontrolní. Všechna slova jsou tedy rozdělena na povolená (u kterých je poměr informačních a kontrolních znaků možný) a zakázaná.
Hlavní vlastnosti samoopravných kódů:
Plotkinova hranice udává horní hranici vzdálenosti kódu:
nebo:
vHammingův limit nastavuje maximální možný počet povolených kombinací kódů:
kde je počet kombinací prvků podle prvků. Odtud můžete získat výraz pro odhad počtu kontrolních symbolů:U hodnot je rozdíl mezi Hammingovou a Plotkinovou hranicí malý.
Varshamov-Gilbertova mez pro velké n definuje dolní mez počtu kontrolních symbolů:
Všechny výše uvedené odhady poskytují představu o horní hranici při pevném a nebo dolním odhadu počtu kontrolních symbolů.
Konstrukce Hammingových kódů je založena na principu kontroly počtu jednotlivých znaků na paritu: takový prvek je přidán do sekvence tak, aby počet jednotlivých znaků ve výsledné sekvenci byl sudý:
Znaménko zde znamená přidání modulu 2 :
Pokud - pak není žádná chyba, pokud - pak jediná chyba.
Takový kód se nazývá nebo . První číslo je počet prvků sekvence, druhé je počet informačních znaků.
Pro každý počet kontrolních symbolů existuje klasický Hammingův kód se značkami:
to je - .S jinými hodnotami se získá tzv. zkrácený kód, např. mezinárodní telegrafní kód MTK-2, který má . Vyžaduje Hammingův kód, což je zkrácená verze klasiky
Vezměme si například klasický Hammingův kód . Seskupíme kontrolní symboly následovně:
Získání kódového slova vypadá takto:
= .Vstup dekodéru přijímá kódové slovo , kde jsou symboly označeny čárou, která může být v důsledku interference zkreslená. V dekodéru v režimu opravy chyb je vytvořena sekvence syndromů:
nazývaný sekvenční syndrom.
Získání syndromu vypadá takto:
= .0 | 0 | 0 | 0 | 0 | 0 | 0 | jeden | 0 | 0 | 0 | jeden | 0 | jeden |
0 | 0 | 0 | jeden | 0 | jeden | jeden | jeden | 0 | 0 | jeden | jeden | jeden | 0 |
0 | 0 | jeden | 0 | jeden | jeden | 0 | jeden | 0 | jeden | 0 | 0 | jeden | jeden |
0 | 0 | jeden | jeden | jeden | 0 | jeden | jeden | 0 | jeden | jeden | 0 | 0 | 0 |
0 | jeden | 0 | 0 | jeden | jeden | jeden | jeden | jeden | 0 | 0 | 0 | jeden | 0 |
0 | jeden | 0 | jeden | jeden | 0 | 0 | jeden | jeden | 0 | jeden | 0 | 0 | jeden |
0 | jeden | jeden | 0 | 0 | 0 | jeden | jeden | jeden | jeden | 0 | jeden | 0 | 0 |
0 | jeden | jeden | jeden | 0 | jeden | 0 | jeden | jeden | jeden | jeden | jeden | jeden | jeden |
Kódová slova Hammingova kódu jsou uvedena v tabulce.
Syndrom naznačuje, že v sekvenci není žádné zkreslení. Každý nenulový syndrom odpovídá určitému chybovému vzoru, který je opraven ve fázi dekódování.
Syndrom | 001 | 010 | 011 | 100 | 101 | 110 | 111 |
Chyba konfigurace |
0000001 | 0000010 | 0001000 | 0000100 | 1000000 | 0010000 | 0100000 |
Chyba symbolu |
U kódu v tabulce vpravo jsou uvedeny nenulové syndromy a jim odpovídající chybové konfigurace (pro tvar: ).
Předpokládejme, že potřebujeme vygenerovat Hammingův kód pro nějaké informační kódové slovo. Vezměme si jako příklad 15bitové kódové slovo, ačkoliv je algoritmus vhodný pro kódová slova libovolné délky. V níže uvedené tabulce jsou na prvním řádku uvedena čísla pozic v kódovém slově, na druhém řádku je označení bitu a na třetím řádku jsou uvedeny hodnoty bitů.
jeden | 2 | 3 | čtyři | 5 | 6 | 7 | osm | 9 | deset | jedenáct | 12 | 13 | čtrnáct | patnáct |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
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 |
jeden | 0 | 0 | jeden | 0 | 0 | jeden | 0 | jeden | jeden | jeden | 0 | 0 | 0 | jeden |
Vložme řídicí bity do informačního slova tak, že jejich poziční čísla jsou celočíselné mocniny dvou: 1, 2, 4, 8, 16 ... Získáme 20bitové slovo s 15 informačními a 5 řídicími bity. Zpočátku jsou řídicí bity nastaveny na nulu. Na obrázku jsou kontrolní bity zvýrazněny růžově.
jeden | 2 | 3 | čtyři | 5 | 6 | 7 | osm | 9 | deset | jedenáct | 12 | 13 | čtrnáct | patnáct | 16 | 17 | osmnáct | 19 | dvacet |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
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 | jeden | 0 | 0 | 0 | jeden | 0 | 0 | 0 | jeden | 0 | jeden | jeden | jeden | 0 | 0 | 0 | 0 | jeden |
Obecně je počet řídicích bitů v kódovém slově roven binárnímu logaritmu čísla o jednu větší, než je počet bitů v kódovém slově (včetně řídicích bitů); logaritmus se zaokrouhlí nahoru. Například 1bitové informační slovo vyžaduje dva kontrolní bity, 2-, 3- nebo 4bitové informační slovo vyžaduje tři, 5...11bitové informační slovo vyžaduje čtyři, 12...26- bitové informační slovo vyžaduje pět a tak dále.
Do tabulky přidáme 5 řádků (podle počtu řídicích bitů), do kterých umístíme transformační matici. Každý řádek bude odpovídat jednomu řídicímu bitu (nulový řídicí bit je horní řádek, čtvrtý je dolní), každý sloupec bude odpovídat jednomu bitu kódovaného slova. Do každého sloupce transformační matice umístíme binární číslo tohoto sloupce a pořadí bitů se obrátí - nejméně významný bit bude umístěn v horním řádku, nejvýznamnější - v dolní. Například třetí sloupec matice bude obsahovat čísla 11000, což odpovídá binárnímu vyjádření čísla tři: 00011.
jeden | 2 | 3 | čtyři | 5 | 6 | 7 | osm | 9 | deset | jedenáct | 12 | 13 | čtrnáct | patnáct | 16 | 17 | osmnáct | 19 | dvacet | ||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
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 | jeden | 0 | 0 | 0 | jeden | 0 | 0 | 0 | jeden | 0 | jeden | jeden | jeden | 0 | 0 | 0 | 0 | jeden | ||
jeden | 0 | jeden | 0 | jeden | 0 | jeden | 0 | jeden | 0 | jeden | 0 | jeden | 0 | jeden | 0 | jeden | 0 | jeden | 0 | r0 _ | |
0 | jeden | jeden | 0 | 0 | jeden | jeden | 0 | 0 | jeden | jeden | 0 | 0 | jeden | jeden | 0 | 0 | jeden | jeden | 0 | r1 _ | |
0 | 0 | 0 | jeden | jeden | jeden | jeden | 0 | 0 | 0 | 0 | jeden | jeden | jeden | jeden | 0 | 0 | 0 | 0 | jeden | r2 _ | |
0 | 0 | 0 | 0 | 0 | 0 | 0 | jeden | jeden | jeden | jeden | jeden | jeden | jeden | jeden | 0 | 0 | 0 | 0 | 0 | r3 _ | |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | jeden | jeden | jeden | jeden | jeden | r4 _ |
V pravé části tabulky zůstal prázdný jeden sloupec, do kterého umístíme výsledky výpočtu kontrolních bitů. Řídicí bity vypočítáme následovně: vezmeme jeden z řádků transformační matice (například ) a najdeme jeho skalární součin s kódovým slovem, to znamená, že vynásobíme odpovídající bity obou řádků a zjistíme součet produkty. Pokud se ukáže, že součet je větší než jedna, zjistíme zbytek jeho dělení 2. Jinými slovy, spočítáme, kolikrát jsou jednotky na stejných pozicích v kódovém slově a odpovídajícím řádku matice a vezměte toto číslo modulo 2.
Pokud tento proces popíšeme z hlediska maticové algebry, pak operace je vynásobením transformační matice maticovým sloupcem kódového slova, výsledkem je maticový sloupec řídicích bitů, který je třeba vzít modulo 2.
Například pro řádek :
= (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.Výsledné řídicí bity jsou vloženy do kódového slova namísto nul, které tam byly dříve. Analogicky najdeme kontrolní bity ve zbývajících řádcích. Hammingovo kódování je dokončeno. Přijaté kódové slovo je 11110010001011110001.
jeden | 2 | 3 | čtyři | 5 | 6 | 7 | osm | 9 | deset | jedenáct | 12 | 13 | čtrnáct | patnáct | 16 | 17 | osmnáct | 19 | dvacet | ||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
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 | ||
jeden | jeden | jeden | jeden | 0 | 0 | jeden | 0 | 0 | 0 | jeden | 0 | jeden | jeden | jeden | jeden | 0 | 0 | 0 | jeden | ||
jeden | 0 | jeden | 0 | jeden | 0 | jeden | 0 | jeden | 0 | jeden | 0 | jeden | 0 | jeden | 0 | jeden | 0 | jeden | 0 | r0 _ | jeden |
0 | jeden | jeden | 0 | 0 | jeden | jeden | 0 | 0 | jeden | jeden | 0 | 0 | jeden | jeden | 0 | 0 | jeden | jeden | 0 | r1 _ | jeden |
0 | 0 | 0 | jeden | jeden | jeden | jeden | 0 | 0 | 0 | 0 | jeden | jeden | jeden | jeden | 0 | 0 | 0 | 0 | jeden | r2 _ | jeden |
0 | 0 | 0 | 0 | 0 | 0 | 0 | jeden | jeden | jeden | jeden | jeden | jeden | jeden | jeden | 0 | 0 | 0 | 0 | 0 | r3 _ | 0 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | jeden | jeden | jeden | jeden | jeden | r4 _ | jeden |
Hammingův dekódovací algoritmus je naprosto identický s kódovacím algoritmem. Transformační matice odpovídajícího rozměru se vynásobí sloupcovou maticí kódového slova a každý prvek výsledné sloupcové matice se vezme modulo 2. Výsledná sloupcová matice se nazývá „matice syndromu“. Je snadné ověřit, že kódové slovo generované v souladu s algoritmem popsaným v předchozí části vždy poskytuje matici nulového syndromu.
Matice syndromu se stane nenulovou, pokud v důsledku chyby (například při přenosu slova po zašuměné komunikační lince) jeden z bitů původního slova změnil svou hodnotu. Předpokládejme například, že v kódovém slově získaném v předchozí části šestý bit změnil svou hodnotu z nuly na jednu (na obrázku je označena červeně). Pak dostaneme následující matici syndromů.
jeden | 2 | 3 | čtyři | 5 | 6 | 7 | osm | 9 | deset | jedenáct | 12 | 13 | čtrnáct | patnáct | 16 | 17 | osmnáct | 19 | dvacet | ||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
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 | ||
jeden | jeden | jeden | jeden | 0 | jeden | jeden | 0 | 0 | 0 | jeden | 0 | jeden | jeden | jeden | jeden | 0 | 0 | 0 | jeden | ||
jeden | 0 | jeden | 0 | jeden | 0 | jeden | 0 | jeden | 0 | jeden | 0 | jeden | 0 | jeden | 0 | jeden | 0 | jeden | 0 | s0 _ | 0 |
0 | jeden | jeden | 0 | 0 | jeden | jeden | 0 | 0 | jeden | jeden | 0 | 0 | jeden | jeden | 0 | 0 | jeden | jeden | 0 | s 1 | jeden |
0 | 0 | 0 | jeden | jeden | jeden | jeden | 0 | 0 | 0 | 0 | jeden | jeden | jeden | jeden | 0 | 0 | 0 | 0 | jeden | s2 _ | jeden |
0 | 0 | 0 | 0 | 0 | 0 | 0 | jeden | jeden | jeden | jeden | jeden | jeden | jeden | jeden | 0 | 0 | 0 | 0 | 0 | s3 _ | 0 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | jeden | jeden | jeden | jeden | jeden | s4 _ | 0 |
Všimněte si, že s jedinou chybou je matice syndromu vždy binárním záznamem (nejméně významná číslice v horním řádku) čísla pozice, ve které k chybě došlo. Ve výše uvedeném příkladu matice syndromu (01100) odpovídá binárnímu číslu 00110 nebo desítkové 6, což znamená, že k chybě došlo v šestém bitu.
Hammingův kód se používá v některých úložných aplikacích, zejména RAID 2 . Kromě toho se Hammingova metoda již dlouho používá v paměti ECC a umožňuje opravit jednotlivé chyby a detekovat dvojité chyby za chodu.