Código de Hamming: corrigir um bit identificando a sua posição

Defina os quatro bits de dados e inverta quaisquer bits no canal, usando os botões ou clicando no diagrama. O descodificador repete as três verificações de paridade, lê as que falham como um número binário e inverte esse bit. Percorra o processo uma vez e depois experimente duas inversões.

A carregar a simulação interativa...

Lição

A teoria — Código de Hamming: corrigir um bit identificando a sua posição

Um código de Hamming acrescenta bits de paridade aos dados para localizar e corrigir um bit invertido. Cada bit de paridade faz com que um conjunto escolhido de posições contenha um número par de uns; é uma verificação de paridade. O descodificador repete as verificações sobre a palavra recebida. O padrão das que falham, a síndrome, é lido como um número binário e indica a posição do bit errado; 0 significa que não há nenhum. Um dígito de controlo apenas consegue indicar que algo está errado; este código indica onde. O código estendido acrescenta um bit que torna par a palavra inteira. Corrige então qualquer inversão isolada e deteta quaisquer duas, sem as corrigir: SECDED.

O que significa cada símbolo

dᵢ
os quatro bits de dados, nas posições 3, 5, 6 e 7
p₁, p₂, p₄
os bits de paridade, cada um na posição que lhe dá o nome; p0 é o bit global do código estendido
s
a síndrome, 4s4 + 2s2 + s1, em que sk vale 1 quando o círculo k contém um número ímpar de uns à chegada
P
a paridade dos oito bits recebidos no código estendido: 1 significa que houve um número ímpar de inversões
p
a taxa de erro de bit, isto é, a probabilidade de qualquer bit se inverter, independentemente dos restantes
Pressupõe
Cada bit se inverte independentemente, sempre com a mesma probabilidade p. Os canais e as memórias reais também falham em rajadas, atingindo de uma vez vários bits vizinhos; uma rajada é precisamente o tipo de inversão múltipla que estes códigos tratam pior.
Falha quando
Com três inversões. O código estendido interpreta três inversões como uma, pois a verificação global resulta ímpar, e corrige um bit que estava certo: a tabela completa mostra todas as 896 inversões triplas a entregar dados errados sem sinalização.

A soma dos círculos que falham indica o bit invertido 🖖

Carregue em Uma inversão. O bit 5 é invertido no canal; os círculos 1 e 4 passam a conter um número ímpar de uns, enquanto o círculo 2 continua par: 1 + 4 = 5. Esta coincidência não foi preparada pelo exemplo. O círculo k verifica exatamente as posições cuja representação binária contém k; assim, um bit errado na posição i altera precisamente os círculos cuja soma é i. A posição de cada bit no diagrama é o seu endereço. Foi isto que Hamming procurou em 1950: um «número de verificação» que indicasse a posição de qualquer erro isolado, reservando o zero para a ausência de erros. Três verificações permitem oito respostas, exatamente as necessárias para a palavra de sete bits: sete posições e «sem erro». Não sobra nenhuma. Das 128 palavras de sete bits, 16 são palavras de código; as outras 112 resultam de uma única inversão e estão todas a uma inversão de exatamente uma palavra de código. A tabela sob o gráfico descodifica corretamente as 112. A razão para os bits de paridade ocuparem as posições 1, 2 e 4 é mais simples do que parece. Essas posições têm um único 1 na representação binária, pelo que cada bit de paridade pertence apenas a um círculo e pode ser definido pela sua própria verificação, precisamente a justificação apresentada por Hamming.

Duas inversões levam o descodificador a estragar um terceiro bit 🖖

Carregue em Duas inversões. Os bits 3 e 5 ficam errados. O círculo 1 contém ambos, sofre duas alterações e continua par; os círculos 2 e 4 tornam-se ímpares e a síndrome indica 6, uma posição perfeitamente válida. O descodificador inverte o bit 6, que estava certo. À chegada havia dois bits de dados errados; depois da correção há três. A grelha mostra o mesmo resultado para todos os pares: os 21, portanto todas as 336 inversões duplas nas 16 palavras de dados, entregam dados errados sem sinalização. Carregue em Só bits de paridade: as posições 1 e 2 não transportam dados, portanto estes chegam intactos, mas a síndrome 3 manda o descodificador estragar d1. Agora carregue em Estendido, duas. O oitavo bit torna par o conjunto dos oito; uma inversão deixa sempre a verificação global ímpar, enquanto duas a deixam par. Perante uma verificação global par e uma síndrome diferente de zero, o descodificador sinaliza a palavra sem lhe tocar, em todas as 448 inversões duplas. Não consegue corrigi-las: 3 e 5 produzem a síndrome 6, tal como 1 e 7. Hamming começou precisamente pela necessidade de sinalizar. O seu artigo de 1950 abre com os dois computadores de relés construídos pelos Bell Labs para o Aberdeen Proving Ground. Nenhuma falha de relé passava despercebida; no período inicial ocorriam cerca de duas ou três por dia entre 8 900 relés e, quando as máquinas funcionavam sem supervisão durante as noites e os fins de semana, paravam com frequência.

Enviar cada bit duas vezes custa os mesmos oito bits e nada corrige 🖖

Repetir cada bit duas vezes e usar o código estendido consome, em ambos os casos, oito bits para transmitir quatro. Quando as duas cópias divergem, sabe-se que houve um erro, mas não qual delas está certa; o recetor só pode sinalizar o bloco. Para p = 0,01, isso acontece em 7,69×10⁻² dos blocos, enquanto 3,77×10⁻⁴ passam errados quando ambas as cópias de um bit se invertem. O código de Hamming estendido corrige todas as inversões isoladas, sinaliza 2,64×10⁻³ e deixa passar 5,34×10⁻⁵: com o mesmo número de bits, produz 29 vezes menos sinalizações e 7 vezes menos blocos errados. As linhas tracejadas e contínuas mostram a sua vantagem nas duas medidas até p ultrapassar 0,066, valor correspondente a um canal que inverte um bit em cada quinze. Repetir cada bit três vezes supera o código de sete bits por bloco em todos os valores de p disponíveis no seletor, 1,19×10⁻³ contra 2,03×10⁻³ neste ponto. Contudo, usa 12 bits em vez de 7; por isso, a comparação justa é a que usa oito.

Problema resolvido na íntegra

  1. Quantos bits de paridade exige uma palavra de 64 bits? 4 passos

    Proteja 64 bits de dados da mesma forma. Carregue em Estendido, uma: quatro bits de paridade para quatro bits de dados, com uma taxa de 50,0%. Determine quantos bits de paridade precisa uma palavra de 64 bits para oferecer a mesma garantia, corrigir qualquer inversão isolada e sinalizar quaisquer duas, e calcule o custo da palavra mais longa para p = 0,001, o valor dessa predefinição.

    Abrir este problema na ferramenta

    1. Com r verificações, a síndrome pode assumir 2r valores. Um tem de significar «sem erro» e cada uma das m + r posições precisa do seu próprio valor, portanto 2r ≥ m + r + 1. Nesta página, m = 4 e r = 3 satisfaz a desigualdade à justa, sem qualquer valor livre.

    2. Para m = 64, seis verificações dão 64 valores, quando são necessários 71; sete dão 128, suficientes para 72. Assim, 71 bits permitem corrigir qualquer inversão isolada.

    3. Acrescentando um bit global, obtêm-se 72 bits, dos quais 8 são de paridade, e uma taxa de 88,9%, contra os 50,0% da página.

    4. O preço a pagar é que uma palavra mais longa acumula duas inversões com maior frequência, e o SECDED já não consegue corrigi-las. Para uma palavra de 8 bits, essa probabilidade é a soma dos dois valores apresentados na página.

    Resposta

    Oito bits de paridade, uma palavra de 72 bits, taxa de 88,9%. Para p = 0,001, a probabilidade de conter duas ou mais inversões é 2,44×10⁻³. Se os mesmos 64 bits forem divididos em dezasseis palavras de 8 bits, perdem-se quando pelo menos uma delas se perde, com probabilidade 4,46×10⁻⁴. A palavra longa tem uma probabilidade cerca de 5,5 vezes maior de perder os seus 64 bits, em troca de usar oito vezes menos bits de paridade.

Percurso de aprendizagem

Por que razão um algoritmo está correto

Referências (2)