Strona główna Algorytmy i Struktury Danych Kody Hamminga

⚙️ Kody Hamminga

Odwróć bit w słowie zakodowanym Hammingiem i obserwuj, jak kontrole parzystości dają syndrom wskazujący dokładnie pozycję błędu.

Algorytmy i Struktury Danych2DŁatwy60 FPS
hamming-codes ↗ Otwórz osobno
Interfejs samej symulacji jest w języku angielskim.

O kodach Hamminga SECDED

Kody Hamminga to rodzina liniowych kodów korekcyjnych, wynaleziona przez Richarda Hamminga w Bell Labs w 1950 roku. Kod Hamming(7,4) koduje 4 bity danych w 7-bitowe słowo kodowe, dodając 3 bity parzystości umieszczone na pozycjach będących potęgami dwójki (1, 2, 4); każdy bit parzystości obejmuje konkretny podzbiór pozycji bitów danych, zdefiniowany przez kolumny macierzy kontroli parzystości H. Taki układ nadaje kodowi minimalną odległość Hamminga równą 3, co gwarantuje, że może skorygować dowolny pojedynczy błąd bitu i wykryć dowolny błąd dwubitowy. Dodanie jednego ogólnego bitu parzystości daje kod SECDED (Single-Error Correcting, Double-Error Detecting) Hamming(8,4), stosowany w pamięci ECC RAM, gdzie odwrócony bit pamięci jest automatycznie korygowany przy każdym odczycie pamięci.

Symulator pozwala wprowadzać 4-bitowe słowa danych, obserwować, jak macierz kontroli parzystości koduje je w 7- lub 8-bitowe słowa kodowe, wprowadzać pojedyncze lub podwójne odwrócenia bitów oraz obserwować dekodowanie syndromowe: wektor syndromu s = H·r (mod 2) wskazuje bezpośrednio pozycję błędnego bitu, umożliwiając automatyczną korekcję w jednym kroku.

Najczęściej zadawane pytania

Jak dekodowanie syndromowe lokalizuje pojedynczy błąd bitu?

Po odebraniu słowa kodowego r dekoder oblicza syndrom s = H·r (mod 2), gdzie H to macierz kontroli parzystości. Jeśli s = 0, nie wykryto błędu. Jeśli s ≠ 0, jest on równy jednej z kolumn H; pozycja tej kolumny wskazuje bit do odwrócenia. Dla Hamming(7,4) syndrom to 3-bitowa liczba binarna równa bezpośrednio indeksowi (liczonemu od 1) błędnego bitu, co czyni korekcję niezwykle szybką w sprzęcie.

Czym jest odległość Hamminga i dlaczego jest ważna?

Odległość Hamminga między dwoma słowami kodowymi to liczba pozycji bitów, na których się różnią. Kod o minimalnej odległości Hamminga d_min może wykryć do d_min − 1 błędów i skorygować do ⌊(d_min − 1)/2⌋ błędów. Hamming(7,4) ma d_min = 3, więc koryguje 1 błąd i wykrywa 2. Aby skorygować t błędów, potrzeba d_min ≥ 2t + 1; minimalna długość słowa kodowego rośnie wtedy jak O(t log n) zgodnie z granicą Hamminga (granicą upakowania sfer).

Czym jest pamięć ECC RAM i jak wykorzystuje kody Hamminga?

Pamięć ECC (Error-Correcting Code) wykorzystuje schemat SECDED Hamminga dla każdego 64-bitowego słowa pamięci, dodając 8 bitów kontrolnych (72 bity przechowywane na słowo). Przy każdym odczycie słowa syndrom jest obliczany sprzętowo; pojedynczy błąd bitu jest korygowany w sposób przezroczysty w jednym cyklu pamięci (~60 ns na DDR5) bez udziału oprogramowania. Pamięć ECC jest standardem w serwerach i stacjach roboczych, gdzie ciche uszkodzenie danych mogłoby zagrozić obliczeniom finansowym, medycznym lub naukowym.

Dlaczego bity parzystości umieszczane są na pozycjach będących potęgami dwójki?

W konstrukcji Hamminga bit parzystości na pozycji 2ᵏ obejmuje wszystkie pozycje bitowe, których reprezentacja binarna ma 1 na k-tym bicie. Na przykład bit parzystości 1 (pozycja 001₂) obejmuje pozycje 1, 3, 5, 7 (wszystkie pozycje z ustawionym bitem 0). Zapewnia to, że każda pozycja danych jest objęta unikalnym, niepustym podzbiorem bitów parzystości, dzięki czemu syndrom jednoznacznie identyfikuje pozycję dowolnego pojedynczego błędu. Umieszczenie na potęgach dwójki czyni tę strukturę podzbiorów elegancką i wydajną.

Jaka jest różnica między Hamming(7,4) a Hamming(8,4) SECDED?

Hamming(7,4) używa 3 bitów parzystości na 4 bity danych i koryguje 1 błąd (d_min = 3). Dodanie czwartego, ogólnego bitu parzystości (XOR wszystkich 7 bitów) tworzy Hamming(8,4), który wykrywa podwójne błędy, zauważając, kiedy syndrom jest niezerowy, ale ogólna parzystość się zgadza — co sygnalizuje wzorzec błędu 2-bitowego. Ta właściwość SECDED jest kluczowa dla systemów pamięci, gdzie dwa błędy są rzadkie, ale możliwe podczas zdarzeń promieniowania kosmicznego lub wielokomórkowych zaburzeń.

Czym są kody Reeda-Solomona i jak wypadają w porównaniu?

Kody Reeda-Solomona operują na większych alfabetach (symbolach po k bitów, a nie pojedynczych bitach) i mogą korygować wiele błędów symboli. Kod Reed-Solomon(255,223) (używany w płytach CD, DVD, kodach QR i komunikacji dalekiego kosmosu) koryguje do 16 błędów symboli na blok 255-symbolowy. O ile kody Hamminga są optymalne do korekcji pojedynczych błędów bitowych przy minimalnej redundancji, o tyle Reed-Solomon jest znacznie potężniejszy dla błędów seryjnych (burst) i jest preferowany w przechowywaniu danych oraz komunikacji satelitarnej.

Czym jest granica Hamminga (granica upakowania sfer)?

Granica Hamminga mówi, że dla kodu binarnego o długości n korygującego t błędów, liczba słów kodowych M spełnia M · Σᵢ₌₀ᵗ C(n,i) ≤ 2ⁿ. Kody osiągające równość nazywane są kodami doskonałymi; kody Hamminga są doskonałe (ich sfery błędów o promieniu 1 dzielą całą przestrzeń n-bitową bez luk). Jedynymi innymi doskonałymi kodami binarnymi są trywialny kod powtórzeniowy oraz kod Golaya (23,12).

Jak kody Hamminga są wykorzystywane poza pamięcią RAM?

Kody Hamminga pojawiają się w telemetrii satelitarnej (ochrona łączy dowodzenia), ECC pamięci NAND flash (choć do korekcji wielobitowej częściej stosuje się kody BCH), wczesnych modemach transmisji danych, taśmach magnetycznych oraz nagłówkach protokołów sieciowych. Hamming(7,4) jest też klasycznym przykładem dydaktycznym w kursach teorii informacji i algebraicznej teorii kodowania, ilustrującym potęgę algebry liniowej nad GF(2).

Co się dzieje przy dwóch jednoczesnych błędach bitów w Hamming(7,4)?

Przy samej tylko korekcji pojedynczego błędu (bez ogólnego bitu parzystości) błąd 2-bitowy generuje niezerowy syndrom, który pasuje do jakiejś kolumny H — ale do niewłaściwej. Dekoder „koryguje” niewłaściwy bit, wprowadzając trzeci błąd i po cichu uszkadzając dane. SECDED (8,4) temu zapobiega: ogólny bit parzystości odróżnia błędy 1-bitowe (niezgodność parzystości nieparzystej + niezerowy syndrom) od błędów 2-bitowych (niezgodność parzystości parzystej + niezerowy syndrom), oznaczając te drugie zamiast błędnie je korygować.

Najczęściej zadawane pytania

Czym jest kod Hamminga?
Kod Hamminga to liniowy kod korekcyjny wynaleziony przez Richarda Hamminga w 1950 roku. Dodaje redundantne bity parzystości do słowa danych, dzięki czemu dowolny pojedynczy błąd bitu może zostać wykryty i skorygowany. Hamming(7,4) koduje 4 bity danych w 7-bitowe słowo kodowe za pomocą 3 bitów parzystości umieszczonych na pozycjach będących potęgami 2.
Jak działa dekodowanie syndromowe?
Po odebraniu słowa kodowego dekoder mnoży je przez macierz kontroli parzystości H, otrzymując wektor syndromu s = H·r mod 2. Jeśli s = 0, nie ma błędów. Jeśli s jest niezerowy, jego wartość binarna wskazuje bezpośrednio pozycję błędnego bitu, który następnie jest odwracany w celu korekcji błędu.
Czym jest SECDED i dlaczego ma to znaczenie?
SECDED oznacza Single Error Correct, Double Error Detect (korekcja pojedynczego błędu, wykrywanie podwójnego). Rozszerza Hamming(7,4) do Hamming(8,4), dodając ogólny bit parzystości. Dodatkowy bit zwiększa minimalną odległość Hamminga z 3 do 4, umożliwiając korekcję dowolnego pojedynczego błędu bitu przy jednoczesnym wykrywaniu (ale nie korygowaniu) dowolnego błędu dwubitowego. Pamięć ECC RAM w serwerach wykorzystuje SECDED do ochrony przed odwróceniami bitów spowodowanymi promieniowaniem kosmicznym lub wahaniami napięcia.
Gdzie w praktyce wykorzystywane są kody Hamminga?
Kody Hamminga są używane w pamięci ECC RAM stosowanej w serwerach i stacjach roboczych, w łączach komunikacji satelitarnej, w kontrolerach pamięci DRAM, w niektórych systemach pamięci NAND flash oraz historycznie w telekomunikacji. Stanowią koncepcyjną podstawę dla bardziej zaawansowanych kodów, takich jak Reed-Solomon i kody turbo.
Dlaczego bity parzystości umieszczane są na pozycjach będących potęgami 2?
Pozycje 1, 2, 4, 8, … (potęgi 2) są wybierane tak, by każdy bit parzystości obejmował unikalny podzbiór pozycji danych, zdefiniowany przez odpowiadający mu bit binarnego numeru pozycji. Zapewnia to, że syndrom dowolnego pojedynczego błędu bitu bezpośrednio koduje pozycję błędu w postaci binarnej, co umożliwia prostą korekcję bez tablicy przeglądowej.
Czym jest odległość Hamminga?
Odległość Hamminga między dwoma ciągami binarnymi to liczba pozycji, na których się różnią. Minimalna odległość Hamminga d_min kodu determinuje jego moc korekcji błędów: kod może skorygować do floor((d_min-1)/2) błędów i wykryć do d_min-1 błędów. Hamming(7,4) ma d_min = 3, więc koryguje 1 błąd; SECDED ma d_min = 4, korygując 1 i wykrywając 2.
Jaki jest współczynnik kodowania Hamming(7,4)?
Współczynnik kodowania to stosunek bitów danych do wszystkich bitów słowa kodowego. Dla Hamming(7,4) współczynnik wynosi 4/7 ≈ 0,571, co oznacza, że około 57% przesyłanych bitów niesie informację, a 43% to redundancja. Wraz ze wzrostem rozmiaru bloku kody Hamminga stają się bardziej wydajne: Hamming(15,11) ma współczynnik 11/15 ≈ 0,733.
Czy kody Hamminga mogą korygować więcej niż jeden błąd bitu?
Standardowy Hamming(7,4) może korygować wyłącznie pojedyncze błędy bitów. Jeśli odwrócone zostaną dwa bity, syndrom wskazuje niewłaściwą pozycję, a dekoder pogarsza sytuację zamiast ją naprawiać. SECDED może wykryć (ale nie skorygować) błędy dwubitowe. Do korekcji wielu błędów stosuje się silniejsze kody, takie jak Reed-Solomon, LDPC czy kody turbo.
Jak konstruowana jest macierz kontroli parzystości H?
Dla Hamming(7,4) każda kolumna H to binarna reprezentacja pozycji tej kolumny (od 1 do 7). Kolumna 1 = 001, kolumna 2 = 010, kolumna 3 = 011 i tak dalej. Wiersze odpowiadają kontrolom parzystości s1, s2, s4. Syndrom s = H·r izoluje pozycję błędu, ponieważ każda pozycja bitu ma unikalne kodowanie binarne jako kolumna H.
Jaka jest różnica między wykrywaniem a korekcją błędów?
Wykrywanie błędów oznacza, że odbiorca może stwierdzić, że coś poszło nie tak (i może zażądać ponownej transmisji), ale nie może tego naprawić. Korekcja błędów oznacza, że odbiorca dysponuje wystarczającą redundancją, by odtworzyć oryginalne dane bez ponownej transmisji. Kody Hamminga zapewniają obie funkcje: wykrywają do 2 błędów i korygują 1, co czyni je idealnymi dla kanałów, w których retransmisja jest niepraktyczna, takich jak komunikacja z dalekim kosmosem lub pamięć RAM.

Podobne symulacje