Oprava chyby Reed – Solomon - Reed–Solomon error correction

Reed – Solomonovy kódy
Pojmenoval podle Irving S.Reed a Gustave Solomon
Klasifikace
Hierarchie Lineární blokový kód
Polynomiální kód
Reed – Solomonův kód
Délka bloku n
Délka zprávy k
Vzdálenost n - k + 1
Velikost abecedy q = p mn   ( p prime)
Často n = q - 1.
Zápis [ N , k , n - k + 1] q Co de
Algoritmy
Berlekamp – Massey
Euclidean
a kol.
Vlastnosti
Oddělitelný kód na maximální vzdálenost

Kódy Reed – Solomon jsou skupinou kódů opravujících chyby, které zavedli Irving S. Reed a Gustave Solomon v roce 1960. Mají mnoho aplikací, z nichž mezi nejvýznamnější patří spotřebitelské technologie, jako jsou MiniDiscs , CD , DVD , Blu-ray disky, QR kódy , technologie přenosu dat jako DSL a WiMAX , vysílací systémy jako satelitní komunikace, DVB a ATSC a úložné systémy jako RAID 6 .

Reed-Solomonovy kódy fungují na bloku dat, který je považován za sadu prvků konečného pole nazývaných symboly. Kódy Reed – Solomon jsou schopné detekovat a opravit více chyb symbolů. Přidáním kontrolních symbolů t = n  -  k k datům může kód Reed -Solomon detekovat (ale ne opravit) jakoukoli kombinaci až t chybných symbolů, nebo vyhledat a opravit až t /2⌋ chybných symbolů na neznámých místech . Jako mazací kód může opravit až t vymazání na místech, která jsou známá a poskytnuta algoritmu, nebo může detekovat a opravit kombinace chyb a vymazání. Reed-Solomon kódy jsou také vhodné jako vícenásobné roztržení opravovat kódy bitové chyby, protože sekvence b  + 1 po sobě následujících bitových chyb může mít vliv na nejvýše dva symboly velikost b . Volba t je na návrháři kódu a může být vybrána v širokých mezích.

Existují dva základní typy kódů Reed – Solomon - původní zobrazení a zobrazení BCH - přičemž nejčastější je zobrazení BCH, protože dekodéry zobrazení BCH jsou rychlejší a vyžadují méně pracovního úložiště než dekodéry původního zobrazení.

Dějiny

Kódy Reed – Solomon byly vyvinuty v roce 1960 Irvingem S. Reedem a Gustavem Solomonem , kteří byli tehdy zaměstnanci laboratoře MIT Lincoln Laboratory . Jejich klíčový článek měl název „Polynomiální kódy nad určitými konečnými poli“. ( Reed & Solomon 1960 ). Původní schéma kódování popsané v článku Reed & Solomon používalo variabilní polynom na základě zprávy, která má být kódována, kde je kodéru a dekodéru známa pouze pevná sada hodnot (vyhodnocovacích bodů), které mají být kódovány. Původní teoretický dekodér generoval potenciální polynomy na základě podmnožin k (délka nekódované zprávy) z n (kódované délky zprávy) hodnot přijaté zprávy, přičemž jako správný vybral nejoblíbenější polynom, což bylo nepraktické pro všechny, kromě nejjednodušších případy. To bylo původně vyřešeno změnou původního schématu na schéma podobné BCH kódu založené na pevném polynomu známém kodéru i dekodéru, ale později byly vyvinuty praktické dekodéry založené na původním schématu, i když pomalejší než schémata BCH. Výsledkem je, že existují dva hlavní typy kódů Reed Solomon, ty, které používají původní schéma kódování, a ty, které používají schéma kódování BCH.

Také v roce 1960 byl praktický fixní polynomiální dekodér pro BCH kódy vyvinutý Danielem Gorensteinem a Nealem Zierlerem popsán ve zprávě MIT Lincoln Laboratory od Zierlera v lednu 1960 a později v příspěvku v červnu 1961. Dekodér Gorenstein – Zierler a související práce o BCH kódech jsou popsány v knize Error Correcting Codes od W. Wesley Petersona (1961). V roce 1963 (nebo možná dříve) JJ Stone (a další) uznali, že kódy Reed Solomon by mohly používat schéma BCH pomocí polynomu s pevným generátorem, což z těchto kódů činí speciální třídu kódů BCH, ale kódy Reed Solomon založené na původním kódování schémata, nejsou třídou BCH kódů a v závislosti na sadě vyhodnocovacích bodů to nejsou ani cyklické kódy .

V roce 1969 vyvinuli vylepšený dekodér schématu BCH Elwyn Berlekamp a James Massey a od té doby je znám jako dekódovací algoritmus Berlekamp – Massey .

V roce 1975 vyvinul Yasuo Sugiyama další vylepšený dekodér schématu BCH na základě rozšířeného euklidovského algoritmu .

DVB-vs-DVB-X2.png

V roce 1977 byly v programu Voyager implementovány kódy Reed – Solomon ve formě spojených kódů pro opravu chyb . První komerční aplikace v sériově vyráběných spotřebních výrobcích se objevila v roce 1982 s kompaktním diskem , kde jsou použity dva prokládané kódy Reed-Solomon. Dnes jsou kódy Reed-Solomon široce implementovány v digitálních paměťových zařízeních a digitálních komunikačních standardech, i když jsou pomalu nahrazovány modernějšími kódy pro kontrolu parity s nízkou hustotou (LDPC) nebo turbo kódy . Například kódy Reed – Solomon se používají ve standardu DVB-S pro digitální video vysílání (DVB) , ale kódy LDPC se používají v jeho nástupci DVB-S2 .

V roce 1986 byl vyvinut originální dekodér schématu známý jako Berlekamp -Welchův algoritmus .

V roce 1996 vyvinul Madhu Súdán a další varianty původních schématických dekodérů nazývaných dekodéry seznamu nebo měkké dekodéry a práce na těchto typech dekodérů pokračují - viz dekódovací algoritmus seznamu Guruswami – Súdán .

V roce 2002 vyvinul Shuhong Gao další originální dekodér schématu na základě rozšířeného euklidovského algoritmu Gao_RS.pdf .

Aplikace

Datové úložiště

Kódování Reed -Solomon je v systémech velkokapacitních paměťových systémů velmi široce používáno k opravě chyb shluku spojených s vadami médií.

Kódování Reed – Solomon je klíčovou součástí kompaktního disku . Jednalo se o první použití silného kódování pro opravu chyb v sériově vyráběném spotřebním produktu a DAT a DVD používají podobná schémata. Na disku CD dvě vrstvy kódování Reed – Solomon oddělené 28cestným konvolučním prokládačem poskytují schéma nazvané Cross-Interleaved Reed – Solomon Coding ( CIRC ). Prvním prvkem dekodéru CIRC je relativně slabý vnitřní (32,28) kód Reed – Solomon, zkrácený z (255 251) kódu s 8bitovými symboly. Tento kód může opravit až 2 bajtové chyby na 32bajtový blok. Ještě důležitější je, že označí jako vymaže všechny neopravitelné bloky, tj. Bloky s více než 2 bajtovými chybami. Dekódované 28bajtové bloky s indikacemi vymazání jsou pak rozkládacím zařízením rozloženy do různých bloků (28,24) vnějšího kódu. Díky prokládání se ze vymazaného 28bajtového bloku z vnitřního kódu stane jeden vymazaný bajt v každém z 28 vnějších bloků kódu. Vnější kód to snadno opraví, protože dokáže zpracovat až 4 taková vymazání na blok.

Výsledkem je CIRC, který dokáže zcela opravit chybové shluky až 4000 bitů, tedy asi 2,5 mm na povrchu disku. Tento kód je tak silný, že většina chyb při přehrávání disků CD je téměř jistě způsobena chybami sledování, které způsobují, že laser přeskočí stopu, nikoli neopravitelnými chybovými výbuchy.

DVD používají podobné schéma, ale s mnohem většími bloky, (208,192) vnitřním kódem a (182,172) vnějším kódem.

Oprava chyb Reed – Solomon se používá také v parchivačních souborech, které jsou běžně zveřejňovány jako doprovodné multimediální soubory na USENET . Distribuovaná služba online úložiště Wuala (ukončena v roce 2015) také používala při rozdělování souborů Reed – Solomon.

Čárový kód

Téměř všechny dvojrozměrné čárové kódy, jako jsou PDF-417 , MaxiCode , Datamatrix , QR Code a aztécký kód, používají opravu chyb Reed – Solomon, aby bylo možné správné čtení i v případě poškození části čárového kódu. Pokud snímač čárových kódů nerozpozná symbol čárového kódu, bude to považovat za vymazání.

Kódování Reed – Solomon je v jednorozměrných čárových kódech méně obvyklé, ale používá ho symbolika PostBar .

Přenos dat

K překonání nespolehlivé povahy přenosu dat přes mazací kanály lze použít specializované formy kódů Reed – Solomon, konkrétně Cauchy -RS a Vandermonde -RS . Proces kódování předpokládá kód RS ( NK ), jehož výsledkem je generování N kódových slov o délce N symbolů, z nichž každý ukládá K symbolů dat, která jsou poté odeslána přes vymazávací kanál.

Jakákoli kombinace K kódových slov přijatých na druhém konci stačí k rekonstrukci všech N kódových slov. Rychlost kódu je obecně nastavena na 1/2, pokud není možné dostatečně vymodelovat pravděpodobnost vymazání kanálu a je považována za menší. Závěrem lze říci, že N je obvykle 2 K , což znamená, že alespoň polovina všech odeslaných kódových slov musí být přijata, aby bylo možné rekonstruovat všechna odeslaná kódová slova.

Reed-Solomon kódy jsou také používány v xDSL systémů a CCSDS ‚s Space Communications Protocol specifikace jako forma dopřednou chybovou korekci .

Vesmírný přenos

Deep-space zřetězený kódovací systém. Zápis: RS (255, 223) + CC („délka omezení“ = 7, kódová rychlost = 1/2).

Jednou významnou aplikací kódování Reed -Solomon bylo zakódování digitálních obrázků odeslaných zpět programem Voyager .

Voyager představil kódování Reed -Solomon zřetězené s konvolučními kódy , což je postup, který se od té doby velmi rozšířil v komunikaci v hlubokém vesmíru a v satelitní (např. Přímé digitální vysílání).

Dekodéry Viterbi mají tendenci vytvářet chyby v krátkých dávkách. Oprava těchto chyb shluku se nejlépe provádí pomocí krátkých nebo zjednodušených kódů Reed – Solomon.

Moderní verze zřetězeného konvolučního kódování dekódovaného Reed – Solomon/Viterbi byly a jsou použity na misích Mars Pathfinder , Galileo , Mars Exploration Rover a Cassini , kde dosahují výkonu přibližně 1–1,5 dB od konečného limitu, Shannonovy kapacity .

Tyto zřetězené kódy jsou nyní nahrazovány výkonnějšími turbo kódy :

Schémata kódování kanálů používaná misemi NASA
Let Kód Mise
1958 - dosud Nekódovaný Explorer, Mariner, mnoho dalších
1968–1978 konvoluční kódy (CC) (25, 1/2) Pioneer, Venuše
1969–1975 Kód Reed-Muller (32, 6) Námořník, Viking
1977 - dosud Binární kód Golay Voyager
1977 - dosud RS (255, 223) + CC (7, 1/2) Voyager, Galileo, mnoho dalších
1989–2003 RS (255, 223) + CC (7, 1/3) Voyager
1958 - dosud RS (255, 223) + CC (14, 1/4) Galileo
1996 - současnost RS + CC (15, 1/6) Cassini, Mars Pathfinder a další
2004 – současnost Turbo kódy Messenger, Stereo, MRO, další
odhad 2009 LDPC kódy Souhvězdí, MSL

Konstrukce (kódování)

Kód Reed -Solomon je vlastně rodina kódů, kde každý kód je charakterizován třemi parametry: velikost abecedy q , délka bloku n a délka zprávy k, s k <n ≤ q. Sada symbolů abecedy je interpretována jako konečné pole řádu q , a proto q musí být primární mocninou . V nejužitečnějších parametrizacích Reed -Solomonova kódu je délka bloku obvykle nějaký konstantní násobek délky zprávy, to znamená, že rychlost R = k / n je nějaká konstanta, a navíc je délka bloku stejná nebo jedna menší než velikost abecedy, tj. n = q nebo n = q - 1 .

Původní pohled Reeda a Solomona: Kódové slovo jako posloupnost hodnot

Pro kód Reed – Solomon existují různé postupy kódování, a proto existují různé způsoby, jak popsat sadu všech kódových slov. V původním pohledu na Reeda a Solomona (1960) je každé kódové slovo kódu Reed – Solomon posloupností funkčních hodnot polynomu stupně menšího než k . Za účelem získání kódového slova Reed-Solomonova kódu jsou symboly zpráv (každý v abecedě velikosti q) považovány za koeficienty polynomu p stupně menšího než k , přes konečné pole F s q prvky. Na druhé straně je polynom p vyhodnocen v nq odlišných bodech pole F a posloupnost hodnot je odpovídající kódové slovo. Mezi běžné možnosti pro sadu hodnotících bodů patří {0, 1, 2, ..., n - 1}, {0, 1, α , α 2 , ..., α n −2 } nebo pro n < q {1, α , alfa 2 , ..., α n -1 }, ..., kde α je primitivní prvek z F .

Formálně je sada kódových slov kódu Reed – Solomon definována následovně:

Protože ve většině bodů jsou jakékoli dva odlišné polynomy méně než shodné , znamená to, že jakákoli dvě kódová slova kódu Reed -Solomon nesouhlasí alespoň v polohách. Kromě toho existují dva polynomy, které se shodují v bodech, ale nejsou si rovny, a proto je vzdálenost kódu Reed -Solomon přesně . Potom je relativní vzdálenost , kde je míra. Tento kompromis mezi relativní vzdálenosti a rychlosti je asymptoticky optimální, neboť až Singleton vázán , každý kód splňuje . Jako kód, který dosahuje tohoto optimálního kompromisu, patří kód Reed – Solomon do třídy kódů oddělitelných na maximální vzdálenost .

Zatímco počet různých polynomů stupně menší než k a počet různých zpráv jsou oba stejné a každá zpráva může být jedinečně mapována na takový polynom, existují různé způsoby, jak toto kódování provést. Původní konstrukce Reeda a Solomona (1960) interpretuje zprávu x jako koeficienty polynomu p , zatímco následující konstrukce interpretují zprávu jako hodnoty polynomu v prvních k bodech a získají polynom p p interpolací těchto hodnot pomocí a polynom stupně menší než k . Druhý kódovací postup, i když je o něco méně účinný, má tu výhodu, že dává vznik systematickému kódu , to znamená, že původní zpráva je vždy obsažena jako podsekce kódového slova.

Jednoduchý postup kódování: Zpráva jako posloupnost koeficientů

V původní konstrukci Reeda a Solomona (1960) je zpráva mapována na polynom s

Kódové slovo pro se získá vyhodnocením v různých bodech pole . Klasická kódovací funkce pro Reed -Solomonův kód je tedy definována následovně:

Tato funkce je lineární mapování , to znamená, že splňuje následující matici s prvky z :

Tato matice je přemístit z matrice Vandermonde nad . Jinými slovy, Reed-Solomonův kód je lineární kód , a v klasickém kódování řízení, jeho generátor matice je .

Systematický postup kódování: Zpráva jako počáteční posloupnost hodnot

Existuje alternativní postup kódování, který také produkuje kód Reed -Solomon, ale dělá to systematickým způsobem. Zde funguje mapování ze zprávy na polynom jinak: polynom je nyní definován jako jedinečný polynom stupně menšího než takového, že

platí pro všechny .

Pro výpočet tohoto polynomu od , jeden může používat Lagrange interpolace . Jakmile je nalezen, je vyhodnocen v ostatních bodech pole. Alternativní kódovací funkce pro kód Reed – Solomon je pak opět jen posloupnost hodnot:

Protože se první položky každého kódového slova shodují s , je tento postup kódování skutečně systematický . Protože Lagrangeova interpolace je lineární transformace, je lineární mapování. Ve skutečnosti máme , kde

Diskrétní Fourierova transformace a její inverze

Diskrétní Fourierova transformace je v podstatě stejný jako postup kódování; používá polynom generátoru p (x) k mapování sady vyhodnocovacích bodů do hodnot zprávy, jak je uvedeno výše:

Inverzní Fourierovu transformaci by bylo možné použít k převodu bezchybné sady hodnot n < q zpráv zpět do kódovacího polynomu k koeficientů k , s omezením, že aby to fungovalo, musí sada vyhodnocovacích bodů použitých ke kódování zprávy být množinou rostoucích sil α :

Lagrangeova interpolace však provádí stejnou konverzi bez omezení na sadu vyhodnocovacích bodů nebo požadavku bezchybné sady hodnot zpráv a používá se pro systematické kódování a v jednom z kroků Gao dekodéru .

Pohled BCH: Kódové slovo jako posloupnost koeficientů

V tomto pohledu je zpráva interpretována jako koeficienty polynomu . Odesílatel počítá související polynom stupne kde a odešle polynom . Polynom je vytvořen vynásobením polynomu zprávy , který má stupeň , polynomem generátoru stupně, který je známý odesílateli i příjemci. Polynom generátoru je definován jako polynom, jehož kořeny jsou sekvenční mocnosti primitiva Galoisova pole

Pro „úzkém slova smyslu kódu“ .

Systematický postup kódování

Proceduru kódování pro zobrazení BCH kódů Reed -Solomon lze upravit tak, aby poskytovala systematický postup kódování , ve kterém každé kódové slovo obsahuje zprávu jako předponu a jednoduše přidává symboly opravující chyby jako příponu. Zde místo odesílání kodér konstruuje přenesený polynom tak, že koeficienty největších monomiálů se rovnají odpovídajícím koeficientům a koeficienty nižšího řádu jsou vybrány přesně takovým způsobem, který je dělitelný . Pak jsou koeficienty koeficientem posloupnosti koeficientů . Abychom získali kód, který je celkově systematický, konstruujeme polynom zprávy tak, že zprávu interpretujeme jako posloupnost jejích koeficientů.

Formálně se konstrukce provádí vynásobením , aby se vytvořil prostor pro kontrolní symboly, rozdělením tohoto produktu na nalezení zbytku a následným kompenzováním tohoto zbytku jeho odečtením. Tyto kontrolní symboly jsou vytvořeny tím, že počítá zbytek :

Zbytek má nejvýše stupeň , zatímco koeficienty v polynomu jsou nulové. Následující definice kódového slova má tedy tu vlastnost, že první koeficienty jsou totožné s koeficienty :

Výsledkem je, že kódová slova jsou skutečně prvky , to znamená, že jsou dělitelná polynomem generátoru :

Vlastnosti

Kód Reed – Solomon je kód [ n , k , n - k + 1]; jinými slovy, je to lineární blokový kód délky n (přes F ) s rozměrem k a minimální Hammingovou vzdáleností Reedův -Solomonův kód je optimální v tom smyslu, že minimální vzdálenost má maximální možnou hodnotu pro lineární kód velikosti ( nk ); toto je známé jako Singleton vázané . Takový kód se také nazývá kód oddělitelný na maximální vzdálenost (MDS) .

Schopnost opravovat chyby kódu Reed-Solomon je určena jeho minimální vzdáleností nebo ekvivalentně mírou nadbytečnosti v bloku. Pokud umístění chybových symbolů není předem známo, pak kód Reed – Solomon dokáže opravit až chybné symboly, tj. Dokáže opravit polovinu chyb, kolik je do bloku přidáno nadbytečných symbolů. Někdy jsou místa chyb známa předem (např. „Boční informace“ v poměrech signálu k šumu demodulátoru )-tomu se říká vymazání . Reed -Solomonův kód (jako jakýkoli kód MDS ) je schopen opravit dvakrát tolik vymazání než chyb a jakoukoli kombinaci chyb a vymazání lze opravit, pokud je splněn vztah 2 E  +  S  ≤  n  -  k , kde je počet chyb a počet vymazání v bloku.

Teoretická BER výkonnost Reed-Solomonova kódu (N = 255, K = 233, QPSK, AWGN). Kroková charakteristika.

Teoretickou mez chyby lze popsat pomocí následujícího vzorce pro kanál AWGN pro FSK :

a pro další schémata modulace:

kde , , , je chybovost symbolů v nekódované AWGN případě, a je pořadí modulace.

Pro praktické použití Reed -Solomonových kódů je běžné používat konečné pole s prvky. V tomto případě může být každý symbol reprezentován jako -bitová hodnota. Odesílatel odešle datové body jako kódované bloky a počet symbolů v kódovaném bloku je . Kód Reed-Solomon pracující na 8bitových symbolech má tedy symboly na blok. (To je velmi populární hodnota z důvodu výskytu byte orientovaných počítačových systémů.) Číslo , s , z datových symbolů v bloku je parametr konstrukce. Běžně používaný kód kóduje osmibitové datové symboly plus 32 osmibitových paritních symbolů v bloku -symbol; toto je označeno jako kód a je schopno opravit až 16 chyb symbolu na blok.

Vlastnosti kódu Reed-Solomon popsané výše je činí obzvláště vhodnými pro aplikace, kde dochází k chybám v sekvencích . Důvodem je, že pro kód nezáleží na tom, kolik bitů v symbolu je chybných - pokud je poškozeno více bitů v symbolu, počítá se to pouze jako jedna chyba. Naopak, pokud datový tok není charakterizován shluky chyb nebo výpadky, ale náhodnými jednobitovými chybami, je Reed-Solomonův kód obvykle špatnou volbou ve srovnání s binárním kódem.

Kód Reed -Solomon, stejně jako konvoluční kód , je transparentní kód. To znamená, že pokud byly symboly kanálů obráceny někde podél čáry, dekodéry budou stále fungovat. Výsledkem bude inverze původních dat. Kód Reed – Solomon však ztrácí svou průhlednost, když je kód zkrácen. „Chybějící“ bity ve zkráceném kódu je třeba vyplnit buď nulami, nebo jedničkami, podle toho, zda jsou data doplněna či nikoli. (Jinak řečeno, pokud jsou symboly invertovány, pak nulovou výplň je třeba převést na jednu výplň.) Z tohoto důvodu je povinné, aby byl vyřešen smysl dat (tj. Pravdivý nebo doplněný). před dekódováním Reed – Solomon.

Zda je kód Reed – Solomon cyklický nebo ne, závisí na jemných detailech konstrukce. V původním pohledu na Reeda a Solomona, kde jsou kódová slova hodnotami polynomu, lze zvolit posloupnost vyhodnocovacích bodů takovým způsobem, aby byl kód cyklický. Zejména pokud je primitivní kořen pole , pak podle definice všechny nenulové prvky mají formu pro , kde . Každý polynom nad vyvolává kódové slovo . Protože funkce je také polynom stejného stupně, dává tato funkce vzniknout kódovému slovu ; protože platí, toto kódové slovo je cyklický posun vlevo od původního kódového slova odvozeného z . Takže výběr posloupnosti primitivních kořenových sil jako hodnotících bodů způsobí, že původní pohled Reed – Solomonův kód bude cyklický . Reed – Solomonovy kódy v zobrazení BCH jsou vždy cyklické, protože kódy BCH jsou cyklické .

Poznámky

Návrháři nejsou povinni používat „přirozené“ velikosti bloků kódu Reed – Solomon. Technika známá jako „zkracování“ může z většího kódu vytvořit menší kód libovolné požadované velikosti. Například široce používaný (255,223) kód lze převést na (160,128) kód vyplněním nepoužité části zdrojového bloku 95 binárními nulami a jejich nevysíláním. V dekodéru je stejná část bloku lokálně načtena s binárními nulami. Věta Delsarte – Goethals – Seidel ilustruje příklad aplikace zkrácených kódů Reed – Solomon. Souběžně se zkracováním umožňuje technika známá jako punktování vynechat některé z kódovaných paritních symbolů.

Zobrazit dekodéry BCH

Dekodéry popsané v této části používají pohled BCH kódového slova jako posloupnost koeficientů. Používají pevný generátorový polynom známý kodéru i dekodéru.

Dekodér Peterson – Gorenstein – Zierler

Daniel Gorenstein a Neal Zierler vyvinuli dekodér, který byl popsán ve zprávě MIT Lincoln Laboratory od Zierlera v lednu 1960 a později v článku v červnu 1961. Dekodér Gorenstein -Zierler a související práce na BCH kódech jsou popsány v knize Error Correcting kódy podle W. Wesley Peterson (1961).

Formulace

Na přenášenou zprávu ,, se pohlíží jako na koeficienty polynomu s ( x ):

V důsledku procedury kódování Reed-Solomon je s ( x ) dělitelné generátorovým polynomem g ( x ):

kde α je primitivní kořen.

Protože s ( x ) je násobkem generátoru g ( x ), vyplývá z toho, že „dědí“ všechny své kořeny:

Přenesený polynom je při přenosu poškozen chybovým polynomem e ( x ) za vzniku přijatého polynomu r ( x ).

Koeficient e i bude nulový, pokud nedojde k chybě při tomto výkonu x, a nenulový, pokud dojde k chybě. Pokud jsou vmax chyby na odlišných sil i k o x , potom

Cílem dekodéru je zjistit počet chyb ( ν ), polohy chyb ( i k ) a chybové hodnoty v těchto polohách ( e i k ). Z nich lze vypočítat e ( x ) a odečíst od r ( x ), abychom získali původně odeslanou zprávu s ( x ).

Dekódování syndromu

Dekodér začíná vyhodnocením polynomu přijatého v bodech . Výsledky tohoto hodnocení nazýváme „syndromy“, S j . Jsou definovány jako:

Výhodou pohledu na syndromy je, že vypadne polynom zprávy. Jinými slovy, syndromy se týkají pouze chyby a nejsou ovlivněny skutečným obsahem přenášené zprávy. Pokud jsou všechny syndromy nulové, algoritmus se zde zastaví a oznámí, že zpráva nebyla při přenosu poškozena.

Lokátory chyb a hodnoty chyb

Pro usnadnění definujte lokátory chyb X k a chybové hodnoty Y k jako:

Pak lze syndromy zapsat pomocí těchto lokátorů chyb a hodnot chyb jako

Tato definice hodnot syndromu je ekvivalentní předchozí od té doby .

Syndromy dávají systém n  -  k ≥ 2 ν rovnic ve 2 v neznámých, ale tento systém rovnic je v X k nelineární a nemá zřejmé řešení. Pokud by však bylo známo X k (viz níže), pak rovnice syndromu poskytují lineární systém rovnic, které lze snadno vyřešit pro chybové hodnoty Y k .

V důsledku toho je problém najít X k , protože pak by byla známá matice úplně vlevo a obě strany rovnice by mohly být vynásobeny její inverzí, čímž se získá Y k

Ve variantě tohoto algoritmu, kde je umístění chyb již známé (když se používá jako kód pro mazání ), to je konec. Místa chyb ( X k ) jsou již známa nějakou jinou metodou (například v FM přenosu jsou úseky, kde bitový tok byl nejasný nebo překonaný interferencí, pravděpodobnostně určitelné z frekvenční analýzy). V tomto scénáři lze opravit až chyby.

Zbývající část algoritmu slouží k lokalizaci chyb a bude vyžadovat hodnoty syndromu až místo dosud používaných. To je důvod, proč je třeba přidat 2 x tolik symbolů opravujících chyby, kolik lze opravit bez znalosti jejich umístění.

Polynom lokátoru chyb

Existuje lineární relační relace, která dává vznik systému lineárních rovnic. Řešení těchto rovnic identifikuje tato chybová místa X k .

Definujte polynom lokátoru chyb Λ ( x ) jako

Nuly Λ ( x ) jsou převrácené hodnoty . To vyplývá z výše uvedené konstrukce zápisu produktu, protože pokud pak jeden z vynásobených výrazů bude nula , celý polynom se vyhodnotí na nulu.

Nechť je jakékoli takové celé číslo . Vynásobte obě strany a stále bude nula.

Součet pro k = 1 až ν a stále bude nula.

Shromážděte každý výraz do jeho součtu.

Extrahujte konstantní hodnoty, které nejsou součtem ovlivněny.

Tyto souhrny jsou nyní ekvivalentní hodnotám syndromu, které známe a můžeme je nahradit! Tím se snižuje na

Odečtením výnosů z obou stran

Připomeňme, že j bylo vybráno jako jakékoli celé číslo mezi 1 a v včetně a tato ekvivalence platí pro všechny a všechny tyto hodnoty. Proto máme v lineární rovnice, nejen jednu. Tento systém lineárních rovnic lze proto vyřešit pro koeficienty Λ i polynomu umístění chyby:

Výše uvedené předpokládá, že dekodér zná počet chyb ν , ale toto číslo ještě nebylo určeno. PGZ dekodér neurčuje ν přímo, ale spíše jej vyhledává zkoušením po sobě jdoucích hodnot. Dekodér nejprve převezme největší hodnotu pro pokus ν a nastaví lineární systém pro tuto hodnotu. Pokud lze rovnice vyřešit (tj. Determinant matice je nenulový), pak tato zkušební hodnota je počet chyb. Pokud lineární systém nelze vyřešit, pak se pokus ν sníží o jeden a zkoumá se další menší systém. ( Gill nd , str. 35)

Najděte kořeny polynomu lokátoru chyb

Pomocí koeficientů Λ i nalezených v posledním kroku vytvořte polynom umístění chyby. Kořeny polynomu umístění chyby lze nalézt vyčerpávajícím vyhledáváním. Lokátory chyb X k jsou převrácené hodnoty těchto kořenů. Pořadí koeficientů polynomu umístění chyby lze obrátit, v takovém případě jsou kořeny tohoto obráceného polynomu lokátory chyb (nikoli jejich převrácené hodnoty ). Chien search je efektivní implementace tohoto kroku.

Vypočítejte chybové hodnoty

Jakmile jsou známy lokátory chyb X k , lze určit chybové hodnoty. To lze provést přímým řešením pro Y k v matici chybových rovnic uvedených výše, nebo pomocí Forneyova algoritmu .

Vypočítejte umístění chyb

Vypočítat i k tím, že základna protokolu z X k . To se obecně provádí pomocí předem vypočítané vyhledávací tabulky.

Opravte chyby

Nakonec se e (x) vygeneruje z i k a e i k a poté se odečte od r (x), aby se získala původně odeslaná zpráva s (x), s opravenými chybami.

Příklad

Zvažte kód Reed – Solomon definovaný v GF (929) s α = 3 a t = 4 (používá se v čárových kódech PDF417 ) pro kód RS (7,3). Polynom generátoru je

Pokud je polynom zprávy p ( x ) = 3 x 2 + 2 x + 1 , pak je systematické kódové slovo zakódováno následovně.

Chyby v přenosu mohou způsobit, že bude místo toho přijato.

Syndromy se vypočítají vyhodnocením r při silách α .

Pomocí Gaussovy eliminace :

Λ (x) = 329 x 2 + 821 x + 001, s kořeny x 1 = 757 = 3 −3 a x 2 = 562 = 3 −4

Koeficienty lze obrátit, aby vznikly kořeny s kladnými exponenty, ale obvykle se to nepoužívá:

R (x) = 001 x 2 + 821 x + 329, s kořeny 27 = 3 3 a 81 = 3 4

s logem kořenů odpovídajícím chybovým místům (zprava doleva, umístění 0 je poslední výraz v kódovém slovu).

Chcete -li vypočítat hodnoty chyb, použijte algoritmus Forney .

Ω (x) = S (x) Λ (x) mod x 4 = 546 x + 732
Λ '(x) = 658 x + 821
e 1 = −Ω (x 1 )/Λ '(x 1 ) = 074
e 2 = −Ω (x 2 )/Λ '(x 2 ) = 122

Odečtením od přijatého polynomu r (x) se reprodukuje původní kódové slovo s .

Dekodér Berlekamp – Massey

Algoritmus Berlekamp-Massey je alternativní iterační postup pro zjištění chyby lokátoru polynom. Během každé iterace vypočítá nesrovnalost na základě aktuální instance Λ (x) s předpokládaným počtem chyb e :

a poté upraví Λ ( x ) a e tak, aby přepočtené Δ bylo nulové. Článek Algoritmus Berlekamp – Massey má podrobný popis postupu. V následujícím příkladu C ( x ) slouží k reprezentaci Λ ( x ).

Příklad

Použitím stejných dat jako výše uvedený příklad Petersona Gorensteina Zierlera:

n S n +1 d C B b m
0 732 732 197 x + 1 1 732 1
1 637 846 173 x + 1 1 732 2
2 762 412 634 x 2 + 173 x + 1 173 x + 1 412 1
3 925 576 329 x 2 + 821 x + 1 173 x + 1 412 2

Konečná hodnota C je polynom lokátoru chyb, Λ ( x ).

Euklidovský dekodér

Další iterační metoda pro výpočet polynomu lokátoru chyb a polynomu chybové hodnoty je založena na Sugiyamově adaptaci rozšířeného euklidovského algoritmu .

Definujte S (x), Λ (x) a Ω (x) pro t syndromy a chyby e :

Klíčová rovnice je:

Pro t = 6 a e = 3:

Prostřední členy jsou nulové kvůli vztahu mezi Λ a syndromy.

Rozšířený euklidovský algoritmus dokáže najít řadu polynomů formuláře

A i ( x ) S ( x ) + B i ( x ) x t = R i ( x )

kde je stupeň R klesá se i zvyšuje. Jakmile je stupeň R i ( x ) < t /2, pak

A i (x) = Λ (x)

B i (x) = −Q (x)

R i (x) = Ω (x).

B (x) a Q (x) není třeba ukládat, takže algoritmus se stává:

R −1 = x t
R 0 = S (x)
A −1 = 0
A 0 = 1
i = 0
zatímco stupeň R i ≥ t/2
i = i + 1
Q = R i-2 / R i-1
R i = R i-2 -QR i-1
A i = A i-2 -QA i-1

pro nastavení dolního řádu Λ (x) na 1 vydělte Λ (x) a Ω (x) A i (0):

Λ (x) = A i / A i (0)
Ω (x) = R i / A i (0)

A i (0) je konstantní (nízkého řádu) člen A i .

Příklad

Použijeme stejná data jako výše uvedený příklad Peterson – Gorenstein – Zierler:

R i A i
-1 001 x 4 + 000 x 3 + 000 x 2 + 000 x + 000 000
0 925 x 3 + 762 x 2 + 637 x + 732 001
1 683 x 2 + 676 x + 024 697 x + 396
2 673 x + 596 608 x 2 + 704 x + 544
Λ (x) = a 2 /544 = 329 x 2 + 821 x 001 +
Ω (x) = R 2 /544 = 546 x 732 +

Dekodér využívající diskrétní Fourierovu transformaci

Pro dekódování lze použít diskrétní Fourierovu transformaci. Abyste se vyhnuli konfliktu s názvy syndromů, nechte c ( x ) = s ( x ) kódované kódové slovo. r ( x ) a e ( x ) jsou stejné jako výše. Definujte C ( x ), E ( x ) a R ( x ) jako diskrétní Fourierovy transformace c ( x ), e ( x ) a r ( x ). Protože r ( x ) = c ( x ) + e ( x ), a protože diskrétní Fourierova transformace je lineární operátor, R ( x ) = C ( x ) + E ( x ).

Transformujte r ( x ) na R ( x ) pomocí diskrétní Fourierovy transformace. Protože výpočet pro diskrétní Fourierovu transformaci je stejný jako výpočet pro syndromy, t koeficienty R ( x ) a E ( x ) jsou stejné jako syndromy:

Použití přes jako syndromů (jsou stejné) a generování chyb lokátoru polynom použití metod z některého z výše uvedených dekodérů.

Nechť v = počet chyb. Generování E (x) s použitím známých koeficientů se , chyby lokátoru polynomu, a tyto vzorce

Potom vypočítejte C ( x ) = R ( x ) - E ( x ) a vezměte inverzní transformaci (polynomickou interpolaci) C ( x ) k vytvoření c ( x ).

Dekódování za hranicí korekce chyb

Singleton vázané uvádí, že minimální vzdálenost d lineárního blokového kódu velikosti ( n , k ) je horní ohraničená n  -  k  + 1. Vzdálenost d se obvykle rozumí omezit schopnost opravy chyb pro ⌊ (D- 1) / 2⌋. Kód Reed – Solomon dosahuje této hranice s rovností, a může tedy opravit až ⌊ (nk) / 2⌋ chyb. Tato hranice opravy chyb však není přesná.

V roce 1999 Madhu Sudan a Venkatesan Guruswami na MIT publikovali „Vylepšené dekódování kódů Reed-Solomon a Algebraic-Geometry“, které zavádí algoritmus, který umožňoval opravu chyb přesahujících polovinu minimální vzdálenosti kódu. Vztahuje se na Reed -Solomonovy kódy a obecněji na algebraické geometrické kódy . Tento algoritmus vytváří seznam kódových slov (jedná se o algoritmus dekódování seznamu ) a je založen na interpolaci a faktorizaci polynomů a jejich rozšíření.

Soft dekódování

Algebraické dekódovací metody popsané výše jsou metodami tvrdého rozhodování, což znamená, že pro každý symbol se dělá těžké rozhodnutí o jeho hodnotě. Dekodér může například ke každému symbolu přidružit dodatečnou hodnotu odpovídající důvěře kanálového demodulátoru ve správnost symbolu. Příchod LDPC a turbo kódů , které využívají iterované metody dekódování propagace víry s měkkým rozhodnutím k dosažení výkonu korekce chyb blízké teoretickému limitu , vyvolal zájem o aplikaci dekódování s měkkým rozhodováním na konvenční algebraické kódy. V roce 2003 Ralf Koetter a Alexander Vardy představili algoritmus dekódování algebraických dekódovacích algoritmů polynomiálního času s měkkým rozhodováním pro kódy Reed-Solomon, který byl založen na práci Súdánu a Guruswamiho. V roce 2016 vydali Steven J. Franke a Joseph H. Taylor nový dekodér s měkkým rozhodováním.

Příklad Matlabu

Kodér

Zde uvádíme jednoduchou implementaci Matlabu pro kodér.

function [encoded] = rsEncoder(msg, m, prim_poly, n, k)
    % RSENCODER Encode message with the Reed-Solomon algorithm
    % m is the number of bits per symbol
    % prim_poly: Primitive polynomial p(x). Ie for DM is 301
    % k is the size of the message
    % n is the total size (k+redundant)
    % Example: msg = uint8('Test')
    % enc_msg = rsEncoder(msg, 8, 301, 12, numel(msg));
 
    % Get the alpha
    alpha = gf(2, m, prim_poly);
 
    % Get the Reed-Solomon generating polynomial g(x)
    g_x = genpoly(k, n, alpha);
 
    % Multiply the information by X^(n-k), or just pad with zeros at the end to
    % get space to add the redundant information
    msg_padded = gf([msg zeros(1, n - k)], m, prim_poly);
 
    % Get the remainder of the division of the extended message by the
    % Reed-Solomon generating polynomial g(x)
    [~, remainder] = deconv(msg_padded, g_x);
 
    % Now return the message with the redundant information
    encoded = msg_padded - remainder;
 
end

% Find the Reed-Solomon generating polynomial g(x), by the way this is the
% same as the rsgenpoly function on matlab
function g = genpoly(k, n, alpha)
    g = 1;
    % A multiplication on the galois field is just a convolution
    for k = mod(1 : n - k, n)
        g = conv(g, [1 alpha .^ (k)]);
    end
end

Dekodér

Nyní dekódovací část:

function [decoded, error_pos, error_mag, g, S] = rsDecoder(encoded, m, prim_poly, n, k)
    % RSDECODER Decode a Reed-Solomon encoded message
    %   Example:
    % [dec, ~, ~, ~, ~] = rsDecoder(enc_msg, 8, 301, 12, numel(msg))
    max_errors = floor((n - k) / 2);
    orig_vals = encoded.x;
    % Initialize the error vector
    errors = zeros(1, n);
    g = [];
    S = [];
 
    % Get the alpha
    alpha = gf(2, m, prim_poly);
 
    % Find the syndromes (Check if dividing the message by the generator
    % polynomial the result is zero)
    Synd = polyval(encoded, alpha .^ (1:n - k));
    Syndromes = trim(Synd);
 
    % If all syndromes are zeros (perfectly divisible) there are no errors
    if isempty(Syndromes.x)
        decoded = orig_vals(1:k);
        error_pos = [];
        error_mag = [];
        g = [];
        S = Synd;
        return;
    end
 
    % Prepare for the euclidean algorithm (Used to find the error locating
    % polynomials)
    r0 = [1, zeros(1, 2 * max_errors)]; r0 = gf(r0, m, prim_poly); r0 = trim(r0);
    size_r0 = length(r0);
    r1 = Syndromes;
    f0 = gf([zeros(1, size_r0 - 1) 1], m, prim_poly);
    f1 = gf(zeros(1, size_r0), m, prim_poly);
    g0 = f1; g1 = f0;
 
    % Do the euclidean algorithm on the polynomials r0(x) and Syndromes(x) in
    % order to find the error locating polynomial
    while true
        % Do a long division
        [quotient, remainder] = deconv(r0, r1);
        % Add some zeros
        quotient = pad(quotient, length(g1));
     
        % Find quotient*g1 and pad
        c = conv(quotient, g1);
        c = trim(c);
        c = pad(c, length(g0));
     
        % Update g as g0-quotient*g1
        g = g0 - c;
     
        % Check if the degree of remainder(x) is less than max_errors
        if all(remainder(1:end - max_errors) == 0)
            break;
        end
     
        % Update r0, r1, g0, g1 and remove leading zeros
        r0 = trim(r1); r1 = trim(remainder);
        g0 = g1; g1 = g;
    end
 
    % Remove leading zeros
    g = trim(g);
 
    % Find the zeros of the error polynomial on this galois field
    evalPoly = polyval(g, alpha .^ (n - 1 : - 1 : 0));
    error_pos = gf(find(evalPoly == 0), m);
 
    % If no error position is found we return the received work, because
    % basically is nothing that we could do and we return the received message
    if isempty(error_pos)
        decoded = orig_vals(1:k);
        error_mag = [];
        return;
    end
 
    % Prepare a linear system to solve the error polynomial and find the error
    % magnitudes
    size_error = length(error_pos);
    Syndrome_Vals = Syndromes.x;
    b(:, 1) = Syndrome_Vals(1:size_error);
    for idx = 1 : size_error
        e = alpha .^ (idx * (n - error_pos.x));
        err = e.x;
        er(idx, :) = err;
    end
 
    % Solve the linear system
    error_mag = (gf(er, m, prim_poly) \ gf(b, m, prim_poly))';
    % Put the error magnitude on the error vector
    errors(error_pos.x) = error_mag.x;
    % Bring this vector to the galois field
    errors_gf = gf(errors, m, prim_poly);
 
    % Now to fix the errors just add with the encoded code
    decoded_gf = encoded(1:k) + errors_gf(1:k);
    decoded = decoded_gf.x;
 
end

% Remove leading zeros from Galois array
function gt = trim(g)
    gx = g.x;
    gt = gf(gx(find(gx, 1) : end), g.m, g.prim_poly);
end

% Add leading zeros
function xpad = pad(x, k)
    len = length(x);
    if (len < k)
        xpad = [zeros(1, k - len) x];
    end
end

Reed Solomon originální pohled dekodéry

Dekodéry popsané v této části používají původní pohled Reed Solomona na kódové slovo jako posloupnost polynomických hodnot, kde polynom je založen na zprávě, která má být kódována. Kodér a dekodér používá stejnou sadu pevných hodnot a dekodér obnovuje kódovací polynom (a případně polynom s lokalizací chyb) z přijaté zprávy.

Teoretický dekodér

Reed & Solomon (1960) popsali teoretický dekodér, který opravoval chyby nalezením nejpopulárnějšího polynomu zprávy. Dekodér zná pouze soubor hodnot, k a která metoda kódování se použije pro generování sekvence kódové slovo se hodnot. Původní zpráva, polynom a jakékoli chyby nejsou známy. Procedura dekódování by mohla použít metodu, jako je Lagrangeova interpolace na různých podskupinách n hodnot kódového slova, pořízených současně k opakovanému vytváření potenciálních polynomů, dokud se nevytvoří dostatečný počet odpovídajících polynomů, aby se přiměřeně odstranily jakékoli chyby v přijatém kódovém slově. Jakmile je určen polynom, pak lze případné chyby v kódovém slově opravit přepočítáním odpovídajících hodnot kódového slova. Bohužel ve všech případech, kromě těch nejjednodušších, existuje příliš mnoho podmnožin, takže algoritmus je nepraktický. Počet podmnožin je binomický koeficient , a počet podskupin je neproveditelné ještě skromnější kódy. U kódu, který dokáže opravit 3 chyby, by naivní teoretický dekodér prozkoumal 359 miliard podmnožin.

Dekodér Berlekamp Welch

V roce 1986 byl jako dekodér vyvinut dekodér známý jako Berlekamp -Welchův algoritmus jako dekodér, který je schopen obnovit původní polynom zprávy i polynom typu „lokátor chyby“, který vytváří nuly pro vstupní hodnoty, které odpovídají chybám, s časovou složitostí. O (n^3), kde n je počet hodnot ve zprávě. Obnovený polynom se poté použije k obnovení (přepočítání podle potřeby) původní zprávy.

Příklad

Pomocí RS (7,3), GF (929) a sady hodnotících bodů a i = i - 1

a = {0, 1, 2, 3, 4, 5, 6}

Pokud je zpráva polynom

p ( x ) = 003 x 2 + 002 x + 001

Kódové slovo je

c = {001, 006, 017, 034, 057, 086, 121}

Chyby v přenosu mohou způsobit, že bude místo toho přijato.

b = c + e = {001, 006, 123, 456, 057, 086, 121}

Klíčové rovnice jsou:

Předpokládejme maximální počet chyb: e = 2. Klíčové rovnice se stávají:

Pomocí Gaussovy eliminace :

Q ( x ) = 003 x 4 + 916 x 3 + 009 x 2 + 007 x + 006
E ( x ) = 001 x 2 + 924 x + 006
Q ( x ) / E ( x ) = P ( x ) = 003 x 2 + 002 x + 001

Přepočítejte P (x) kde E (x) = 0: {2, 3}, abyste opravili b, což mělo za následek opravené kódové slovo:

c = {001, 006, 017, 034, 057, 086, 121}

Gao dekodér

V roce 2002 vyvinul Shuhong Gao vylepšený dekodér na základě rozšířeného euklidovského algoritmu Gao_RS.pdf .

Příklad

Pomocí stejných dat jako výše uvedený příklad Berlekamp Welch:

Lagrangeova interpolace pro i = 1 až n
R i A i
-1 001 x 7 + 908 x 6 + 175 x 5 + 194 x 4 + 695 x 3 + 094 x 2 + 720 x + 000 000
0 055 x 6 + 440 x 5 + 497 x 4 + 904 x 3 + 424 x 2 + 472 x + 001 001
1 702 x 5 + 845 x 4 + 691 x 3 + 461 x 2 + 327 x + 237 152 x + 237
2 266 x 4 + 086 x 3 + 798 x 2 + 311 x + 532 708 x 2 + 176 x + 532
Q ( x ) = R 2 = 266 x 4 + 086 x 3 + 798 x 2 + 311 x + 532
E ( x ) = A 2 = 708 x 2 + 176 x + 532

vydělte Q (x) a E (x) nejvýznamnějším koeficientem E (x) = 708. (volitelně)

Q ( x ) = 003 x 4 + 916 x 3 + 009 x 2 + 007 x + 006
E ( x ) = 001 x 2 + 924 x + 006
Q ( x ) / E ( x ) = P ( x ) = 003 x 2 + 002 x + 001

Přepočítejte P ( x ) kde E ( x ) = 0: {2, 3}, abyste opravili b, což mělo za následek opravené kódové slovo:

c = {001, 006, 017, 034, 057, 086, 121}

Viz také

Poznámky

Reference

Další čtení

externí odkazy

Informace a návody

Implementace