Ir para o conteúdo

Código Reed–Solomon

Origem: Wikipédia, a enciclopédia livre.

Em teoria, a codificação códigos de Reed-Solomon (RS), é um grupo de códigos cíclicos de correção de erros não binários,inventados por Irving S. Reed e Gustave Solomon. Os Códigos RS constituem uma sub-classe de uma ampla classe de códigos cíclicos denominada de Códigos BCH (Bose–Chaudhuri–Hocquenghem). Eles descreveram uma forma sistemática de construção de códigos capazes de detectar e corrigir vários erros aleatórios de símbolos. Ao adicionar símbolos de verificação aos dados, um código RS pode detectar qualquer combinação de até símbolos errados, e corrigir até símbolos. Como erasure code consegue corrigir até faltas conhecidas, ou pode detectar e corrigir uma combinação de erros e faltas. Além disso, os códigos RS são adequados como códigos de correção de multiple-burst bit-error, uma vez que uma sequência de erros consecutivos afeta no máximo dois símbolos de tamanho . [2] A escolha de é arbitrária sendo efectuada pelo criador do código, e podendo ser seleccionado dentro de limites amplos.

Os Códigos RS encontram-se entre os códigos mais poderosos no que diz respeito à capacidade de correção de erro, sendo largamente utilizados em muitos sistemas digitais tais como: Comunicações de missões espaciais, CDs, DVDs, aDSL, WiMAX, DVB, QRCode, sistemas RAID 6 e sistemas de telecomunicações como DWDM.

História

[editar | editar código]

Os códigos de Reed-Solomon foram desenvolvidos em 1960 por Irving S. Reed e Gustave Solomon, que eram então membros da equipe do MIT Lincoln Laboratory. O seu artigo seminal foi intitulado "Polynomial Codes over Certain Finite Fields".[1] O esquema de codificação original descrito no artigo de Reed e Solomon usava um polinômio variável baseado na mensagem a ser codificada, onde apenas um conjunto fixo de valores (pontos de avaliação) a serem codificados é conhecido pelo codificador e pelo decodificador. O decodificador teórico original gerava polinômios potenciais baseados em subconjuntos de (comprimento da mensagem não codificada) a partir de (comprimento da mensagem codificada) valores de uma mensagem recebida, escolhendo o polinômio mais popular como o correto, o que era impraticável para todos os casos, exceto os mais simples. Isso foi inicialmente resolvido alterando o esquema original para um esquema semelhante ao código BCH baseado em um polinômio fixo conhecido por ambos, codificador e decodificador, mas, posteriormente, decodificadores práticos baseados no esquema original foram desenvolvidos, embora mais lentos que os esquemas BCH. O resultado disso é que existem dois tipos principais de códigos de Reed-Solomon: aqueles que usam o esquema de codificação original e aqueles que usam o esquema de codificação BCH.

Também em 1960, um decodificador prático de polinômio fixo para códigos BCH desenvolvido por Daniel Gorenstein e Neal Zierler foi descrito em um relatório do MIT Lincoln Laboratory por Zierler em janeiro de 1960 e, mais tarde, em um artigo em junho de 1961.[2] O decodificador de Gorenstein-Zierler e o trabalho relacionado sobre códigos BCH são descritos no livro "Error-Correcting Codes" de W. Wesley Peterson (1961).[3] Por volta de 1963 (ou possivelmente antes), J.J. Stone (e outros)[quem?] reconheceram que os códigos de Reed-Solomon poderiam usar o esquema BCH de utilizar um polinômio gerador fixo, tornando tais códigos uma classe especial de códigos BCH,[4] mas os códigos de Reed-Solomon baseados no esquema de codificação original não são uma classe de códigos BCH e, dependendo do conjunto de pontos de avaliação, eles nem sequer são códigos cíclicos.

Em 1969, um decodificador de esquema BCH aprimorado foi desenvolvido por Elwyn Berlekamp e James Massey e desde então ficou conhecido como o algoritmo de decodificação de Berlekamp-Massey.

Em 1975, outro decodificador de esquema BCH aprimorado foi desenvolvido por Yasuo Sugiyama, baseado no algoritmo de Euclides estendido.[5]

Em 1977, os códigos de Reed-Solomon foram implementados no Programa Voyager na forma de códigos de correção de erro concatenados. A primeira aplicação comercial em produtos de consumo produzidos em massa apareceu em 1982 com o compact disc (CD), onde são usados dois códigos de Reed-Solomon entrelaçados. Hoje, os códigos de Reed-Solomon são amplamente implementados em dispositivos de armazenamento digital e padrões de comunicação digital, embora estejam sendo lentamente substituídos pelos códigos Bose-Chaudhuri-Hocquenghem (BCH). Por exemplo, os códigos de Reed-Solomon são usados no padrão de Digital Video Broadcasting (DVB) DVB-S, em conjunto com um código interno convolucional, mas os códigos BCH são usados com LDPC no seu sucessor, o DVB-S2.

Em 1986, um decodificador de esquema original conhecido como o Algoritmo de Berlekamp-Welch foi desenvolvido.

Em 1996, variações dos decodificadores de esquema original chamadas de decodificadores em lista (list decoders) ou decodificadores de decisão suave (soft decoders) foram desenvolvidas por Madhu Sudan e outros, e o trabalho continua nesses tipos de decodificadores (veja Algoritmo de decodificação em lista de Guruswami-Sudan).

Em 2002, outro decodificador de esquema original foi desenvolvido por Shuhong Gao, baseado no algoritmo de Euclides estendido.[6]

Aplicações

[editar | editar código]

Armazenamento de dados

[editar | editar código]

A codificação de Reed-Solomon é amplamente utilizada em sistemas de armazenamento em massa para corrigir os erros em rajada associados a defeitos na mídia.

A codificação de Reed-Solomon é um componente-chave do CD (compact disc). Foi o primeiro uso de codificação forte para correção de erros num produto de consumo produzido em massa, e o DAT e o DVD usam esquemas semelhantes. No CD, duas camadas de codificação Reed-Solomon separadas por um entrelaçador convolucional de 28 vias produzem um esquema chamado Codificação Reed-Solomon de Entrelaçamento Cruzado (CIRC). O primeiro elemento de um decodificador CIRC é um código Reed-Solomon interno relativamente fraco, encurtado de um código com símbolos de 8 bits. Este código pode corrigir até erros de byte por bloco de 32 bytes. Mais importante ainda, ele sinaliza como apagamentos (erasures) quaisquer blocos incorrigíveis, ou seja, blocos com mais de erros de byte. Os blocos de 28 bytes decodificados, com indicações de apagamento, são então distribuídos pelo desentrelaçador para diferentes blocos do código externo . Graças ao desentrelaçamento, um bloco de 28 bytes apagado do código interno torna-se um único byte apagado em cada um dos 28 blocos do código externo. O código externo corrige isso facilmente, já que pode lidar com até apagamentos desse tipo por bloco.

O resultado é um CIRC que pode corrigir completamente rajadas de erros de até **4000 bits**, ou cerca de **2,5 mm** na superfície do disco. Esse código é tão forte que a maioria dos erros de reprodução de CD é quase certamente causada por erros de rastreamento que fazem o laser pular de trilha, não por rajadas de erros incorrigíveis.[7]

Os DVDs usam um esquema semelhante, mas com blocos muito maiores, um código interno e um código externo .

A correção de erros de Reed-Solomon também é usada em arquivos parchive que são comumente postados acompanhando arquivos multimídia na USENET. O serviço distribuído de armazenamento online Wuala (descontinuado em 2015) também usava Reed-Solomon ao fragmentar arquivos.

Código de barras

[editar | editar código]

Quase todos os códigos de barras bidimensionais, como PDF-417, MaxiCode, Datamatrix, QR Code, Aztec Code e Han Xin code, usam a correção de erros de Reed-Solomon para permitir a leitura correta mesmo que uma parte do código de barras esteja danificada. Quando o leitor de código de barras não consegue reconhecer um símbolo do código, ele o tratará como um apagamento.

A codificação de Reed-Solomon é menos comum em códigos de barras unidimensionais, mas é usada pela simbologia PostBar.

Transmissão de dados

[editar | editar código]

Formas especializadas de códigos Reed-Solomon, especificamente Cauchy-RS e Vandermonde-RS, podem ser usadas para superar a natureza não confiável da transmissão de dados em canais de apagamento. O processo de codificação pressupõe a geração de um código que resulta em palavras-código de comprimento de símbolos, cada uma armazenando símbolos de dados, que são então enviadas através de um canal de apagamento.

Qualquer combinação de palavras-código recebidas na outra extremidade é suficiente para reconstruir todas as palavras-código. A taxa de código é geralmente definida como , a menos que a probabilidade de apagamento do canal possa ser modelada adequadamente e verifique-se ser menor. Em conclusão, geralmente é , o que significa que pelo menos metade de todas as palavras-código enviadas deve ser recebida para que seja possível reconstruir a totalidade das palavras-código enviadas.

Os códigos Reed-Solomon também são usados em sistemas xDSL e nas Space Communications Protocol Specifications do CCSDS como uma forma de correção antecipada de erros (FEC).

Transmissão espacial

[editar | editar código]
Sistema de codificação concatenada de espaço profundo.[8] Notação: (comprimento de restrição = 7, taxa de código = )

Uma aplicação significativa da codificação de Reed-Solomon foi na codificação das imagens digitais enviadas de volta pelo Programa Voyager.

A Voyager introduziu a codificação Reed-Solomon concatenada com códigos convolucionais, uma prática que desde então se tornou muito difundida em comunicações de espaço profundo e via satélite (por exemplo, transmissão digital direta).

Os decodificadores de Viterbi tendem a produzir erros em rajadas curtas. A correção desses erros em rajada é um trabalho feito da melhor forma por códigos de Reed-Solomon curtos ou simplificados.

Versões modernas da codificação convolucional decodificada por Viterbi e concatenada com Reed-Solomon foram e são usadas nas missões Mars Pathfinder, Galileo, Mars Exploration Rover e Cassini, onde operam a cerca de **1** a **1,5 dB** do limite máximo, a capacidade de Shannon.

Estes códigos concatenados estão agora a ser substituídos por turbo códigos mais poderosos:

Esquemas de codificação de canal usados por missões da NASA[9]
Anos Código Missão(ões)
1958–presente Não codificado Explorer, Mariner, muitas outras
1968–1978 códigos convolucionais (CC) Pioneer, Venus
1969–1975 Código de Reed-Muller Mariner, Viking
1977–presente Código de Golay binário Voyager
1977–presente Voyager, Galileo, muitas outras
1989–2003 Voyager
1989–2003 Galileo
1996–presente Cassini, Mars Pathfinder, outras
2004–presente Turbo códigos[10] Messenger, Stereo, MRO, MSL, outras
est. 2009 Códigos LDPC Constellation, M2020, MAVEN

Construções (codificação)

[editar | editar código]

O código de Reed-Solomon é na verdade uma família de códigos, onde cada código é caracterizado por três parâmetros: o tamanho do alfabeto , um comprimento de bloco e um comprimento de mensagem , com . O conjunto de símbolos do alfabeto é interpretado como o corpo finito de ordem e, assim, deve ser uma potência de primo. Nas parametrizações mais úteis do código de Reed-Solomon, o comprimento do bloco costuma ser algum múltiplo constante do comprimento da mensagem, isto é, a taxa é alguma constante, e além disso, o comprimento do bloco é igual ao tamanho do alfabeto ou um a menos que ele, isto é, ou .[carece de fontes?]

A visão original de Reed & Solomon: A palavra-código como uma sequência de valores

[editar | editar código]

Existem diferentes procedimentos de codificação para o código de Reed-Solomon e, assim, há diferentes formas de descrever o conjunto de todas as palavras-código. Na visão original de Reed e Solomon, cada palavra-código do código de Reed-Solomon é uma sequência de valores de uma função polinomial de grau menor que .[11] Para obter uma palavra-código do código de Reed-Solomon, os símbolos da mensagem (cada um dentro do alfabeto de tamanho ) são tratados como os coeficientes de um polinômio de grau menor que , sobre o corpo finito com elementos. Por sua vez, o polinômio é avaliado em um conjunto de pontos distintos em qualquer ordem do corpo , e a sequência de valores é a palavra-código correspondente. Escolhas comuns para um conjunto de pontos de avaliação incluem , , ou para , , ... , onde é um elemento primitivo de .

Formalmente, o conjunto de palavras-código do código de Reed-Solomon é definido da seguinte forma: Como quaisquer dois polinômios distintos de grau menor que concordam em no máximo pontos, isso significa que quaisquer duas palavras-código do código de Reed-Solomon discordam em pelo menos posições. Além disso, existem dois polinômios que concordam em pontos mas não são iguais e, assim, a distância do código de Reed-Solomon é exatamente . Então a distância relativa é , onde é a taxa. Esse compromisso entre a distância relativa e a taxa é assintoticamente ótimo já que, pelo Limite de Singleton, todo código satisfaz . Sendo um código que alcança este compromisso ótimo, o código de Reed-Solomon pertence à classe dos códigos separáveis de distância máxima (MDS).

Enquanto o número de polinômios diferentes de grau menor que e o número de mensagens diferentes são ambos iguais a , e portanto cada mensagem pode ser mapeada de forma única para um tal polinômio, existem diferentes formas de fazer esta codificação. A construção original de Reed & Solomon interpreta a mensagem como os coeficientes do polinômio , ao passo que construções subsequentes interpretam a mensagem como os valores do polinômio nos primeiros pontos e obtêm o polinômio interpolando esses valores com um polinômio de grau menor que . O último procedimento de codificação, embora seja ligeiramente menos eficiente, tem a vantagem de dar origem a um código sistemático, ou seja, a mensagem original está sempre contida como uma subsequência da palavra-código.[11]

Procedimento de codificação simples: A mensagem como uma sequência de coeficientes

[editar | editar código]

Na construção original de Reed e Solomon, a mensagem é mapeada para o polinômio com A palavra-código de é obtida avaliando em pontos diferentes do corpo .[11] Assim, a função de codificação clássica para o código de Reed-Solomon é definida da seguinte forma:

Esta função é um mapeamento linear, isto é, ela satisfaz para a seguinte matriz de dimensões com elementos de .

Esta matriz é uma Matriz de Vandermonde sobre . Em outras palavras, o código de Reed-Solomon é um código linear, e no procedimento clássico de codificação, sua matriz geradora é .

Procedimento de codificação sistemática: A mensagem como uma sequência inicial de valores

[editar | editar código]

Existem procedimentos de codificação alternativos que produzem um código de Reed-Solomon sistemático. Um método usa a Interpolação polinomial de Lagrange para calcular o polinômio tal que Então é avaliado nos outros pontos .

Esta função é um mapeamento linear. Para gerar a matriz de codificação sistemática correspondente , multiplica-se a matriz pela inversa da submatriz quadrada à esquerda de .

para a seguinte matriz de dimensões com elementos de .

Transformada discreta de Fourier e sua inversa

[editar | editar código]

Uma transformada discreta de Fourier é essencialmente o mesmo que o procedimento de codificação; ela usa o polinômio gerador para mapear um conjunto de pontos de avaliação nos valores da mensagem como mostrado acima:

A transformada inversa de Fourier poderia ser usada para converter um conjunto livre de erros de valores de mensagem de volta no polinômio de codificação de coeficientes, com a restrição de que para isso funcionar, o conjunto de pontos de avaliação usado para codificar a mensagem deve ser um conjunto de potências crescentes de :

Contudo, a interpolação de Lagrange realiza a mesma conversão sem a restrição sobre o conjunto de pontos de avaliação ou a exigência de um conjunto livre de erros de valores de mensagem e é usada para codificação sistemática, e em um dos passos do decodificador de Gao.

A visão BCH: A palavra-código como uma sequência de coeficientes

[editar | editar código]

Note que o Código BCH e a maioria das implementações da visão BCH têm o termo mais significativo primeiro. Nesta visão, a mensagem é interpretada como os coeficientes de um polinômio :

Um polinômio gerador é definido como o polinômio cujas raízes são potências sequenciais do elemento primitivo do Corpo de Galois

Para um "código em sentido estrito" (narrow sense code), .

A codificação calcula um polinômio de palavra-código que é um múltiplo exato de .

Procedimento de codificação simples

[editar | editar código]

O remetente calcula um polinômio relacionado de grau onde e envia o polinômio . O polinômio é construído multiplicando o polinômio da mensagem , que tem grau , com o polinômio gerador de grau que é conhecido por ambos, remetente e receptor. .

Esta função é um mapeamento linear, isto é, ela satisfaz para a seguinte matriz de dimensões com elementos de .

para a seguinte matriz de dimensões com elementos de .

Procedimento de codificação sistemática

[editar | editar código]

O procedimento de codificação para a visão BCH dos códigos de Reed-Solomon pode ser modificado para produzir um procedimento de codificação sistemático, no qual cada palavra-código contém a mensagem como um prefixo, e simplesmente adiciona símbolos de correção de erros como um sufixo. Aqui, em vez de enviar , o codificador constrói o polinômio transmitido tal que os coeficientes dos maiores monômios são iguais aos coeficientes correspondentes de , e os coeficientes de menor ordem de são escolhidos de tal maneira que torna-se exatamente divisível por . Então os coeficientes de são uma subsequência dos coeficientes de . Para obter um código que seja globalmente sistemático, nós construímos o polinômio de mensagem interpretando a mensagem como a sequência de seus coeficientes.

Formalmente, a construção é feita multiplicando por para dar espaço aos símbolos de verificação, dividindo esse produto por para encontrar o resto, e depois compensando esse resto o subtraindo. Os símbolos de verificação são criados computando o resto :

O resto tem grau de no máximo , enquanto que os coeficientes de no polinômio são zero. Portanto, a seguinte definição da palavra-código tem a propriedade de que os primeiros coeficientes são idênticos aos coeficientes de :

Como resultado, é exatamente divisível por :[12]

Esta função é um mapeamento linear. Para gerar a matriz de codificação sistemática correspondente , multiplica-se a matriz pela inversa da submatriz quadrada à esquerda de (ou define a submatriz quadrada à esquerda de como a matriz identidade e codifica cada linha).

para a seguinte matriz de dimensões com elementos de .

Propriedades

[editar | editar código]

O código de Reed-Solomon é um código ; em outras palavras, é um código de bloco linear de comprimento (sobre ) com dimensão e distância de Hamming mínima . O código de Reed-Solomon é ótimo no sentido de que a distância mínima tem o valor máximo possível para um código linear de tamanho ; isto é conhecido como o Limite de Singleton. Um código desse tipo também é chamado de código separável de distância máxima (MDS).

A capacidade de correção de erros de um código de Reed-Solomon é determinada pela sua distância mínima, ou equivalentemente, por , a medida de redundância no bloco. Se as localizações dos símbolos errôneos não forem conhecidas antecipadamente, então um código de Reed-Solomon pode corrigir até símbolos errôneos, ou seja, pode corrigir metade dos erros em relação ao número de símbolos redundantes adicionados ao bloco. Às vezes, as localizações dos erros são conhecidas antecipadamente (por exemplo, "informação lateral" nas relações sinal-ruído do demodulador) — estes são chamados de apagamentos (erasures). Um código de Reed-Solomon (como qualquer código MDS) é capaz de corrigir o dobro de apagamentos em relação a erros, e qualquer combinação de erros e apagamentos pode ser corrigida desde que a relação seja satisfeita, onde é o número de erros e é o número de apagamentos no bloco.

Desempenho teórico da BER do código de Reed-Solomon (N=255, K=233, QPSK, AWGN). Característica em forma de degrau

O limite de erro teórico pode ser descrito através da seguinte fórmula para o canal AWGN para FSK:[13] e para outros esquemas de modulação: onde , , , é a taxa de erro de símbolo no caso AWGN não codificado e é a ordem de modulação.

Para usos práticos dos códigos de Reed-Solomon, é comum usar um corpo finito com elementos. Neste caso, cada símbolo pode ser representado como um valor de bits. O remetente envia os pontos de dados como blocos codificados, e o número de símbolos no bloco codificado é . Assim, um código de Reed-Solomon operando em símbolos de 8 bits tem símbolos por bloco. (Este é um valor muito popular devido à prevalência de sistemas de computador orientados a bytes). O número , com , de símbolos de dados no bloco é um parâmetro de projeto. Um código comumente usado codifica símbolos de dados de oito bits mais 32 símbolos de paridade de oito bits num bloco de símbolos; isto é denotado como um código , e é capaz de corrigir até 16 erros de símbolo por bloco.

As propriedades do código de Reed-Solomon discutidas acima os tornam especialmente adequados para aplicações onde os erros ocorrem em rajadas (bursts). Isso ocorre porque não importa para o código quantos bits em um símbolo estão errados — se vários bits em um símbolo forem corrompidos, isso conta apenas como um único erro. Por outro lado, se um fluxo de dados não for caracterizado por rajadas de erros ou perdas de sinal (drop-outs), mas por erros aleatórios de bit único, um código de Reed-Solomon geralmente é uma escolha ruim em comparação com um código binário.

O código de Reed-Solomon, assim como o código convolucional, é um código transparente. Isso significa que se os símbolos do canal tiverem sido invertidos (bitwise NOT) em algum lugar ao longo da linha, os decodificadores ainda funcionarão. O resultado será a inversão dos dados originais. No entanto, o código de Reed-Solomon perde a sua transparência quando o código é encurtado (veja 'Observações' no final desta seção). Os bits "ausentes" em um código encurtado precisam ser preenchidos por zeros ou uns, dependendo se os dados estão complementados ou não. (Dito de outra forma, se os símbolos são invertidos, então o preenchimento com zeros precisa ser invertido para um preenchimento com uns.) Por este motivo, é obrigatório que o sentido dos dados (ou seja, verdadeiro ou complementado) seja resolvido antes da decodificação de Reed-Solomon.

O fato de o código de Reed-Solomon ser cíclico ou não depende de detalhes sutis da construção. Na visão original de Reed e Solomon, onde as palavras-código são os valores de um polinômio, pode-se escolher a sequência de pontos de avaliação de modo a tornar o código cíclico. Em particular, se for uma raiz primitiva do corpo , então por definição todos os elementos não nulos de assumem a forma para , onde . Cada polinômio sobre dá origem a uma palavra-código . Uma vez que a função também é um polinômio de mesmo grau, esta função dá origem a uma palavra-código ; como é válido, esta palavra-código é o deslocamento circular à esquerda da palavra-código original derivada de . Portanto, escolher uma sequência de potências de raízes primitivas como os pontos de avaliação torna o código de Reed-Solomon da visão original cíclico. Os códigos de Reed-Solomon na visão BCH são sempre cíclicos porque os códigos BCH são cíclicos.

Observações

[editar | editar código]

Os projetistas não são obrigados a usar os tamanhos "naturais" dos blocos de código de Reed-Solomon. Uma técnica conhecida como "encurtamento" (shortening) pode produzir um código menor de qualquer tamanho desejado a partir de um código maior.

Por exemplo, o código (255, 223) amplamente utilizado pode ser convertido em um código (160, 128) preenchendo a porção não utilizada do bloco de origem com 95 zeros binários e não os transmitindo. No decodificador, a mesma porção do bloco é carregada localmente com zeros binários.

O código QR, Versão 3 (29×29) usa blocos entrelaçados. A mensagem tem 26 bytes de dados e é codificada usando dois blocos de código de Reed-Solomon. Cada bloco é um código de Reed-Solomon (255, 233) encurtado para um código (35, 13).

O teorema de Delsarte-Goethals-Seidel[14] ilustra um exemplo de aplicação de códigos de Reed-Solomon encurtados. Paralelamente ao encurtamento, uma técnica conhecida como perfuração (puncturing) permite omitir alguns dos símbolos de paridade codificados.

Decodificadores da visão BCH

[editar | editar código]

Os decodificadores descritos nesta seção usam a visão BCH de uma palavra-código como uma sequência de coeficientes. Eles usam um polinômio gerador fixo conhecido tanto pelo codificador quanto pelo decodificador.

Decodificador de Peterson-Gorenstein-Zierler

[editar | editar código]

Daniel Gorenstein e Neal Zierler desenvolveram um decodificador que foi descrito em um relatório do MIT Lincoln Laboratory por Zierler em janeiro de 1960 e, mais tarde, em um artigo em junho de 1961.[15][16] O decodificador de Gorenstein-Zierler e o trabalho relacionado sobre códigos BCH estão descritos no livro Error Correcting Codes de W. Wesley Peterson (1961).[17]

Formulação

[editar | editar código]

A mensagem transmitida, , é vista como os coeficientes de um polinômio

Como resultado do procedimento de codificação de Reed-Solomon, é divisível pelo polinômio gerador onde é um elemento primitivo.

Uma vez que é um múltiplo do gerador , segue-se que ele "herda" todas as suas raízes: Portanto,

O polinômio transmitido é corrompido em trânsito por um polinômio de erro para produzir o polinômio recebido

O coeficiente será zero se não houver erro naquela potência de , e não nulo se houver um erro. Se houver erros em potências distintas de , então

O objetivo do decodificador é encontrar o número de erros (), as posições dos erros () e os valores dos erros nessas posições (). A partir disso, pode ser calculado e subtraído de para obter a mensagem enviada originalmente .

Decodificação por síndrome

[editar | editar código]

O decodificador começa avaliando o polinômio conforme recebido nos pontos . Chamamos os resultados dessa avaliação de "síndromes" . Elas são definidas como Note que porque tem raízes em , como mostrado na seção anterior.

A vantagem de analisar as síndromes é que o polinômio da mensagem é descartado. Em outras palavras, as síndromes referem-se apenas ao erro e não são afetadas pelo conteúdo real da mensagem sendo transmitida. Se todas as síndromes forem zero, o algoritmo para aqui e relata que a mensagem não foi corrompida em trânsito.

Localizadores de erros e valores de erros

[editar | editar código]

Por conveniência, defina os localizadores de erros e os valores de erros como

Então as síndromes podem ser escritas em termos desses localizadores e valores de erros como

Esta definição dos valores de síndrome é equivalente à anterior, uma vez que .

As síndromes fornecem um sistema de equações em incógnitas, mas esse sistema de equações é não linear nos e não tem uma solução óbvia. No entanto, se os fossem conhecidos (veja abaixo), então as equações de síndrome forneceriam um sistema linear de equações que pode ser facilmente resolvido para os valores de erro .

Consequentemente, o problema consiste em encontrar os , porque assim a matriz mais à esquerda seria conhecida e ambos os lados da equação poderiam ser multiplicados pela sua inversa, produzindo os .

Na variante deste algoritmo onde as localizações dos erros já são conhecidas (quando está sendo usado como um código de apagamento), este é o fim. As localizações dos erros () já são conhecidas por algum outro método (por exemplo, numa transmissão FM, as seções onde o fluxo de bits estava obscuro ou sobrecarregado com interferência são probabilisticamente determináveis a partir da análise de frequência). Neste cenário, até erros podem ser corrigidos.

O resto do algoritmo serve para localizar os erros e exigirá valores de síndrome até , em vez de apenas os usados até agora. É por isso que é necessário adicionar o dobro de símbolos de correção de erros em relação à quantidade de erros que podem ser corrigidos sem conhecer suas localizações.

Polinômio localizador de erros

[editar | editar código]

Existe uma relação de recorrência linear que dá origem a um sistema de equações lineares. A resolução dessas equações identifica essas localizações de erro .

Defina o polinômio localizador de erros como

Os zeros de são os recíprocos . Isso decorre da construção da notação de produto acima, uma vez que se , então um dos termos multiplicados será zero, , fazendo com que todo o polinômio seja avaliado como zero:

Seja um inteiro qualquer tal que . Multiplique ambos os lados por , e o resultado ainda será zero:

Somando para até , ainda será zero:

Agrupe cada termo em sua própria soma:

Extraia os valores constantes de que não são afetados pelo somatório:

Esses somatórios agora são equivalentes aos valores de síndrome, que conhecemos e podemos substituir. Isso, portanto, se reduz a

Subtraindo de ambos os lados, obtemos

Lembre-se de que foi escolhido como sendo qualquer inteiro entre e inclusive, e essa equivalência é verdadeira para todos esses valores. Portanto, temos equações lineares, não apenas uma. Este sistema de equações lineares pode, assim, ser resolvido para os coeficientes do polinômio localizador de erros:

O raciocínio acima assume que o decodificador conhece o número de erros , mas esse número ainda não foi determinado. O decodificador PGZ não determina diretamente, mas sim o busca testando valores sucessivos. O decodificador inicialmente assume o maior valor para um de teste e monta o sistema linear para esse valor. Se as equações puderem ser resolvidas (ou seja, o determinante da matriz for diferente de zero), então esse valor de teste é o número de erros. Se o sistema linear não puder ser resolvido, então o de teste é reduzido em um e o próximo sistema menor é examinado.[18]

Encontrar as raízes do polinômio localizador de erros

[editar | editar código]

Use os coeficientes encontrados no último passo para construir o polinômio de localização de erros. As raízes do polinômio de localização de erros podem ser encontradas por busca exaustiva. Os localizadores de erro são os recíprocos dessas raízes. A ordem dos coeficientes do polinômio de localização de erros pode ser invertida; nesse caso, as raízes desse polinômio invertido são os localizadores de erro (não seus recíprocos ). A Busca de Chien é uma implementação eficiente deste passo.

Calcular os valores dos erros

[editar | editar código]

Uma vez que os localizadores de erros são conhecidos, os valores dos erros podem ser determinados. Isso pode ser feito pela solução direta para na matriz de equações de erro dada acima, ou usando o Algoritmo de Forney.

Calcular as localizações dos erros

[editar | editar código]

Calcule tomando o logaritmo na base de . Isso geralmente é feito usando uma tabela de pesquisa (lookup table) pré-calculada.

Corrigir os erros

[editar | editar código]

Finalmente, é gerado a partir de e e então é subtraído de para obter a mensagem enviada originalmente , com os erros corrigidos.

Considere o código de Reed-Solomon definido em com e (isto é usado nos códigos de barras PDF417) para um código RS(7,3). O polinômio gerador é Se o polinômio da mensagem é , então uma palavra-código sistemática é codificada da seguinte forma: Erros na transmissão podem fazer com que isto seja recebido em seu lugar: As síndromes são calculadas avaliando em potências de : resultando no sistema

Usando a eliminação gaussiana, portanto com raízes e . Os coeficientes podem ser invertidos: para produzir raízes e com expoentes positivos, mas tipicamente isso não é usado. O logaritmo das raízes invertidas corresponde às localizações dos erros (da direita para a esquerda, a localização 0 é o último termo na palavra-código).

Para calcular os valores dos erros, aplique o Algoritmo de Forney:

Subtraindo do polinômio recebido reproduz-se a palavra-código original .

Decodificador de Berlekamp-Massey

[editar | editar código]

O Algoritmo de Berlekamp-Massey é um procedimento iterativo alternativo para encontrar o polinômio localizador de erros. Durante cada iteração, ele calcula uma discrepância baseada numa instância atual de com um número presumido de erros : e então ajusta e para que um recalculado seja zero. O artigo do Algoritmo de Berlekamp-Massey traz uma descrição detalhada do procedimento. No exemplo a seguir, é usado para representar .

Usando os mesmos dados do exemplo de Peterson-Gorenstein-Zierler acima:

0 732 732 1 732 1
1 637 846 1 732 2
2 762 412 412 1
3 925 576 412 2

O valor final de é o polinômio localizador de erros, .

Decodificador de Sugiyama

[editar | editar código]

Outro método iterativo para calcular tanto o polinômio localizador de erros quanto o polinômio de valor de erro é baseado na adaptação de Sugiyama do algoritmo de Euclides estendido.

Defina , e para síndromes e erros:

A equação chave é:

Para e :

Os termos do meio são zero devido à relação entre e as síndromes.

O algoritmo de Euclides estendido pode encontrar uma série de polinômios da forma

onde o grau de diminui à medida que aumenta. Assim que o grau de , então

e não precisam ser salvos, de modo que o algoritmo se torna:






enquanto grau de 
    
    
    
    

para definir o termo de menor ordem de como 1, divida e por : é o termo constante (de menor ordem) de .

Usando os mesmos dados do exemplo de Peterson-Gorenstein-Zierler acima:

−1 000
0 001
1
2

Decodificador usando transformada discreta de Fourier

[editar | editar código]

Uma transformada discreta de Fourier pode ser usada para decodificação.[19] Para evitar conflito com os nomes das síndromes, seja a palavra-código codificada. e são iguais aos descritos acima. Defina , e como as transformadas discretas de Fourier de , e . Como , e como uma transformada discreta de Fourier é um operador linear, .

Transforme em usando a transformada discreta de Fourier. Como o cálculo de uma transformada discreta de Fourier é igual ao cálculo das síndromes, coeficientes de e são iguais às síndromes:

Use de até como síndromes (são as mesmas) e gere o polinômio localizador de erros utilizando os métodos de qualquer um dos decodificadores acima.

Seja = número de erros. Gere usando os coeficientes conhecidos a , o polinômio localizador de erros, e estas fórmulas:

Em seguida, calcule e aplique a transformada inversa (interpolação polinomial) de para produzir .

Decodificação além do limite de correção de erros

[editar | editar código]

O Limite de Singleton afirma que a distância mínima de um código de bloco linear de tamanho é limitada superiormente por . A distância era geralmente entendida como um limite à capacidade de correção de erros em . O código de Reed-Solomon atinge esse limite com igualdade e, portanto, pode corrigir até erros. No entanto, esse limite de correção de erros não é exato.

Em 1999, Madhu Sudan e Venkatesan Guruswami do MIT publicaram "Improved Decoding of Reed–Solomon and Algebraic-Geometry Codes" (Decodificação Melhorada de Códigos de Reed-Solomon e de Geometria Algébrica), introduzindo um algoritmo que permitia a correção de erros além da metade da distância mínima do código.[20] Ele se aplica a códigos de Reed-Solomon e, mais geralmente, a códigos geométricos algébricos. Este algoritmo produz uma lista de palavras-código (é um algoritmo de decodificação em lista) e baseia-se na interpolação e fatoração de polinômios sobre e suas extensões.

Em 2023, teóricos da codificação mostraram que códigos de Reed-Solomon definidos sobre pontos de avaliação aleatórios podem alcançar a capacidade de decodificação em lista (até erros) sobre alfabetos de tamanho linear com alta probabilidade.[21][22][23] Esses resultados não fornecem um algoritmo para realizar a decodificação.

Decodificação por decisão suave (soft-decoding)

[editar | editar código]

Os métodos de decodificação algébrica descritos acima são métodos de decisão rígida (hard-decision), o que significa que para cada símbolo é tomada uma decisão categórica sobre o seu valor. Por exemplo, um decodificador poderia associar a cada símbolo um valor adicional correspondente à confiança do demodulador do canal na exatidão do símbolo. O advento do LDPC e dos turbo códigos, que empregam métodos iterativos de decodificação por propagação de crenças de decisão suave (soft-decision) para alcançar um desempenho de correção de erros próximo ao limite teórico, estimulou o interesse em aplicar a decodificação de decisão suave a códigos algébricos convencionais. Em 2003, Ralf Koetter e Alexander Vardy apresentaram um algoritmo de decodificação em lista algébrica de decisão suave em tempo polinomial para códigos de Reed-Solomon, que foi baseado no trabalho de Sudan e Guruswami.[24] Em 2016, Steven J. Franke e Joseph H. Taylor publicaram um novo decodificador de decisão suave.[25]

Decodificadores da visão original de Reed-Solomon

[editar | editar código]

Os decodificadores descritos nesta seção usam a visão original de Reed-Solomon de uma palavra-código como uma sequência de valores polinomiais, onde o polinômio é baseado na mensagem a ser codificada. O mesmo conjunto de valores fixos é usado pelo codificador e pelo decodificador, e o decodificador recupera o polinômio de codificação (e, opcionalmente, um polinômio localizador de erros) a partir da mensagem recebida.

Decodificador teórico

[editar | editar código]

Reed e Solomon descreveram um decodificador teórico que corrigia erros encontrando o polinômio de mensagem mais popular.[26] O decodificador conhece apenas o conjunto de valores a e qual método de codificação foi usado para gerar a sequência de valores da palavra-código. A mensagem original, o polinômio e quaisquer erros são desconhecidos. Um procedimento de decodificação poderia usar um método como a interpolação de Lagrange em vários subconjuntos de valores de palavras-código, tomados de cada vez, para produzir repetidamente polinômios potenciais, até que um número suficiente de polinômios correspondentes seja produzido para eliminar razoavelmente quaisquer erros na palavra-código recebida. Uma vez determinado um polinômio, quaisquer erros na palavra-código podem ser corrigidos recalculando os valores correspondentes da palavra-código. Infelizmente, em todos os casos, exceto nos mais simples, existem demasiados subconjuntos, tornando o algoritmo impraticável. O número de subconjuntos é o coeficiente binomial, , e a quantidade de subconjuntos é inviável até mesmo para códigos modestos. Para um código que pode corrigir erros, o decodificador teórico ingênuo examinaria 359 bilhões de subconjuntos.[carece de fontes?]

Decodificador de Berlekamp-Welch

[editar | editar código]

Em 1986, um decodificador conhecido como o Algoritmo de Berlekamp-Welch foi desenvolvido como um decodificador que é capaz de recuperar o polinômio da mensagem original, bem como um polinômio "localizador" de erro que produz zeros para os valores de entrada que correspondem a erros, com complexidade de tempo , onde é o número de valores em uma mensagem. O polinômio recuperado é então usado para recuperar (recalcular conforme necessário) a mensagem original.

Usando RS(7,3), GF(929), e o conjunto de pontos de avaliação

Se o polinômio da mensagem é

A palavra-código é

Erros de transmissão podem fazer com que isto seja recebido em vez disso:

A equação chave é:

Assuma o número máximo de erros: . A equação chave se torna:

Usando a eliminação gaussiana:

Recalcule onde para corrigir , resultando na palavra-código corrigida:

Decodificador de Gao

[editar | editar código]

Em 2002, um decodificador aprimorado foi desenvolvido por Shuhong Gao, baseado no algoritmo de Euclides estendido.[27]

  • interpolação de Lagrange de para até
  • gere e até que o grau de ; para este exemplo,
−1
0
1
2

Para duplicar os polinômios gerados por Berlekamp-Welch, divida e pelo coeficiente mais significativo de , que é .

Recalcule onde para corrigir , resultando na palavra-código corrigida:

Decodificador de síndrome

[editar | editar código]

Por volta de 2015, um decodificador aprimorado foi desenvolvido.[28] O decodificador gera síndromes e, semelhante à visão BCH, a equação chave entre o polinômio localizador de erros e as síndromes é a mesma, mas o polinômio localizador de erros tem raízes correspondentes a , e uma tabela de pesquisa (lookup table) é usada para converter as raízes em deslocamentos (offsets) de palavra-código.

Inicialização:

Um polinômio é definido: .

Um conjunto de polinômios é definido: .

Um conjunto de valores é gerado: .

Um conjunto de polinômios é gerado:

Decodificação - Uma palavra-código com possíveis erros é recebida: .

Um polinômio de síndrome é gerado: .

Se , então nenhum erro é detectado, caso contrário, o Euclides estendido começa com

, , ,

e continua até que o grau de

O polinômio localizador de erros é

e o polinômio de valor de erro é

e são divididos pelo termo menos significativo de

A derivada formal de é gerada:

Os deslocamentos dos erros correspondem às raízes de

para a raiz = ,

O valor de erro para é

.

Se , então um valor de erro correspondente a

foi detectado no deslocamento , e um valor de erro separado é calculado:

, o conjunto de correspondente às raízes de

coeficiente mais significativo de

Usando os mesmos dados do exemplo de Berlekamp-Welch

Inicialização:

0
1
2
3
4
5
6

Decodificação:

Euclides:

-1
0
1
2

divida e por

Referências

[editar | editar código]
  1. Erro de citação: Etiqueta <ref> inválida; não foi fornecido texto para as "refs" nomeadas "ReedSolomon3"
  2. Gorenstein, D.; Zierler, N. (junho de 1961). «A class of cyclic linear error-correcting codes in pm symbols». J. SIAM. 9 (2): 207–214. JSTOR 2098821. doi:10.1137/0109020
  3. Peterson, W. Wesley (1961). Error-Correcting Codes. [S.l.]: MIT Press. ISBN 978-0262160063. OCLC 859669631
  4. Peterson, W. Wesley; Weldon, E. J. (1996) [1972]. Error Correcting Codes 2ª ed. [S.l.]: MIT Press. ISBN 978-0-585-30709-1. OCLC 45727875
  5. Sugiyama, Y.; Kasahara, M.; Hirasawa, S.; Namekawa, T. (1975). «A method for solving key equation for decoding Goppa codes». Information and Control. 27 (1): 87–99. doi:10.1016/S0019-9958(75)90090-XAcessível livremente
  6. Citação: .
  7. Immink, K. A. S. (1994). «Reed–Solomon Codes and the Compact Disc». In: Wicker, Stephen B.; Bhargava, Vijay K. Reed–Solomon Codes and Their Applications. [S.l.]: IEEE Press. ISBN 978-0-7803-1025-4
  8. Hagenauer, J.; Offer, E.; Papke, L. (1994). «11. Matching Viterbi Decoders and Reed-Solomon Decoders in a Concatenated System». Reed Solomon Codes and Their Applications. [S.l.]: IEEE Press. p. 433. ISBN 9780470546345. OCLC 557445046
  9. 1 2 Andrews, K.S.; Divsalar, D.; Dolinar, S.; Hamkins, J.; Jones, C.R.; Pollara, F. (2007). «The development of turbo and LDPC codes for deep-space applications.» (PDF). Proceedings of the IEEE. 95 (11): 2142–56. doi:10.1109/JPROC.2007.905132
  10. Os autores em Andrews et al. (2007) fornecem resultados de simulação que mostram que para a mesma taxa de código (), os turbo códigos superam os códigos concatenados de Reed-Solomon em até 2 dB (taxa de erro de bit).[9]
  11. 1 2 3 Erro de citação: Etiqueta <ref> inválida; não foi fornecido texto para as "refs" nomeadas "ReedSolomon"
  12. Lin, Shu; Costello, Daniel J. (1983). Error control coding: fundamentals and applications Nachdr. ed. Englewood Cliffs, NJ: Prentice-Hall. p. 171. ISBN 978-0-13-283796-5
  13. «Analytical Expressions Used in bercoding and BERTool». Consultado em 1 de fevereiro de 2019. Cópia arquivada em 1 de fevereiro de 2019
  14. Pfender, Florian; Ziegler, Günter M. (setembro de 2004). «Kissing Numbers, Sphere Packings, and Some Unexpected Proofs» (PDF). Notices of the American Mathematical Society. 51 (8): 873–883. Consultado em 28 de setembro de 2009. Cópia arquivada (PDF) em 9 de maio de 2008. Explica o teorema de Delsarte-Goethals-Seidel como usado no contexto do código de correção de erros para compact disc.
  15. Peterson, W. (setembro de 1960). «Encoding and error-correction procedures for the Bose-Chaudhuri codes». IEEE Transactions on Information Theory. 6 (4): 459–470. Bibcode:1960IRTIT...6..459P. doi:10.1109/TIT.1960.1057586
  16. Gorenstein, Daniel; Zierler, Neal (junho de 1961). «A Class of Error-Correcting Codes in $p^m $ Symbols». Journal of the Society for Industrial and Applied Mathematics. 9 (2): 207–214. doi:10.1137/0109020
  17. Erro de citação: Etiqueta <ref> inválida; não foi fornecido texto para as "refs" nomeadas "Peterson61"
  18. Gill, John (n.d.). «EE387 Notes #7, Handout #28» (PDF). Stanford University. Consultado em 21 de abril de 2010. Arquivado do original (PDF) em 30 de junho de 2014
  19. Lin, Shu; Costello, Daniel J. (2004). Error control coding: fundamentals and applications 2ª. ed. Upper Saddle River, NJ: Pearson/Prentice Hall. pp. 255–262. ISBN 978-0130426727
  20. Citação:
  21. Brakensiek, Joshua; Gopi, Sivakanth; Makam, Visu (2 de junho de 2023). «Generic Reed-Solomon Codes Achieve List-Decoding Capacity». Proceedings of the 55th Annual ACM Symposium on Theory of Computing. Col: STOC 2023. New York, NY, USA: Association for Computing Machinery. pp. 1488–1501. ISBN 978-1-4503-9913-5. arXiv:2206.05256Acessível livremente. doi:10.1145/3564246.3585128 Parâmetro desconhecido |capitulo-url= ignorado (ajuda)
  22. Guo, Zeyu; Zhang, Zihan (2023). «Randomly Punctured Reed-Solomon Codes Achieve the List Decoding Capacity over Polynomial-Size Alphabets». 2023 IEEE 64th Annual Symposium on Foundations of Computer Science (FOCS). Col: FOCS 2023, Santa Cruz, CA, USA, 2023. [S.l.: s.n.] pp. 164–176. ISBN 979-8-3503-1894-4. arXiv:2304.01403Acessível livremente. doi:10.1109/FOCS57990.2023.00019 Parâmetro desconhecido |capitulo-url= ignorado (ajuda)
  23. Citação:
  24. Koetter, Ralf; Vardy, Alexander (2003). «Algebraic soft-decision decoding of Reed–Solomon codes». IEEE Transactions on Information Theory. 49 (11): 2809–2825. Bibcode:2003ITIT...49.2809K. CiteSeerX 10.1.1.13.2021Acessível livremente. doi:10.1109/TIT.2003.819332
  25. Franke, Steven J.; Taylor, Joseph H. (2016). «Open Source Soft-Decision Decoder for the JT65 (63,12) Reed–Solomon Code» (PDF). QEX (Maio/Junho): 8–17. Consultado em 7 de junho de 2017. Cópia arquivada (PDF) em 9 de março de 2017
  26. Erro de citação: Etiqueta <ref> inválida; não foi fornecido texto para as "refs" nomeadas "ReedSolomon2"
  27. «A new algorithm for decoding Reed-Solomon codes» (PDF). Cópia arquivada (PDF) em 12 de julho de 2012
  28. «Generalized Reed-Solomon Codes» (PDF). Cópia arquivada (PDF) em 3 de dezembro de 2020

Bibliografia

[editar | editar código]

Ligações externas

[editar | editar código]