Binär Hamming-kod | |
---|---|
Hamming kod med | |
Döpt efter | Richard Hamming |
Sorts | linjär blockkod |
Blocklängd | |
Meddelandets längd | |
Dela med sig | |
Distans | 3 |
Alfabetets storlek | 2 |
Beteckning | |
Mediafiler på Wikimedia Commons |
Hamming-koden är en självkontrollerande och självkorrigerande kod . Byggd med hänvisning till det binära talsystemet .
Låter dig korrigera ett enstaka fel (ett fel i en bit av ett ord) och hitta en dubbel [1] .
Uppkallad efter den amerikanske matematikern Richard Hamming som föreslog koden.
I mitten av 1940-talet skapades beräkningsmaskinen Bell Model V på Bell Laboratories . Det var en elektromekanisk maskin som använde reläblock, vars hastighet var mycket låg: en operation på några sekunder. Data matades in i maskinen med hjälp av hålkort med opålitliga läsenheter, så fel uppstod ofta under läsningsprocessen. På arbetsdagar användes speciella koder för att upptäcka och korrigera upptäckta fel, medan operatören fick reda på felet genom att lamporna sken, korrigerade och startade om maskinen. På helger när det inte fanns några operatörer, om ett fel inträffade, skulle maskinen automatiskt avsluta programmet och starta ett nytt.
Hamming jobbade ofta helger och blev alltmer irriterad då han var tvungen att ladda om sitt program på grund av hålkortsläsarens opålitlighet. I flera år letade han efter en effektiv felkorrigeringsalgoritm. 1950 publicerade han en kodningsmetod som kallas Hamming-koden.
Systematiska koder bildar en stor grupp av block, separerbara koder (där alla symboler i ett ord kan delas in i verifiering och information). En egenskap hos systematiska koder är att kontrollsymboler bildas som ett resultat av linjära logiska operationer på informationssymboler. Dessutom kan vilket tillåtet kodord som helst erhållas som ett resultat av linjära operationer på en uppsättning linjärt oberoende kodord.
Hammingkoder är självövervakningskoder, det vill säga koder som automatiskt upptäcker fel vid dataöverföring. För att bygga dem räcker det att tilldela ytterligare en (kontroll) binär siffra till varje ord och välja siffran för denna siffra så att det totala antalet enheter i bilden av valfritt tal är till exempel udda. Ett enstaka fel i valfri siffra i det överförda ordet (inklusive, kanske, i kontrollsiffran) kommer att ändra pariteten för det totala antalet enheter. Modulo 2-räknare, som räknar antalet ettor som finns bland de binära siffrorna i ett nummer, ger en signal om förekomsten av fel. I det här fallet är det omöjligt att veta i vilken position av ordet felet inträffade, och därför finns det inget sätt att korrigera det. Fel som uppstår samtidigt i två, fyra, etc. - i ett jämnt antal siffror förblir också obemärkta. Det antas att dubbla och ännu mer flera fel är osannolikt.
Koder där automatisk felkorrigering är möjlig kallas självkorrigerande. För att bygga en självkorrigerande kod utformad för att korrigera enstaka fel räcker det inte med en kontrollsiffra. Som framgår av det följande måste antalet styrbitar väljas så att olikheten eller är uppfylld , där är antalet binära informationsbitar i kodordet. Minimivärdena på k för givna värden på m, hittade i enlighet med denna olikhet, anges i tabellen.
Räckvidd m | kmin _ |
---|---|
ett | 2 |
2-4 | 3 |
5-11 | fyra |
12-26 | 5 |
27-57 | 6 |
Av störst intresse är binära blockkorrigeringskoder . Vid användning av sådana koder överförs information i form av block av samma längd, och varje block kodas och avkodas oberoende av det andra. I nästan alla blockkoder kan symboler delas upp i information och kontroll eller kontroll. Således är alla ord indelade i tillåtna (för vilka förhållandet mellan information och kontrolltecken är möjligt) och förbjudna.
Huvudegenskaper hos självkorrigerande koder:
Plotkin- gränsen ger en övre gräns för kodavståndet:
eller:
påHamming-gränsen anger det maximala antalet tillåtna kodkombinationer:
där är antalet kombinationer av element efter element. Härifrån kan du få ett uttryck för att uppskatta antalet checksymboler:För värden är skillnaden mellan Hamming-gränsen och Plotkin-gränsen liten.
Varshamov-Gilberts gräns för stort n definierar en nedre gräns för antalet checksymboler:
Alla ovanstående uppskattningar ger en uppfattning om den övre gränsen vid fasta och eller en lägre uppskattning av antalet checksymboler.
Konstruktionen av Hamming-koder är baserad på principen att kontrollera antalet enstaka tecken för paritet: ett sådant element läggs till sekvensen så att antalet enstaka tecken i den resulterande sekvensen är jämnt:
Tecknet här betyder modulo 2-tillägg :
Om - då finns det inget fel, om - då ett enda fel.
En sådan kod kallas eller . Den första siffran är antalet sekvenselement, den andra är antalet informationstecken.
För varje antal checksymboler finns det en klassisk Hamming-kod med markeringar:
det vill säga - .Med andra värden erhålls den så kallade trunkerade koden, till exempel den internationella telegrafkoden MTK-2, som har . Det kräver en Hamming-kod, som är en trunkerad version av klassikern
Tänk till exempel på den klassiska Hamming-koden . Låt oss gruppera bocksymbolerna enligt följande:
Att få kodordet ser ut så här:
= .Dekoderns ingång får ett kodord , där symboler är markerade med ett streck, vilket kan förvrängas till följd av störningar. I avkodaren i felkorrigeringsläget byggs en sekvens av syndrom:
kallas sekvenssyndromet.
Att få syndromet ser ut så här:
= .0 | 0 | 0 | 0 | 0 | 0 | 0 | ett | 0 | 0 | 0 | ett | 0 | ett |
0 | 0 | 0 | ett | 0 | ett | ett | ett | 0 | 0 | ett | ett | ett | 0 |
0 | 0 | ett | 0 | ett | ett | 0 | ett | 0 | ett | 0 | 0 | ett | ett |
0 | 0 | ett | ett | ett | 0 | ett | ett | 0 | ett | ett | 0 | 0 | 0 |
0 | ett | 0 | 0 | ett | ett | ett | ett | ett | 0 | 0 | 0 | ett | 0 |
0 | ett | 0 | ett | ett | 0 | 0 | ett | ett | 0 | ett | 0 | 0 | ett |
0 | ett | ett | 0 | 0 | 0 | ett | ett | ett | ett | 0 | ett | 0 | 0 |
0 | ett | ett | ett | 0 | ett | 0 | ett | ett | ett | ett | ett | ett | ett |
Kodorden för Hamming-koden anges i tabellen.
Syndromet indikerar att det inte finns någon förvrängning i sekvensen. Varje icke-noll-syndrom motsvarar ett visst felmönster, som korrigeras vid avkodningsstadiet.
Syndrom | 001 | 010 | 011 | 100 | 101 | 110 | 111 |
Felkonfiguration _ |
0000001 | 0000010 | 0001000 | 0000100 | 1000000 | 0010000 | 0100000 |
Symbolfel _ |
För koden i tabellen till höger anges syndrom som inte är noll och deras motsvarande felkonfigurationer (för formuläret: ).
Anta att vi behöver generera en Hamming-kod för något informationskodord. Låt oss ta ett 15-bitars kodord som exempel, även om algoritmen är lämplig för kodord av vilken längd som helst. I tabellen nedan ger den första raden positionsnumren i kodordet, den andra raden ger bitbeteckningen och den tredje raden ger bitvärdena.
ett | 2 | 3 | fyra | 5 | 6 | 7 | åtta | 9 | tio | elva | 12 | 13 | fjorton | femton |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
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 |
ett | 0 | 0 | ett | 0 | 0 | ett | 0 | ett | ett | ett | 0 | 0 | 0 | ett |
Låt oss infoga kontrollbitar i informationsordet på ett sådant sätt att deras positionsnummer är heltalpotenser av två: 1, 2, 4, 8, 16 ... Vi får ett 20-bitars ord med 15 information och 5 kontrollbitar. Initialt sätts styrbitarna till noll. I figuren är kontrollbitarna markerade i rosa.
ett | 2 | 3 | fyra | 5 | 6 | 7 | åtta | 9 | tio | elva | 12 | 13 | fjorton | femton | 16 | 17 | arton | 19 | tjugo |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
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 | ett | 0 | 0 | 0 | ett | 0 | 0 | 0 | ett | 0 | ett | ett | ett | 0 | 0 | 0 | 0 | ett |
I allmänhet är antalet kontrollbitar i ett kodord lika med den binära logaritmen för ett nummer ett större än antalet bitar i kodordet (inklusive kontrollbitar); logaritmen avrundas uppåt. Till exempel kräver ett 1-bitars informationsord två kontrollbitar, ett 2-, 3- eller 4-bitars informationsord kräver tre, ett 5...11-bitars informationsord kräver fyra, ett 12...26- bitinformationsord kräver fem, och så vidare.
Låt oss lägga till 5 rader i tabellen (enligt antalet kontrollbitar), där vi kommer att placera transformationsmatrisen. Varje rad kommer att motsvara en kontrollbit (nollkontrollbiten är den översta raden, den fjärde är den nedersta), varje kolumn kommer att motsvara en bit av det kodade ordet. I varje kolumn i transformationsmatrisen placerar vi det binära numret för denna kolumn, och ordningen på bitarna kommer att omvändas - den minst signifikanta biten kommer att placeras på den översta raden, den mest signifikanta - i botten. Till exempel kommer den tredje kolumnen i matrisen att innehålla siffrorna 11000, vilket motsvarar den binära representationen av talet tre: 00011.
ett | 2 | 3 | fyra | 5 | 6 | 7 | åtta | 9 | tio | elva | 12 | 13 | fjorton | femton | 16 | 17 | arton | 19 | tjugo | ||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
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 | ett | 0 | 0 | 0 | ett | 0 | 0 | 0 | ett | 0 | ett | ett | ett | 0 | 0 | 0 | 0 | ett | ||
ett | 0 | ett | 0 | ett | 0 | ett | 0 | ett | 0 | ett | 0 | ett | 0 | ett | 0 | ett | 0 | ett | 0 | r0 _ | |
0 | ett | ett | 0 | 0 | ett | ett | 0 | 0 | ett | ett | 0 | 0 | ett | ett | 0 | 0 | ett | ett | 0 | r1 _ | |
0 | 0 | 0 | ett | ett | ett | ett | 0 | 0 | 0 | 0 | ett | ett | ett | ett | 0 | 0 | 0 | 0 | ett | r2 _ | |
0 | 0 | 0 | 0 | 0 | 0 | 0 | ett | ett | ett | ett | ett | ett | ett | ett | 0 | 0 | 0 | 0 | 0 | r3 _ | |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ett | ett | ett | ett | ett | r4 _ |
I den högra delen av tabellen lämnades en kolumn tom, där vi placerar resultaten av beräkningen av kontrollbitarna. Vi beräknar kontrollbitarna enligt följande: vi tar en av raderna i transformationsmatrisen (till exempel ) och hittar dess skalära produkt med kodordet, det vill säga vi multiplicerar motsvarande bitar i båda raderna och hittar summan av Produkter. Om summan visade sig vara större än ett, hittar vi resten av dess division med 2. Med andra ord, vi räknar hur många gånger det finns enheter på samma positioner i kodordet och motsvarande rad i matrisen, och ta detta nummer modulo 2.
Om vi beskriver denna process i termer av matrisalgebra, är operationen en multiplikation av transformationsmatrisen med kodordets matriskolumn, vilket resulterar i en matriskolumn av kontrollbitar, som måste tas modulo 2.
Till exempel för raden :
= (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.De resulterande kontrollbitarna infogas i kodordet istället för de nollor som fanns där tidigare. I analogi finner vi kontrollbitarna i de återstående raderna. Hamming-kodningen är klar. Det mottagna kodordet är 11110010001011110001.
ett | 2 | 3 | fyra | 5 | 6 | 7 | åtta | 9 | tio | elva | 12 | 13 | fjorton | femton | 16 | 17 | arton | 19 | tjugo | ||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
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 | ||
ett | ett | ett | ett | 0 | 0 | ett | 0 | 0 | 0 | ett | 0 | ett | ett | ett | ett | 0 | 0 | 0 | ett | ||
ett | 0 | ett | 0 | ett | 0 | ett | 0 | ett | 0 | ett | 0 | ett | 0 | ett | 0 | ett | 0 | ett | 0 | r0 _ | ett |
0 | ett | ett | 0 | 0 | ett | ett | 0 | 0 | ett | ett | 0 | 0 | ett | ett | 0 | 0 | ett | ett | 0 | r1 _ | ett |
0 | 0 | 0 | ett | ett | ett | ett | 0 | 0 | 0 | 0 | ett | ett | ett | ett | 0 | 0 | 0 | 0 | ett | r2 _ | ett |
0 | 0 | 0 | 0 | 0 | 0 | 0 | ett | ett | ett | ett | ett | ett | ett | ett | 0 | 0 | 0 | 0 | 0 | r3 _ | 0 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ett | ett | ett | ett | ett | r4 _ | ett |
Hamming-avkodningsalgoritmen är helt identisk med kodningsalgoritmen. Transformationsmatrisen för motsvarande dimension multipliceras med kodordets kolumnmatris, och varje element i den resulterande kolumnmatrisen tas modulo 2. Den resulterande kolumnmatrisen kallas "syndrommatrisen". Det är lätt att verifiera att ett kodord genererat i enlighet med algoritmen som beskrivs i föregående avsnitt alltid ger en nollsyndrommatris.
Syndrommatrisen blir icke-noll om, som ett resultat av ett fel (till exempel vid sändning av ett ord över en brusig kommunikationslinje), en av bitarna i det ursprungliga ordet har ändrat sitt värde. Anta till exempel att i kodordet som erhölls i föregående avsnitt har den sjätte biten ändrat sitt värde från noll till ett (indikeras med rött i figuren). Då får vi följande matris av syndrom.
ett | 2 | 3 | fyra | 5 | 6 | 7 | åtta | 9 | tio | elva | 12 | 13 | fjorton | femton | 16 | 17 | arton | 19 | tjugo | ||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
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 | ||
ett | ett | ett | ett | 0 | ett | ett | 0 | 0 | 0 | ett | 0 | ett | ett | ett | ett | 0 | 0 | 0 | ett | ||
ett | 0 | ett | 0 | ett | 0 | ett | 0 | ett | 0 | ett | 0 | ett | 0 | ett | 0 | ett | 0 | ett | 0 | s0 _ | 0 |
0 | ett | ett | 0 | 0 | ett | ett | 0 | 0 | ett | ett | 0 | 0 | ett | ett | 0 | 0 | ett | ett | 0 | s 1 | ett |
0 | 0 | 0 | ett | ett | ett | ett | 0 | 0 | 0 | 0 | ett | ett | ett | ett | 0 | 0 | 0 | 0 | ett | s2 _ | ett |
0 | 0 | 0 | 0 | 0 | 0 | 0 | ett | ett | ett | ett | ett | ett | ett | ett | 0 | 0 | 0 | 0 | 0 | s3 _ | 0 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ett | ett | ett | ett | ett | s4 _ | 0 |
Observera att med ett enda fel är syndrommatrisen alltid en binär post (den minst signifikanta siffran i den översta raden) av positionsnumret där felet inträffade. I exemplet ovan motsvarar syndrommatrisen (01100) det binära talet 00110 eller decimal 6, vilket innebär att felet inträffade i den sjätte biten.
Hamming-kod används i vissa lagringsapplikationer, särskilt RAID 2 . Dessutom har Hamming-metoden länge använts i ECC- minnet och låter dig korrigera enstaka fel och upptäcka dubbla fel i farten.