Códigos de bloco

O problema de codificação de canal

Considere o modelo de comunicação abaixo.

block-diagram-1.svg

No modelo, a informação consiste em uma sequência de bits, aqui assumidos independentes e equiprováveis. Essa informação deve ser transmitida através de um canal de comunicação, modelado por um sistema estocástico que tem em sua entrada e em sua saída sequências de números complexos.

Para possibilitar a comunicação, é necessário realizar codificação de canal. No transmissor, o codificador de canal é responsável por mapear os bits de informação na sequência complexa que será a entrada do canal. No receptor, o decodificador de canal é responsável por mapear a sequência complexa obtida na saída do canal em uma estimativa dos bits de informação.

Uma possível abordagem para o problema de codificação de canal consiste na separação em duas camadas: controle de erros e modulação. Nesse caso, o codificador de canal é composto por um codificador binário seguido de um modulador, enquanto o decodificador de canal é composto por um demodulador seguido de um decodificador binário.

block-diagram-2.svg

O codificador binário recebe como entrada uma sequência de bits e gera como saída outra sequência de bits. Seu papel é inserir redundância na informação de modo a facilitar a correção de erros no receptor. O decodificador binário, por sua vez, recebe como entrada uma sequência de bits (que pode ser encarada como sendo a sequência na saída do codificador binário, mas com alguns bits trocados) e tem como objetivo estimar os bits de informação originais, explorando a redundância inserida pelo codificador. Note que a cascata modulador–canal–demodulador pode ser abstraída como um canal de comunicação que tem como entrada e saída sequências de bits.

Obs.: Essa nomenclatura, em que o termo “codificação de canal” engloba tanto a modulação quanto o controle de erros, é baseada em Gallager: Principles of Digital Communication (2008). A maioria dos autores utiliza o termo “codificação de canal” para se referir exclusivamente ao controle de erros.

É importante destacar que a separação entre controle de erros e modulação nem sempre é a melhor solução para o problema de codificação de canal. Em muitos casos, especialmente quando há limitação de largura de banda, controle de erros e modulação são realizados conjuntamente em uma técnica conhecida como modulação codificada.

Códigos de bloco

Na codificação de bloco, a informação é segmentada em blocos de $k$ bits, que são mapeados em blocos de $n$ bits pelo codificador. Como o código deve inserir redundância na informação, deve-se ter $n > k$. O parâmetro $R = k/n$ é chamado de taxa de codificação e indica a quantidade de bits de informação por bit transmitido.

block-code.svg

Utiliza-se a nomenclatura “código $(n, k)$” para se referir a um código de bloco com $n$ bits na saída do codificador e $k$ bits na entrada.

Curiosidade.

A sonda espacial Mariner 9 empregava um código de Reed–Muller com parâmetros $(32, 6)$. Já o padrão da Ethernet 10GBASE-T usa um código LDPC com parâmetros $(2048, 1723)$.

Adotando a separação controle-de-erros–modulação descrita acima, obtém-se o diagrama de bloco a seguir, em que o canal binário pode ser modelado como uma soma módulo 2 (xor) elemento-a-elemento entre a palavra-código e um padrão de erro. O padrão de erro é uma sequência de $n$ bits contendo $\bit{1}$ nas posições em que ocorreu troca de bit e $\bit{0}$ nas demais posições.

block-diagram-3.svg
Símbolo Descrição Tamanho
$u$ mensagem $k$ bits
$v$ palavra-código $n$ bits
$e$ padrão de erro $n$ bits
$b$ palavra recebida $n$ bits
$\hat{u}$ estimativa da mensagem $k$ bits

Exemplos

Exemplo. Código de repetição $(3, 1)$

No código de repetição $(3, 1)$, o codificador repete o único bit da mensagem três vezes. O decodificador tem como saída o bit que aparece mais vezes na palavra recebida (decodificação por “maioria de votos”).

Solução.

Codificador

$u$ $v$
$\bit{0}$ $\bit{000}$
$\bit{1}$ $\bit{111}$

Decodificador

$b$ $\hat{u} = \Dec(b)$
$\bit{000}$ $\bit{0}$
$\bit{001}$ $\bit{0}$
$\bit{010}$ $\bit{0}$
$\bit{011}$ $\bit{1}$
$\bit{100}$ $\bit{0}$
$\bit{101}$ $\bit{1}$
$\bit{110}$ $\bit{1}$
$\bit{111}$ $\bit{1}$

Se houver uma única troca de bit pelo canal, qualquer que seja a posição, o código é capaz de corrigir o erro. A taxa de codificação é $R = 1/3$.

Exemplo. Código de paridade simples $(3, 2)$

No código de paridade simples $(3, 2)$, o codificador acrescenta um bit de paridade aos dois bits da mensagem de modo que a quantidade de bits $\bit{1}$ na palavra-código seja sempre par. O decodificador verifica a paridade da palavra recebida, tendo como saída os dois primeiros bits da palavra, caso a paridade seja par, ou indicando erro, caso a paridade seja ímpar.

Solução.

Codificador

$u$ $v$
$\bit{00}$ $\bit{000}$
$\bit{01}$ $\bit{011}$
$\bit{10}$ $\bit{101}$
$\bit{11}$ $\bit{110}$

Decodificador

$b$ $\hat{u} = \Dec(b)$
$\bit{000}$ $\bit{00}$
$\bit{001}$ $\mathsf{E}$
$\bit{010}$ $\mathsf{E}$
$\bit{011}$ $\bit{01}$
$\bit{100}$ $\mathsf{E}$
$\bit{101}$ $\bit{10}$
$\bit{110}$ $\bit{11}$
$\bit{111}$ $\mathsf{E}$

Se houver uma única troca de bit pelo canal, qualquer que seja a posição, o código é capaz de detectar o erro, mas não de corrigi-lo. A taxa de codificação é $R = 2/3$.

Exemplo. Código de Hamming $(7, 4)$

O código de Hamming $(7,4)$ foi proposto por Richard W. Hamming em 1950. O codificador mapeia uma mensagem de quatro bits

\[ u = [u_1 ~~ u_2 ~~ u_3 ~~ u_4] \]

em uma palavra-código de sete bits

\[ v = [v_1 ~~ v_2 ~~ v_3 ~~ v_4 ~~ v_5 ~~ v_6 ~~ v_7] = [u_1 ~~ u_2 ~~ u_3 ~~ u_4 ~~ p_1 ~~ p_2 ~~ p_3], \]

onde os bits de paridade $p_1$, $p_2$, $p_3$ são escolhidos de modo que a paridade de cada um dos círculos abaixo seja par.

hamm74.svg
Bell-Labs-Hamming3-cropped.jpg
Richard W. Hamming (1915–1998). Copyright by Nokia Bell Labs. Fonte: PSD Trailblazers (The University of Chicago).

A decodificação é feita da seguinte forma. Calcule as paridades dos círculos e verifique se são todas pares. Se sim, declare que não houve erro. Senão, identifique qual dos bits foi trocado e inverta-o.

Solução.

A tabela de codificação tem $2^4 = 16$ entradas e é mostrada abaixo.

$u$ $v$
$\bit{0000}$ $\bit{0000000}$
$\bit{0001}$ $\bit{0001111}$
$\bit{0010}$ $\bit{0010011}$
$\bit{0011}$ $\bit{0011100}$
$\bit{0100}$ $\bit{0100101}$
$\bit{0101}$ $\bit{0101010}$
$\bit{0110}$ $\bit{0110110}$
$\bit{0111}$ $\bit{0111001}$
$\bit{1000}$ $\bit{1000110}$
$\bit{1001}$ $\bit{1001001}$
$\bit{1010}$ $\bit{1010101}$
$\bit{1011}$ $\bit{1011010}$
$\bit{1100}$ $\bit{1100011}$
$\bit{1101}$ $\bit{1101100}$
$\bit{1110}$ $\bit{1110000}$
$\bit{1111}$ $\bit{1111111}$

Como exemplo, suponha que a mensagem seja $u = \bit{1011}$. O codificador mapeia $u$ em $v = \bit{1011010}$, de acordo com a figura abaixo.

hamm74-ex-enc.svg

A tabela de decodificação tem 128 entradas e não será mostrada aqui. Como exemplo, suponha que seja transmitido $v = \bit{1011010}$, mas que haja troca de bit na terceira posição, de modo que a palavra recebida seja $b = \bit{1001010}$. A figura abaixo mostra os bits de $b$ dispostos nos círculos.

hamm74-ex-dec.svg

Os dois círculos de baixo possuem paridade ímpar (incorreta), enquanto o círculo de cima possui paridade par (correta). Portanto, o bit que deve ser invertido é $b_3$. Assim, a mensagem estimada é $\hat{u} = \bit{1001}$.

Se houver uma única troca de bit pelo canal, qualquer que seja a posição, o código é capaz de corrigir o erro. A taxa de codificação é $R = 4/7$.

Códigos sistemáticos

Definição. Código sistemático

Um código de bloco é dito ser sistemático se os bits da mensagem podem ser encontrados inalterados na palavra-código, em posições pré-determinadas (por exemplo, nos $k$ primeiros bits ou nos $k$ últimos bits).

Uma vantagem dos códigos sistemáticos é que a recuperação da mensagem a partir da palavra-código é trivial: basta descartar os bits de paridade.

Exemplo.

Considere os dois codificadores abaixo.

$u$ $\Enc_1(u)$ $\Enc_2(u)$
$\bit{00}$ $\bit{00000}$ $\bit{00000}$
$\bit{01}$ $\bit{00001}$ $\bit{10010}$
$\bit{10}$ $\bit{10010}$ $\bit{10011}$
$\bit{11}$ $\bit{10011}$ $\bit{00001}$

Ambos os esquemas são códigos de bloco $(5, 2)$, com o mesmo conjunto de palavras-código:

\[ \calC = \{ \bit{00000}, \bit{00001}, \bit{10010}, \bit{10011} \}. \]

Contudo, o primeiro codificador é sistemático (por exemplo, nas duas últimas posições), enquanto o segundo não é.

Os três exemplos vistos anteriormente — código de repetição $(3, 1)$, código de paridade simples $(3, 2)$ e código de Hamming $(7, 4)$ — são exemplos de códigos sistemáticos (por quê?).

Códigos de bloco lineares

Nesta seção serão apresentados os conceitos básicos da teoria de códigos de bloco lineares. Neste contexto, o parâmetro $n$ é chamado de comprimento do código e o parâmetro $k$ é chamado de dimensão do código.

Definição. Código de bloco linear

Um código de bloco é dito ser linear se a soma de duas palavras-código é também uma palavra-código.

Como consequência, temos que a palavra nula é sempre uma palavra-código.

Matriz geradora

Definição. Matriz geradora

Para um código linear, existe uma matriz binária $G$, de tamanho $k \times n$, chamada de matriz geradora, tal que a palavra-código $v$ é obtida a partir da mensagem $u$ através de

v = u G.
Exemplo.

Considere o código de bloco linear com matriz geradora dada por

\[ G = \begin{bmatrix} ~1 & 0 & 0 & 0 & 1 & 1~ \\ ~0 & 1 & 0 & 1 & 0 & 1~ \\ ~0 & 0 & 1 & 1 & 1 & 0~ \end{bmatrix}. \]

Determine todas as palavras-código do código.

Solução.

Os parâmetros do código são $n = 6$ e $k = 3$. As palavras-código são apresentadas na tabela abaixo.

$u$ $v = u G$
$\bit{000}$ $\bit{000000}$
$\bit{001}$ $\bit{001110}$
$\bit{010}$ $\bit{010101}$
$\bit{011}$ $\bit{011011}$
$\bit{100}$ $\bit{100011}$
$\bit{101}$ $\bit{101101}$
$\bit{110}$ $\bit{110110}$
$\bit{111}$ $\bit{111000}$

Os outros três exemplos vistos anteriormente são também exemplos de códigos lineares. A seguir, são apresentadas as matrizes geradoras desses códigos.

Exemplo. Código de repetição $(3, 1)$

Determine a matriz geradora do código de repetição $(3, 1)$.

Solução.

Nesse caso, a mensagem consiste em um único bit, isto é, $u = [u_1]$ e os bits da palavra-código são dados por

\[ \begin{cases} v_1 ~ = ~ u_1, \\ v_2 ~ = ~ u_1, \\ v_3 ~ = ~ u_1. \end{cases} \]

Portanto,

\[ v = \big[ v_1 ~~ v_2 ~~ v_3 \big] = \big[ u_1 ~~ u_1 ~~ u_1 \big] = \big[ u_1 \big] \big[ 1 ~~ 1 ~~ 1 \big] = u G, \]

de modo que a matriz geradora é dada por

\[ G = \big[ 1 ~~ 1 ~~ 1 \big]. \]
Exemplo. Código de paridade simples $(3, 2)$

Determine a matriz geradora do código de paridade simples $(3, 2)$.

Solução.

Aqui, a mensagem é $u = [u_1 ~~ u_2]$. Os dois primeiros bits da palavra-código $v = [v_1 ~~ v_2 ~~ v_3]$ são iguais aos bits da mensagem, isto é,

\[ \begin{cases} v_1 ~ = ~ u_1, \\ v_2 ~ = ~ u_2, \end{cases} \]

enquanto o terceiro bit é tal que a paridade dos três bits é par, ou seja,

\[ v_1 + v_2 + v_3 ~ = ~ \bit{0}. \]

A equação da cima é equivalente a

\[ v_3 ~ = ~ u_1 + u_2, \]

Portanto,

\[ v = \big[ v_1 ~~ v_2 ~~ v_3 \big] = \big[ u_1 ~~~~~ u_2 ~~~~~ u_1 \! + \! u_2 \big] = \big[ u_1 ~~ u_2 \big] \begin{bmatrix}1 & 0 & 1 \\ 0 & 1 & 1\end{bmatrix} = u G, \]

de modo que a matriz geradora é dada por

\[ G = \begin{bmatrix}1 & 0 & 1 \\ 0 & 1 & 1\end{bmatrix}. \]
Exemplo. Código de Hamming $(7, 4)$

Determine a matriz geradora do código de Hamming $(7, 4)$.

Solução.

Da descrição do código, sabemos que a mensagem $u = [u_1 ~~ u_2 ~~ u_3 ~~ u_4]$ é mapeada na palavra-código $v$ da seguinte forma:

\[ v = \big[ v_1 ~~ v_2 ~~ v_3 ~~ v_4 ~~ v_5 ~~ v_6 ~~ v_7 \big] = \big[ u_1 ~~ u_2 ~~ u_3 ~~ u_4 ~~ p_1 ~~ p_2 ~~ p_3 \big], \]

em que os bits de paridade $p_1$, $p_2$, $p_3$ são escolhidos de modo que a paridade de cada um dos círculos abaixo seja par.

hamm74.svg

Assim, temos que

\[ \begin{cases} v_1 ~ = ~ u_1, \\ v_2 ~ = ~ u_2, \\ v_3 ~ = ~ u_3, \\ v_4 ~ = ~ u_4, \end{cases} \qquad \text{e} \qquad \begin{cases} p_1 + u_1 + u_2 + u_4 ~ = ~ \bit{0}, \\ p_2 + u_1 + u_3 + u_4 ~ = ~ \bit{0}, \\ p_3 + u_2 + u_3 + u_4 ~ = ~ \bit{0}, \\ \end{cases} \]

Isolando os bits de paridade e substituindo $v_5 = p_1$, $v_6 = p_2$ e $v_7 = p_3$, obtemos

\[ \begin{cases} v_5 ~ = ~ u_1 + u_2 + u_4, \\ v_6 ~ = ~ u_1 + u_3 + u_4, \\ v_7 ~ = ~ u_2 + u_3 + u_4. \end{cases} \]

Portanto,

\[ \begin{aligned} v & = \big[ v_1 ~~ v_2 ~~ v_3 ~~ v_4 ~~ v_5 ~~ v_6 ~~ v_7 \big] \\ & = \big[ u_1 ~~~~~ u_2 ~~~~~ u_3 ~~~~~ u_4 ~~~~~ u_1 \! + \! u_2 \! + \! u_4 ~~~~~ u_1 \! + \! u_3 \! + \! u_4 ~~~~~ u_2 \! + \! u_3 \! + \! u_4 \big] \\ & = \big[ u_1 ~~ u_2 ~~ u_3 ~~ u_4 \big] \begin{bmatrix} 1 & 0 & 0 & 0 & 1 & 1 & 0 \\ 0 & 1 & 0 & 0 & 1 & 0 & 1 \\ 0 & 0 & 1 & 0 & 0 & 1 & 1 \\ 0 & 0 & 0 & 1 & 1 & 1 & 1 \end{bmatrix} = u G, \end{aligned} \]

de modo que a matriz geradora é dada por

\[ G = \begin{bmatrix} 1 & 0 & 0 & 0 & 1 & 1 & 0 \\ 0 & 1 & 0 & 0 & 1 & 0 & 1 \\ 0 & 0 & 1 & 0 & 0 & 1 & 1 \\ 0 & 0 & 0 & 1 & 1 & 1 & 1 \end{bmatrix} . \]

Note que no caso de códigos de bloco sistemáticos, a matriz geradora possui a matriz identidade $k \times k$ como submatriz.

Matriz verificadora

Seja $m = n - k$ a redundância do código.

Definição. Matriz verificadora

Para um código linear, existe uma matriz binária $H$, de tamanho $m \times n$, chamada de matriz verificadora, tal que

v~\text{é palavra-código} \quad \iff \quad H v^\transpose = 0.

(Na equação acima, $0$ é o vetor coluna nulo de tamanho $m$.)

Relação entre as matrizes geradora e verificadora

As matrizes $G$ e $H$ estão relacionadas pela equação

\[ G H^\transpose = 0. \]

De modo geral, uma matriz pode ser obtida a partir da outra através de eliminação gaussiana. No caso particular de códigos sistemáticos, temos o seguinte resultado.

Teorema. Relação entre $G$ e $H$ para códigos sistemáticos

Se a matriz geradora é dada por $G = \big[ I_k ~~ P \big]$, então a matriz verificadora é dada por $H = \big[ P^\transpose ~~ I_m \big]$, em que $I_a$ é a matriz identidade $a \times a$.

Obs: A matriz $P$, de tamanho $k \times m$, é chamada de submatriz de paridade.

Demonstração.
\[ G H^\transpose ~ = ~\big[ I_k ~~ P \big] \begin{bmatrix}P \\ I_m\end{bmatrix} ~ = ~ I_k P + P I_m ~ = ~ P + P ~ = ~ 0. \]

A seguir serão determinadas as matrizes verificadoras dos códigos de repetição $(3, 1)$, de paridade simples $(3, 2)$ e de Hamming $(7, 4)$.

Exemplo. Código de repetição $(3, 1)$

Determine a matriz verificadora do código de repetição $(3, 1)$.

Solução.

Nesse caso, a redundância é $m = 2$ e a matriz geradora é dada por

\[ G = \big[ 1 ~~ 1 ~~ 1 \big] = \big[ I_1 ~~ P \big], \]

onde

\[ P = \big[ 1 ~~ 1 \big]. \]

Portanto, a matriz verificadora é dada por

\[ H = \big[ P^\transpose ~~ I_2 \big] = \begin{bmatrix}1 & 1 & 0 \\ 1 & 0 & 1\end{bmatrix}. \]

De fato, temos que

\[ \begin{align*} \text{$v$ é palavra-código} \quad \iff \quad & H v^\transpose = 0 \\ \quad \iff \quad & \begin{bmatrix}1 & 1 & 0 \\ 1 & 0 & 1\end{bmatrix} \begin{bmatrix}v_1 \\ v_2 \\ v_3\end{bmatrix} = \begin{bmatrix}0 \\ 0\end{bmatrix} \\ \quad \iff \quad & \begin{cases} v_1 + v_2 ~ = ~ 0, \\ v_1 + v_3 ~ = ~ 0, \end{cases} \\ \quad \iff \quad & \begin{cases} v_1 ~ = ~ v_2, \\ v_1 ~ = ~ v_3, \end{cases} \\ \quad \iff \quad & v_1 ~ = ~ v_2 ~ = ~ v_3. \end{align*} \]

Isso concorda com a definição do código de repetição $(3, 1)$.

Exemplo. Código de paridade simples $(3, 2)$

Determine a matriz verificadora do código de paridade simples $(3, 2)$.

Solução.

Aqui, a redundância é $m = 1$ e a matriz geradora é dada por

\[ G = \begin{bmatrix}1 & 0 & 1 \\ 0 & 1 & 1\end{bmatrix} = \big[ I_2 ~~ P \big], \]

onde

\[ P = \begin{bmatrix}1 \\ 1\end{bmatrix}. \]

Portanto, a matriz verificadora é dada por

\[ H = \big[ P^\transpose ~~ I_1 \big] = \big[ 1 ~~ 1 ~~ 1 \big]. \]

De fato, temos que

\[ \begin{align*} \text{$v$ é palavra-código} \quad \iff \quad & H v^\transpose = 0 \\ \quad \iff \quad & \begin{bmatrix}1 & 1 & 1\end{bmatrix} \begin{bmatrix}v_1 \\ v_2 \\ v_3\end{bmatrix} = 0 \\ \quad \iff \quad & v_1 + v_2 + v_3 ~ = ~ 0, \end{align*} \]

o que está de acordo com a definição do código de paridade simples $(3, 2)$.

Exemplo. Código de Hamming $(7, 4)$

Determine a matriz verificadora do código de Hamming $(7, 4)$.

Solução.

Aqui, a redundância é $m = 3$ e a matriz geradora é dada por

\[ G = \begin{bmatrix} 1 & 0 & 0 & 0 & 1 & 1 & 0 \\ 0 & 1 & 0 & 0 & 1 & 0 & 1 \\ 0 & 0 & 1 & 0 & 0 & 1 & 1 \\ 0 & 0 & 0 & 1 & 1 & 1 & 1 \end{bmatrix} = \big[ I_4 ~~ P \big], \]

onde

\[ P = \begin{bmatrix}1 & 1 & 0 \\ 1 & 0 & 1 \\ 0 & 1 & 1 \\ 1 & 1 & 1\end{bmatrix}. \]

Portanto, a matriz verificadora é dada por

\[ H = \big[ P^\transpose ~~ I_3 \big] = \begin{bmatrix}1 & 1 & 0 & 1 & 1 & 0 & 0 \\ 1 & 0 & 1 & 1 & 0 & 1 & 0 \\ 0 & 1 & 1 & 1 & 0 & 0 & 1\end{bmatrix}. \]

De fato, temos que

\[ \begin{align*} \text{$v$ é palavra-código} \quad \iff \quad & H v^\transpose = 0 \\ \quad \iff \quad & \begin{bmatrix}1 & 1 & 0 & 1 & 1 & 0 & 0 \\ 1 & 0 & 1 & 1 & 0 & 1 & 0 \\ 0 & 1 & 1 & 1 & 0 & 0 & 1\end{bmatrix} \begin{bmatrix}v_1 \\ v_2 \\ \vdots \\ v_7\end{bmatrix} = \begin{bmatrix}0 \\ 0 \\ 0\end{bmatrix} \\ \quad \iff \quad & \begin{cases} v_1 + v_2 + v_4 + v_5 ~ = ~ 0, \\ v_1 + v_3 + v_4 + v_6 ~ = ~ 0, \\ v_2 + v_3 + v_4 + v_7 ~ = ~ 0, \end{cases} \\ \quad \iff \quad & \text{a paridade de cada círculo abaixo é par.} \end{align*} \]
hamm74-v.svg

Isso está de acordo com a definição do código de Hamming $(7, 4)$.

Propriedades de um código linear

A distância de Hamming entre duas palavras binárias de mesmo comprimento é definida como o número de posições em que os bits correspondentes são diferentes. O peso de Hamming de uma palavra binária é o número de bits iguais a $\bit{1}$. Neste apontamento, a distância de Hamming é denotada por $\dH(\cdot, \cdot)$ e o peso de Hamming é denotado por $\wH(\cdot)$.

Distância mínima e distribuição de peso das palavras-código

Definição. Distância mínima

A distância mínima de um código de bloco, denotada por $\dmin$, é a menor distância de Hamming entre quaisquer duas palavras-código distintas.

Pode-se mostrar que, no caso de códigos de bloco lineares, a distância mínima é dada pelo menor peso de Hamming entre todas as palavras-código não-nulas.

Definição. Distribuição de peso das palavras-código

Seja $A_i$, para $i \in [0:n]$, o número de de palavras-código de peso $i$ de um código de bloco linear. A sequência $A_0, A_1, \ldots, A_n$ é chamada de distribuição de peso das palavras-código.

Exemplo. Código de repetição $(3, 1)$

Determine a distância mínima e a distribuição de peso das palavras-código do código de repetição $(3, 1)$.

Solução.

O conjunto de palavras-código é $\calC = \{ \bit{000}, \bit{111} \}$. Portanto, a distância mínima é $\dmin = 3$ e a distribuição de peso das palavas-código é a seguinte:

$i$ $0$ $1$ $2$ $3$
$A_i$ $1$ $0$ $0$ $1$
Exemplo. Código de paridade simples $(3, 2)$

Determine a distância mínima e a distribuição de peso das palavras-código do código de paridade simples $(3, 2)$.

Solução.

O conjunto de palavras-código é $\calC = \{ \bit{000}, \bit{011}, \bit{101}, \bit{110} \}$. Portanto, a distância mínima é $\dmin = 2$ e a distribuição de peso das palavas-código é a seguinte:

$i$ $0$ $1$ $2$ $3$
$A_i$ $1$ $0$ $3$ $0$
Exemplo. Código de Hamming $(7, 4)$

Determine a distância mínima e a distribuição de peso das palavras-código do código de Hamming $(7, 4)$.

Solução.

O conjunto de palavras-código é mostrado a seguir.

$\bit{0000000}$ $\bit{0100101}$ $\bit{1000110}$ $\bit{1100011}$
$\bit{0001111}$ $\bit{0101010}$ $\bit{1001001}$ $\bit{1101100}$
$\bit{0010011}$ $\bit{0110110}$ $\bit{1010101}$ $\bit{1110000}$
$\bit{0011100}$ $\bit{0111001}$ $\bit{1011010}$ $\bit{1111111}$

Portanto, a distância mínima é $\dmin = 3$ e a distribuição de peso das palavas-código é a seguinte:

$i$ $0$ $1$ $2$ $3$ $4$ $5$ $6$ $7$
$A_i$ $1$ $0$ $0$ $7$ $7$ $0$ $0$ $1$

A distribuição de peso das palavras-código satisfaz $A_0 + A_1 + \cdots + A_n = 2^k$ e, além disso, é tal que

  • $A_0 = 1$,
  • $A_i = 0$ para $1 \leq i \leq \dmin \! - \! 1$, e
  • $A_{\dmin} > 0$.

Decodificação de mínima distância e capacidade de correção de erros

Relembrando o diagrama de blocos do modelo de comunicação considerado.

block-diagram-3.svg

Uma forma de decodificar um código de bloco é através da decodificação de mínima distância.

Definição. Decodificação de mínima distância

O decodificador de mínima distância seleciona a palavra-código mais próxima da palavra recebida, de acordo com a distância de Hamming.

Exemplo. Decodificação de mínima distância

Considere o código de Hamming $(7, 4)$. Suponha que foi transmitida a palavra-código $v = \bit{1011010}$. Efetue a decodificação de mínima distância nos seguintes casos:

  1. Padrão de erro $e = \bit{0000000}$, ou seja, palavra recebida $b = \bit{1011010}$.
  2. Padrão de erro $e = \bit{0000010}$, ou seja, palavra recebida $b = \bit{1011000}$.
  3. Padrão de erro $e = \bit{1000010}$, ou seja, palavra recebida $b = \bit{0011000}$.
Solução.

(a) Para $b = \bit{1011010}$, temos a seguinte tabela de distâncias de Hamming entre $b$ e as palavras-código:

Portanto, o decodificador de mínima distância seleciona corretamente $\hat{v} = \bit{1011010}$.

(b) Para $b = \bit{1011000}$, temos a seguinte tabela de distâncias de Hamming entre $b$ e as palavras-código:

Portanto, o decodificador de mínima distância seleciona corretamente $\hat{v} = \bit{1011010}$.

(c) Para $b = \bit{0011000}$, temos a seguinte tabela de distâncias de Hamming entre $b$ e as palavras-código:

Desta vez, o decodificador de mínima distância seleciona $\hat{v} = \bit{0011100}$ (erro de decodificação).

Utilizando decodificação de mínima distância, pode-se mostrar o seguinte resultado, que é válido para códigos de bloco em geral (não necessariamente lineares). No que segue, $\lfloor x \rfloor$ denota o maior inteiro menor ou igual a $x$.

Teorema. Capacidade de correção de erros

Considere um código de bloco com distância mínima $\dmin$ e seja

\[ t = \left\lfloor \frac{\dmin - 1}{2} \right\rfloor. \]

Então:

  • Todos os padrões de erro de peso $t$ ou menos podem ser corrigidos.
  • Existe pelo menos um padrão de erro de peso $t + 1$ que não pode ser corrigido.

O parâmetro $t$ é chamado de capacidade de correção de erros do código.

Demonstração.

Antes de iniciar a demonstração, note que a expressão para o valor de $t$ é equivalente a

\[ \dmin = \begin{cases} 2t + 1, & \text{se $\dmin$ é ímpar}, \\ 2t + 2, & \text{se $\dmin$ é par}. \end{cases} \]

Portanto, $\dH(v, v') \geq 2t + 1$ para quaisquer duas palavras-código distintas $v$ e $v'$.

  • Assuma primeiramente que o padrão de erro $e$ tenha peso $t$ ou menos. Suponha que $v$ seja a palavra-código transmitida e $b = v + e$ seja a palavra recebida. Temos que

    \[ \dH(v, b) \leq t. \]

    Considere agora uma palavra-código $v' \neq v$.

    error-correcting-capability-1.svg

    Pela desigualdade triangular, temos que $\dH(v, v') \leq \dH(v, b) + \dH(v', b)$, de modo que

    \[ \dH(v', b) ~~ \geq ~~ \underbrace{\dH(v, v')}_{\geq 2t + 1} - \underbrace{\dH(v, b)}_{\leq t} ~~ \geq ~~ t + 1. \]

    Conclusão: a palavra recebida $b$ está mais próxima da palavra-código transmitida $v$ do que de qualquer outra palavra-código $v' \neq v$ e, portanto, o decodificador de mínima distância irá selecionar (corretamente) a palavra-código transmitida.

  • Agora, sejam $v$ e $v'$ tais que $\dH(v, v') = \dmin$ e defina $\delta = v + v'$. O peso de $\delta$ é $2t + 1$, se $\dmin$ é ímpar, ou $2t + 2$, se $\dmin$ é par.

    error-correcting-capability-2.svg

    Seja $e$ de peso $t + 1$ tal que os bits $\bit{1}$ de $e$ ocorrem apenas nas posições onde $\delta$ também possui bits $\bit{1}$. Suponha que $v$ seja a palavra-código transmitida e $b = v + e$ seja a palavra recebida. Temos que

    \[ \dH(v, b) = t + 1, \]

    ao passo que

    \[ \dH(v', b) = \dH(v + \delta, v + e) = \dH(\delta, e) = \begin{cases} t, & \text{$\dmin$ é ímpar}, \\ t + 1, & \text{$\dmin$ é par}. \end{cases} \]

    Assim:

    • Para $\dmin$ ímpar, a palavra recebida $b$ está mais próxima de $v'$ do que de $v$.
    • Para $\dmin$ par, a palavra recebida $b$ está equidistante de $v$ e $v'$.

    Portanto, o decodificador de mínima distância irá com certeza selecionar (caso $\dmin$ seja ímpar) ou pode selecionar (caso $\dmin$ seja par) a palavra-código errada $v'$ em detrimento da palavra-código correta $v$. Concluímos que $e$ é um padrão de erro de peso $t + 1$ que não pode ser corrigido.

Como exemplo, a capacidade de correção de erros de alguns códigos é apresentada na tabela a seguir.

Código $\dmin$ $t$
Paridade simples $(3, 2)$ 2 0
Repetição $(3, 1)$ 3 1
Hamming $(7, 4)$ 3 1
Golay $(23, 12)$ 7 3
Reed–Muller $(32, 6)$ 16 7
Curiosidade. Código de Nadler

É possível demonstrar que, para um código linear de comprimento $n = 12$ e dimensão $k = 5$ (ou seja, com $32$ palavras-código), a melhor distância mínima possível é $\dmin = 4$ (resultando em $t = 1$). No entanto, em 1962, M. Nadler publicou a construção de um código não-linear de mesmo comprimento e mesmo número de palavras-código, mas com $\dmin = 5$ (resultando em $t = 2$).

Detalhes.

As $32$ palavras-código do código de Nadler são mostradas abaixo.

Dada uma palavra-código específica $v$, definimos $A^{(v)}_i$ como o número de palavras código $v'$ tais que $\dH(v, v') = i$. Para o código de Nadler, $A^{(v)}_i$ não depende da escolha de $v$, o que pode não ser verdade para códigos não-lineares em geral. A tabela a seguir apresenta os valores de $A^{(v)}_i$ para o código de Nadler.

Família dos códigos de Hamming

Os códigos de Hamming são obtidos a partir da seguinte construção, baseada na matriz verificadora.

Definição. Códigos de Hamming

Para $m \geq 2$, o código de Hamming de ordem $m$ é o código de bloco linear cuja matriz verificadora contém todas as palavras binárias de tamanho $m$ como colunas, exceto a palavra nula.

O código de Hamming de ordem $m$ possui os seguintes parâmetros:

Comprimento: $n = 2^m - 1$
Dimensão: $k = 2^m - m - 1$
Redundância: $m$
Distância mínima: $\dmin = 3$
  • Para $m=2$, a matriz verificadora é dada por

    \[ H = \begin{bmatrix} ~1 & 1 & 0~ \\ ~1 & 0 & 1~ \end{bmatrix}. \]

    Portanto, o código de Hamming de ordem $2$ é o código de repetição $(3, 1)$.

  • Para $m=3$, a matriz verificadora é dada por

    \[ H = \begin{bmatrix} ~1 & 1 & 0 & 1 & 1 & 0 & 0~ \\ ~1 & 0 & 1 & 1 & 0 & 1 & 0~ \\ ~0 & 1 & 1 & 1 & 0 & 0 & 1~ \end{bmatrix}. \]

    Portanto, o código de Hamming de ordem $3$ é o código de Hamming $(7, 4)$.

  • Para $m=4$, a matriz verificadora é dada por

    \[ H = \begin{bmatrix} ~1 & 1 & 1 & 0 & 0 & 0 & 1 & 1 & 1 & 0 & 1 & 1 & 0 & 0 & 0~ \\ ~1 & 0 & 0 & 1 & 1 & 0 & 1 & 1 & 0 & 1 & 1 & 0 & 1 & 0 & 0~ \\ ~0 & 1 & 0 & 1 & 0 & 1 & 1 & 0 & 1 & 1 & 1 & 0 & 0 & 1 & 0~ \\ ~0 & 0 & 1 & 0 & 1 & 1 & 0 & 1 & 1 & 1 & 1 & 0 & 0 & 0 & 1~ \end{bmatrix}. \]

    Este é o código de Hamming $(15, 11)$.

Teorema. Distância mínima dos códigos de Hamming

Todos os membros da família dos códigos de Hamming possuem distância mínima $\dmin = 3$.

Demonstração.

Por simplicidade, considere o código de Hamming $(15, 11)$, cuja matriz verificadora é

\[ H = \begin{bmatrix} ~1 & 1 & 1 & 0 & 0 & 0 & 1 & 1 & 1 & 0 & 1 & 1 & 0 & 0 & 0~ \\ ~1 & 0 & 0 & 1 & 1 & 0 & 1 & 1 & 0 & 1 & 1 & 0 & 1 & 0 & 0~ \\ ~0 & 1 & 0 & 1 & 0 & 1 & 1 & 0 & 1 & 1 & 1 & 0 & 0 & 1 & 0~ \\ ~0 & 0 & 1 & 0 & 1 & 1 & 0 & 1 & 1 & 1 & 1 & 0 & 0 & 0 & 1~ \end{bmatrix}. \]
  • Não existe palavra-código de peso $1$. De fato, se $v$ fosse uma palavra-código de peso $1$, então $H v^\transpose = 0$ implicaria que $H$ teria uma coluna nula, o que não é o caso.
  • Não existe palavra-código de peso $2$. De fato, se $v$ fosse uma palavra-código de peso $2$, então $H v^\transpose = 0$ implicaria que $H$ teria duas colunas iguais, o que não é o caso.
  • Existe uma palavra-código de peso $3$. Por exemplo, $v = \bit{110100000000000}$ é palavra-código, pois

    \[ H v^\transpose = \begin{bmatrix} ~1~ \\ ~1~ \\ ~0~ \\ ~0~ \end{bmatrix} + \begin{bmatrix} ~1~ \\ ~0~ \\ ~1~ \\ ~0~ \end{bmatrix} + \begin{bmatrix} ~0~ \\ ~1~ \\ ~1~ \\ ~0~ \end{bmatrix} = \begin{bmatrix} ~0~ \\ ~0~ \\ ~0~ \\ ~0~ \end{bmatrix}. \]

As três afirmações acima implicam que o peso mínimo, e portanto a distância mínima, é $\dmin = 3$.

Arranjo padrão e síndrome

Arranjo padrão

O conjunto de todas as palavras binárias de $n$ bits constitui um grupo sob a operação de adição binária. As palavras-código de um código linear, por sua vez, formam um subgrupo desse grupo. Da teoria de grupos, sabe-se que um grupo pode ser particionado em cosets de um subgrupo, em que cada coset é uma translação do subgrupo. Com base nessa observação, é possível definir o conceito de arranjo padrão.

Definição. Arranjo padrão

O arranjo padrão de um código de bloco linear é uma tabela com $2^m$ linhas e $2^k$ colunas, em que:

  • A primeira linha contém todas as palavras-código, com a palavra-código nula na primeira posição.
  • Cada linha é um coset do subgrupo de palavras-código, em que o elemento na primeira posição, chamado de representante (ou líder), possui peso mínimo dentro do coset.
David-Slepian-teaching.jpg
David Slepian teaching Information Theory. CC BY-SA 4.0 by Don Slepian. Fonte: Wikimedia Commons.
Curiosidade.

O arranjo padrão foi proposto por David Slepian em 1956 (apud Sílvio A. Abrantes).

No contexto de códigos corretores de erro, os representantes dos cosets são os padrões de erro corrigíveis. Se os representantes de menor peso são escolhidos, o arranjo padrão fornece uma maneira de implementar decodificação de mínima distância: ao receber uma palavra $b$, selecione a palavra-código $\hat{v}$ que se encontra na mesma coluna de $b$.

Exemplo. Arranjo padrão

Considere o código de bloco linear $(6, 3)$ com matriz geradora dada por

\[ G = \begin{bmatrix} ~1 & 0 & 0 & 0 & 1 & 1~ \\ ~0 & 1 & 0 & 1 & 0 & 1~ \\ ~0 & 0 & 1 & 1 & 1 & 0~ \end{bmatrix}. \]

Construa um arranjo padrão para este código, dando prioridade aos representantes de menor peso. Em seguida, decodifique a palavra recebida $b = \bit{100001}$.

Solução.

As palavras código deste código já foram obtidas em um exemplo anterior. A partir delas, podemos construir o arranjo padrão conforme a tabela a seguir. Note que há liberdade na escolha do único representante de peso $2$ (as possíveis outras escolhas são $\bit{010010}$ e $\bit{001001}$).

Da tabela, podemos concluir que, se $b = \bit{100001}$, então o decodificador de mínima distância identifica a palavra-código transmitida como $\hat{v} = \bit{100011}$, com o padrão de erro $\hat{e} = \bit{000010}$.

Embora o arranjo padrão seja uma ferramenta teórica valiosa que oferece uma compreensão detalhada da estrutura algébrica do código, na prática, ele não é empregado na decodificação, pois o número de elementos no arranjo padrão é exponencial em relação ao comprimento do código.

Teorema.

Todo código de bloco linear $(n, k)$ pode corrigir $2^m$ padrões de erro, onde $m = n - k$ é a redundância do código.

Definição. Distribuição de peso dos padrões de erro corrigíveis

Seja $\alpha_i$, para $i \in [0:n]$, o número de de padrões de erro corrigíveis de peso $i$ de um código de bloco linear, dando prioridade aos de menor peso. A sequência $\alpha_0, \alpha_1, \ldots, \alpha_n$ é chamada de distribuição de peso dos padrões de erro corrigíveis.

Exemplo. Código de repetição $(3, 1)$

Determine a distribuição de peso dos padrões de erro corrigíveis do código de repetição $(3, 1)$.

Solução.

Neste caso, temos que $m = 2$, de modo que o código pode corrigir $2^2 = 4$ padrões de erro. Priorizando aqueles de menor peso, temos:

\[ \{ \bit{000}, \bit{100}, \bit{010}, \bit{001} \} \]

Portanto, a distribuição de peso dos padrões de erro corrigíveis é a seguinte:

$i$ $0$ $1$ $2$ $3$
$\alpha_i$ $1$ $3$ $0$ $0$
Exemplo. Código de paridade simples $(3, 2)$

Determine a distribuição de peso dos padrões de erro corrigíveis do código de paridade simples $(3, 2)$.

Solução.

Neste caso, temos que $m = 1$, de modo que o código pode corrigir $2^1 = 2$ padrões de erro. Priorizando aqueles de menor peso, temos duas possíveis escolhas:

\[ \{ \bit{00}, \bit{01} \} \quad \text{ou} \quad \{ \bit{00}, \bit{10} \} \]

Portanto, a distribuição de peso dos padrões de erro corrigíveis é a seguinte:

$i$ $0$ $1$ $2$ $3$
$\alpha_i$ $1$ $1$ $0$ $0$
Exemplo. Código de Hamming $(7, 4)$

Determine a distribuição de peso dos padrões de erro corrigíveis do código de Hamming $(7, 4)$.

Solução.

Neste caso, temos que $m = 3$, de modo que o código pode corrigir $2^3 = 8$ padrões de erro. Priorizando aqueles de menor peso, temos:

\[ \{ \bit{0000000}, \bit{1000000}, \bit{0100000}, \bit{0010000}, \bit{0001000}, \bit{0000100}, \bit{0000010}, \bit{0000001} \} \]

Portanto, a distribuição de peso dos padrões de erro corrigíveis é a seguinte:

$i$ $0$ $1$ $2$ $3$ $4$ $5$ $6$ $7$
$\alpha_i$ $1$ $7$ $0$ $0$ $0$ $0$ $0$ $0$

A distribuição de peso dos padrões de erro corrigíveis satisfaz $\alpha_0 + \alpha_1 + \cdots + \alpha_n = 2^m$ e, além disso, é tal que

\[ \alpha_i = \binom{n}{i}, \quad \text{para $0 \leq i \leq t$}, \qquad \text{e} \qquad \alpha_i \lt \binom{n}{i}, \quad \text{para $t \! + \! 1 \leq i \leq n$}. \]

onde $t$ é a capacidade de correção de erros do código. Códigos em que $\alpha_i = 0$ para $t \! + \! 1 \leq i \leq n$ são chamados de códigos perfeitos.

Exemplo. Código de Golay $(23, 12)$

Mostre que o código de Golay $(23, 12)$ é um código perfeito.

Solução.

Este código tem $m = 11$, de modo que pode corrigir $2^{11} = 2048$ padrões de erro. Sabendo que sua capacidade de correção de erros é $t = 3$, a distribuição de peso dos padrões de erro corrigíveis é a seguinte:

$i$ $0$ $1$ $2$ $3$ $4$ $5$ $\cdots$ $23$
$\alpha_i$ $\displaystyle{\binom{23}{0}}$ $\displaystyle{\binom{23}{1}}$ $\displaystyle{\binom{23}{2}}$ $\displaystyle{\binom{23}{3}}$ $~~?~~$ $~~?~~$ $\cdots$ $~~?~~$

Note que

\[ \binom{23}{0} + \binom{23}{1} + \binom{23}{2} + \binom{23}{3} = 1 + 23 + 253 + 1771 = 2048, \]

o que significa que nenhum padrão de erro de peso maior ou igual a $4$ pode ser corrigido, pois não restam mais possibilidades para serem acomodadas. Dessa forma, as entradas marcadas com “$?$” devem ser todas nulas. Portanto, o código de Golay $(23, 12)$ é um código perfeito.

Curiosidade. Códigos lineares perfeitos

Os únicos códigos lineares perfeitos binários são:

  • Os códigos de repetição de comprimento $n$ ímpar.
  • Os códigos de Hamming.
  • O código de Golay $(23, 12)$.

Este resultado foi provado por A. Tietäväinen em 1973.

Síndrome

Definição. Síndrome

A síndrome de uma palavra recebida $b$ é definida por

s = H b^\transpose. A síndrome é um vetor coluna de tamanho $m$.

A síndrome $s$ não depende da palavra-código $v$, mas apenas do padrão de erro $e$:

\[ s = H b^\transpose = H (v + e)^\transpose = H v^\transpose + H e^\transpose = H e^\transpose. \]
Curiosidade. Origem do termo

A nomenclatura “síndrome” foi proposta por D. W. Hagelbarger em 1959 (apud Sílvio A. Abrantes).

O diagrama de blocos abaixo ilustra o processo de decodificação via síndrome.

syndrome-decoding.svg

O bloco indicado por $s \mapsto \hat{e}$ pode ser implementado de diferentes formas. Para códigos com um valor reduzido de $m$, é viável armazenar uma tabela na memória. Já para códigos com $m$ elevado, torna-se necessário o uso de algoritmos que calculam $\hat{e}$ a partir de $s$, os quais dependem das propriedades algébricas do código.

Exemplo. Decodificação via síndrome

Considere o novamente código de bloco linear $(6, 3)$ com matriz geradora dada por

\[ G = \begin{bmatrix} ~1 & 0 & 0 & 0 & 1 & 1~ \\ ~0 & 1 & 0 & 1 & 0 & 1~ \\ ~0 & 0 & 1 & 1 & 1 & 0~ \end{bmatrix}. \]

Construa uma tabela de síndome para este código. Em seguida, utilize a tabela para decodificar a palavra recebida $\bit{100001}$.

Solução.

A matriz verificadora é dada por

\[ H = \begin{bmatrix} ~0 & 1 & 1 & 1 & 0 & 0~ \\ ~1 & 0 & 1 & 0 & 1 & 0~ \\ ~1 & 1 & 0 & 0 & 0 & 1~ \end{bmatrix}. \]

Portanto, a tabela de síndrome pode ser construída como segue.

Síndrome Padrão de erro
$\bit{000}$ $\bit{000000}$
$\bit{011}$ $\bit{100000}$
$\bit{101}$ $\bit{010000}$
$\bit{110}$ $\bit{001000}$
$\bit{100}$ $\bit{000100}$
$\bit{010}$ $\bit{000010}$
$\bit{001}$ $\bit{000001}$
$\bit{111}$ $\bit{100100}$

Note que o padrão de erro correpondente à síndrome $\bit{111}$ poderia ser $\bit{100100}$, $\bit{010010}$ ou $\bit{001001}$; a escolha é arbitrária.

Para decodificar a palavra recebida $b = \bit{100001}$, calculamos a síndrome:

\[ s ~~ = ~~ H b^\transpose ~~ = ~~ \begin{bmatrix} ~0 & 1 & 1 & 1 & 0 & 0~ \\ ~1 & 0 & 1 & 0 & 1 & 0~ \\ ~1 & 1 & 0 & 0 & 0 & 1~ \end{bmatrix} \begin{bmatrix} ~1~ \\ ~0~ \\ ~0~ \\ ~0~ \\ ~0~ \\ ~1~ \end{bmatrix} ~~ = ~~ \begin{bmatrix} ~0~ \\ ~1~ \\ ~0~ \end{bmatrix}. \]

A partir da tabela de síndrome, concluímos que o padrão de erro é $\hat{e} = \bit{000010}$. Portanto, a palavra-código estimada é $\hat{v} = b + \hat{e} = \bit{100011}$, o que corresponde à mensagem estimada $\hat{u} = \bit{100}$.

Modelo probabilístico

Considere o diagrama de blocos a seguir. Nesta seção, adotamos um modelo probabilístico para o problema, onde letras maiúsculas denotam variáveis aleatórias.

block-diagram-3-va.svg

Iremos assumir as seguintes hipóteses:

  • Os bits da mensagem, $U_1, U_2, \ldots, U_k$, são independentes e equiprováveis. Equivalentemente, a mensagem $U$ é selecionada uniformemente sobre o conjunto de todas as palavras de $k$ bits.
  • Os bits do padrão de erro, $E_1, E_2, \ldots,E_n$, são independentes com $\Pr[E_i = \bit{1}] = p$, em que $p$ é chamado de probabilidade de inversão de bit do canal. Assume-se $p < 1/2$ (o caso $p > 1/2$ pode ser convertido em $p < 1/2$ invertendo os bits da palavra recebida).

    bsc.svg

    Este modelo é conhecido como canal binário simétrico (BSC, do inglês binary symmetric channel). O canal é dito ser sem memória no sentido de que cada transmissão é independente das outras.

O decodificador pode ser projetado de acordo com dois critérios [MacKay, p. 324]:

  • Problema da decodificação de palavra: Em sua forma mais geral, consiste em determinar a distribuição de probabilidade condicional da mensagem $U$, dada a palavra recebida $B$.
  • Problema da decodificação bit-a-bit: Em sua forma mais geral, consiste em determinar a distribuição de probabilidade condicional de cada bit $U_i$ da mensagem, dada a palavra recebida $B$.

As distribuições condicionais mencionadas acima são chamadas de distribuições a posteriori.

Bayes_Theorem_MMB_01.jpg
Bayes’ Theorem. Fonte: Wikimedia Commons.
Exemplo. Decodificação do código de Hamming $(7, 4)$

Considere o código de Hamming $(7, 4)$ e um canal BSC com probabilidade de inversão de bit $p = 1/4$. Suponha que seja recebida a palavra $\bit{0010000}$.

  1. Determine a distribuição a posteriori da mensagem.
  2. Determine as distribuições a posteriori de cada bit da mensagem.
Solução.

Distribuição a posteriori da mensagem. Pelo teorema de Bayes, temos que

\[ \Pr[U \! = \! u \mid B \! = \! b] ~~~ = ~~~\frac{\Pr[B \! = \! b \mid U \! = \! u] \Pr[U \! = \! u]}{\Pr[B \! = \! b]} ~~~ \propto ~~~ \Pr[B \! = \! b \mid U \! = \! u]. \]

(A proporcionalidade é válida porque $\Pr[U = u]$ e $\Pr[B = b]$ são constantes para todos os valores de $u$.)

Com base nisso, podemos calcular a distribuição a posteriori da mensagem:

$u$ $v$ $\Pr[B \! = \! \bit{0010000} \mid U \! = \! u]$ $\Pr[U \! = \! u \mid B \! = \! \bit{0010000}]$
$\bit{0000}$ $\bit{0000000}$ $\left(\tfrac{1}{4}\right)^1 \left(\tfrac{3}{4}\right)^6 = 729 / 4^7$ $243/640$
$\bit{0001}$ $\bit{0001111}$ $\left(\tfrac{1}{4}\right)^5 \left(\tfrac{3}{4}\right)^2 = \phantom{00}9 / 4^7$ $\phantom{00}3/640$
$\bit{0010}$ $\bit{0010110}$ $\left(\tfrac{1}{4}\right)^2 \left(\tfrac{3}{4}\right)^5 = 243 / 4^7$ $\phantom{0}81/640$
$\bit{0011}$ $\bit{0011000}$ $\left(\tfrac{1}{4}\right)^2 \left(\tfrac{3}{4}\right)^5 = 243 / 4^7$ $\phantom{0}81/640$
$\bit{0100}$ $\bit{0100101}$ $\left(\tfrac{1}{4}\right)^4 \left(\tfrac{3}{4}\right)^3 = \phantom{0}27 / 4^7$ $\phantom{00}9/640$
$\bit{0101}$ $\bit{0101010}$ $\left(\tfrac{1}{4}\right)^4 \left(\tfrac{3}{4}\right)^3 = \phantom{0}27 / 4^7$ $\phantom{00}9/640$
$\bit{0110}$ $\bit{0111100}$ $\left(\tfrac{1}{4}\right)^3 \left(\tfrac{3}{4}\right)^4 = \phantom{0}81 / 4^7$ $\phantom{0}27/640$
$\bit{0111}$ $\bit{0110011}$ $\left(\tfrac{1}{4}\right)^3 \left(\tfrac{3}{4}\right)^4 = \phantom{0}81 / 4^7$ $\phantom{0}27/640$
$\bit{1000}$ $\bit{1000110}$ $\left(\tfrac{1}{4}\right)^4 \left(\tfrac{3}{4}\right)^3 = \phantom{0}27 / 4^7$ $\phantom{00}9/640$
$\bit{1001}$ $\bit{1001001}$ $\left(\tfrac{1}{4}\right)^4 \left(\tfrac{3}{4}\right)^3 = \phantom{0}27 / 4^7$ $\phantom{00}9/640$
$\bit{1010}$ $\bit{1010101}$ $\left(\tfrac{1}{4}\right)^3 \left(\tfrac{3}{4}\right)^4 = \phantom{0}81 / 4^7$ $\phantom{0}27/640$
$\bit{1011}$ $\bit{1011010}$ $\left(\tfrac{1}{4}\right)^3 \left(\tfrac{3}{4}\right)^4 = \phantom{0}81 / 4^7$ $\phantom{0}27/640$
$\bit{1100}$ $\bit{1100111}$ $\left(\tfrac{1}{4}\right)^5 \left(\tfrac{3}{4}\right)^2 = \phantom{00}9 / 4^7$ $\phantom{00}3/640$
$\bit{1101}$ $\bit{1101000}$ $\left(\tfrac{1}{4}\right)^5 \left(\tfrac{3}{4}\right)^2 = \phantom{00}9 / 4^7$ $\phantom{00}3/640$
$\bit{1110}$ $\bit{1110000}$ $\left(\tfrac{1}{4}\right)^2 \left(\tfrac{3}{4}\right)^5 = 243 / 4^7$ $\phantom{0}81/640$
$\bit{1111}$ $\bit{1111111}$ $\left(\tfrac{1}{4}\right)^6 \left(\tfrac{3}{4}\right)^1 = \phantom{00}3 / 4^7$ $\phantom{00}1/640$

Distribuições a posteriori de cada bit da mensagem. Para o primeiro bit, temos

\[ \begin{align*} \Pr[U_1 \! = \! 0 \mid B \! = \! b] & = \Pr[U \in \{\bit{0000}, \bit{0001}, \bit{0010}, \bit{0011}, \bit{0100}, \bit{0101}, \bit{0110}, \bit{0111}\} \mid B \! = \! b] \\ & = \frac{243 + 3 + 81 + 81 + 9 + 9 + 27 + 27}{640} = \frac{3}{4}. \end{align*} \] \[ \begin{align*} \Pr[U_1 \! = \! 1 \mid B \! = \! b] & = \Pr[U \in \{\bit{1000}, \bit{1001}, \bit{1010}, \bit{1011}, \bit{1100}, \bit{1101}, \bit{1110}, \bit{1111}\} \mid B \! = \! b] \\ & = \frac{9 + 9 + 27 + 27 + 3 + 3 + 81 + 1}{640} = \frac{1}{4}. \end{align*} \]

Para os demais bits, o cálculo é análogo. A tabela abaixo resume os resultados.

$i$ $\Pr[U_i \! = \! 0 \mid B \! = \! \bit{0010000}]$ $\Pr[U_i \! = \! 1 \mid B \! = \! \bit{0010000}]$
$1$ $3/4$ $1/4$
$2$ $3/4$ $1/4$
$3$ $9/20$ $11/20$
$4$ $3/4$ $1/4$

A quantidade $\Pr[B \! = \! b \mid U \! = \! u]$ é chamada de verossimilhança (likelihood, em inglês) da mensagem $u$.

Decodificação MAP

A solução completa do problema de decodificação de palavra consiste em listar todas as mensagens possíveis juntamente com suas respectivas probabilidades. No entanto, dado que o número de mensagens ($2^k$) é geralmente grande e não estamos interessados nas probabilidades detalhadas de cada uma, muitas vezes consideramos uma versão simplificada do problema [MacKay, p. 325]. Essa versão é aqui chamada de decodificação MAP de palavra (do inglês maximum a posteriori):

Definição. Decodificação MAP de palavra

O decodificador MAP de palavra seleciona a mensagem mais provável, dada a palavra recebida.

Teorema. Equivalência entre decodificação MAP de palavra e decodificação de mínima distância

Sob as hipóteses de bits da mensagem independentes e equiprováveis e canal BSC, a decodificação MAP de palavra é equivalente à decodificação de mínima distância de Hamming.

Demonstração.

Seja $v$ a palavra-código correspondente à mensagem $u$. Como

\[ \Pr[U \! = \! u \mid B \! = \! b] ~ \propto ~ \Pr[B \! = \! b \mid U \! = \! u] ~ = ~ \Pr[B \! = \! b \mid V \! = \! v], \]

o decodificador MAP de palavra seleciona a palavra-código $v$ que maximiza

\[ \Pr[B \! = \! b \mid V \! = \! v] ~ = ~ p^d q^{n-d} ~ = ~ q^n \left( \frac{p}{q} \right)^d, \]

onde $d = \dH(b, v)$ é a distância de Hamming entre $b$ e $v$, e $q = 1 - p$. Como $q^n$ não depende de $v$ e $p/q < 1$ (pois $p < 1/2$), escolher $v$ que maximiza $\Pr[B \! = \! b \mid V \! = \! v]$ é equivalente a escolher $v$ que minimiza $\dH(b, v)$.

Embora a decodificação MAP de palavra forneça a mensagem mais provável como um todo, em algumas aplicações podemos estar interessados em determinar o bit mais provável em cada posição. Isso motiva a introdução de uma estratégia alternativa de decodificação, aqui chamada de decodificação MAP bit-a-bit.

Definição. Decodificação MAP bit-a-bit

O decodificador MAP bit-a-bit seleciona o bit mais provável em cada posição da mensagem, dada a palavra recebida.

A saída do decodificador MAP de palavra não necessariamente coincide com a do decodificador MAP bit-a-bit. Isso é ilustrado no exemplo a seguir.

Exemplo. Decodificação do código de Hamming $(7, 4)$

Considerando o exemplo anterior:

  1. Determine a saída do decodificador MAP de palavra.
  2. Compare com a decodificação bit-a-bit.
Solução.

Da tabela da distribuição a posteriori da mensagem, temos que a mensagem mais provável é $\bit{0000}$. Portanto, a saída do decodificador MAP de palavra é $\hat{u} = \bit{0000}$.

Por outro lado, a partir da tabela das distribuições a posteriori de cada bit da mensagem, concluímos que a decodificação bit-a-bit fornece $\hat{u} = \bit{0010}$.

Portanto, o decodificador MAP de palavra minimiza a probabilidade de erro de palavra, mas não necessariamente minimiza a probabilidade de erro de bit. Para isso, é necessário o decodificador MAP bit-a-bit.

Desempenho de códigos de bloco

Nesta seção, damos continuidade ao modelo probabilístico adotado previamente, mantendo as mesmas hipóteses: mensagens equiprováveis e canal BSC sem memória.

Probabilidade de erro de palavra

A seguir, define-se a probabilidade de erro de palavra.

Definição. Probabilidade de erro de palavra

A probabilidade de erro de palavra, $\Pword$, é a probabilidade de que a mensagem decodificada seja diferente da mensagem original:

\[ \Pword = \Pr[\hat{U} \neq U], \]

onde $\hat{U} = \Dec(B)$ é a mensagem decodificada e $U$ é a mensagem original.

Perceba que a probabilidade definida acima depende do decodificador utilizado.

Decodificação de mínima distância. A decodificação de mínima distância de Hamming é ótima no sentido de minimizar a probabilidade de erro de palavra (pois coincide com o decodificador MAP de palavra). O exemplo a seguir ilustra como calcular $\Pword$ nesse caso.

Exemplo. Probabilidade de erro de palavra

Considere o código de bloco linear $(6, 3)$ com matriz geradora dada por

\[ G = \begin{bmatrix} ~1 & 0 & 0 & 0 & 1 & 1~ \\ ~0 & 1 & 0 & 1 & 0 & 1~ \\ ~0 & 0 & 1 & 1 & 1 & 0~ \end{bmatrix}. \]

Determine uma expressão para a probabilidade de erro de palavra para este código, assumindo decodificação de mínima distância de Hamming e canal BSC com probabilidade de inversão de bit $p$.

Solução.

Seja $\mathcal{E}$ o conjunto de padrões de erro corrigíveis. Do arranjo padrão (ou da tabela de síndrome), temos que

\[ \mathcal{E} = \{ \bit{000000}, \bit{100000}, \bit{010000}, \bit{001000}, \bit{000100}, \bit{000010}, \bit{000001}, \bit{100100} \}. \]

Sabemos que o decodificador selecionará a mensagem correta se e somente se $E \in \mathcal{E}$. Portanto, a probabilidade de erro de palavra é dada por

\[ \begin{aligned} \Pword ~~ & = ~~ \Pr[\hat{U} \neq U] \\ ~~ & = ~~ 1 - \Pr[\hat{U} = U] \\ ~~ & = ~~ 1 - \Pr[E \in \mathcal{E}], \\ \end{aligned} \]

em que o termo $\Pr[E \in \mathcal{E}]$ pode ser calculado como

\[ \begin{aligned} \Pr[E \in \mathcal{E}] ~~ & = ~~ \underbrace{\Pr[E = \bit{000000}]}_{q^6} ~ + \\ ~~ & \phantom{=} ~~ \underbrace{\Pr[E = \bit{100000}]}_{p q^5} ~ + ~ \cdots ~ + ~ \underbrace{\Pr[E = \bit{000001}]}_{p q^5} ~ + \\ ~~ & \phantom{=} ~~ \underbrace{\Pr[E = \bit{100100}]}_{p^2 q^4}, \\ \end{aligned} \]

onde $q = 1 - p$. Portanto, a probabilidade de erro de palavra é

\[ \Pword = 1 - \left( q^6 + 6 p q^5 + p^2 q^4 \right). \]

O gráfico abaixo mostra a probabilidade de erro de palavra em função da probabilidade de inversão de bit do canal.

O teorema a seguir generaliza esse exemplo para códigos de bloco lineares arbitrários [MacWilliams–Sloane, p. 18].

Teorema. Probabilidade de erro de palavra do decodificador de mínima distância

A probabilidade de erro de palavra para o decodificador de mínima distância no canal BSC com probabilidade de inversão de bit $p$ é dada por

\[ \Pword = 1 - \sum_{i=0}^n \alpha_i \, p^i (1-p)^{n-i}, \]

em que $\alpha_i$ é o número de padrões de erro corrigíveis de peso $i$.

Decodificação de distância limitada. Muitos algoritmos de decodificação implementam a chamada decodificação de distância limitada (bounded distance decoding, em inglês). Nesse caso, o decodificador retorna a palavra-código mais próxima da palavra recebida, desde que a distância seja menor ou igual a $t$ (a capacidade de correção de erros do código); caso contrário, o decodificador retorna um erro.

Teorema. Probabilidade de erro de palavra do decodificador de distância limitada

A probabilidade de erro de palavra para o decodificador de distância limitada no canal BSC com probabilidade de inversão de bit $p$ é dada por

\[ \Pword = 1 - \sum_{i=0}^t \binom{n}{i} \, p^i (1-p)^{n-i}, \]

em que $t = \lfloor \frac{d - 1}{2} \rfloor$ é a capacidade de correção de erros do código.

Decodificação de distância limitada não alcança a capacidade do canal (capacidade de Shannon) [MacKay, p. 207; Richardon–Urbanke, p. 12].

Exemplo. Decodificação de mínima distância vs. decodificação de distância limitada

Pode-se mostrar que o código de Reed–Muller $(32, 6)$ tem a seguinte distribuição de peso dos padrões de erro corrigíveis:

$i$ $\alpha_i$ $\alpha_i / \binom{n}{i}$

A figura a seguir compara as probabilidades de erro de palavra para o decodificador de mínima distância e para o decodificador de distância limitada, em função da probabilidade de inversão de bit do canal.

Probabilidade de erro de bit

Quando o decodificador retorna uma mensagem incorreta, ainda é possível que alguns dos bits decodificados estejam corretos.

Definição. Probabilidade de erro de bit

A probabilidade de erro de bit na posição $i$ é dada por

\[ \Pbit^{(i)} = \Pr[\hat{U}_i \neq U_i], \]

em quem $1 \leq i \leq k$.

A probabilidade de erro de bit média (ou simplesmente probabilidade de erro de bit), $\Pbit$, é dada por

\[ \Pbit = \frac{1}{k} \sum_{i=1}^k \Pbit^{(i)}. \]

Agora, a decodificação de mínima distância não é mais necessariamente ótima, como já vimos.

Decodificação de mínima distância. Apesar de não necessariamente ser ótima, a decodificação de mínima distância de Hamming é frequentemente utilizada na prática. O exemplo a seguir ilustra o cálculo de $\Pbit$ nesse caso.

Exemplo. Probabilidade de erro de bit para decodificação de mínima distância

Considere o código de bloco linear $(6, 3)$ com matriz geradora dada por

\[ G = \begin{bmatrix} ~1 & 0 & 0 & 0 & 1 & 1~ \\ ~0 & 1 & 0 & 1 & 0 & 1~ \\ ~0 & 0 & 1 & 1 & 1 & 0~ \end{bmatrix}. \]

Determine uma expressão para a probabilidade de erro de bit para este código, assumindo decodificação de mínima distância de Hamming e canal BSC com probabilidade de inversão de bit $p$.

Solução.

Devido à linearidade, podemos assumir que a mensagem original é $u = \bit{000}$.

O objetivo é identificar o conjunto $\mathcal{E}^{(i)}$, que contém os padrões de erro responsáveis por introduzir um erro de bit na posição $i$, onde $1 \leq i \leq 3$. Uma vez que $u_i = \bit{0}$, um erro de bit na posição $i$ ocorre se e somente se $\hat{u}_i = \bit{1}$.

A determinação de $\mathcal{E}^{(i)}$ pode ser feita a partir do arranjo padrão.

Seja $\mathrm{Col}(u)$ a coluna do arranjo padrão associada à mensagem $u$. Por exemplo

\[ \mathrm{Col}(\bit{100}) = \{ \bit{100011}, \bit{000011}, \bit{110011}, \ldots, \bit{000111} \}. \]

Temos:

\[ \begin{aligned} \mathcal{E}^{(1)} & ~ = ~ \mathrm{Col}(\bit{\underline{1}00}) ~ \cup ~ \mathrm{Col}(\bit{\underline{1}01}) ~ \cup ~ \mathrm{Col}(\bit{\underline{1}10}) ~ \cup ~ \mathrm{Col}(\bit{\underline{1}11}), \\ \mathcal{E}^{(2)} & ~ = ~ \mathrm{Col}(\bit{0\underline{1}0}) ~ \cup ~ \mathrm{Col}(\bit{0\underline{1}1}) ~ \cup ~ \mathrm{Col}(\bit{1\underline{1}0}) ~ \cup ~ \mathrm{Col}(\bit{1\underline{1}1}), \\ \mathcal{E}^{(3)} & ~ = ~ \mathrm{Col}(\bit{00\underline{1}}) ~ \cup ~ \mathrm{Col}(\bit{01\underline{1}}) ~ \cup ~ \mathrm{Col}(\bit{10\underline{1}}) ~ \cup ~ \mathrm{Col}(\bit{11\underline{1}}). \end{aligned} \]

Como as colunas são disjuntas, as probabilidades de erro de bit em cada posição são

\[ \begin{aligned} \Pbit^{(1)} & ~ = ~ \Pr[\hat{U}_1 \neq U_1] ~ = ~ \Pr[E \in \mathcal{E}^{(1)}] \\ & ~ = ~ \Pr[\mathrm{Col}(\bit{100})] + \Pr[\mathrm{Col}(\bit{101})] + \Pr[\mathrm{Col}(\bit{110})] + \Pr[\mathrm{Col}(\bit{111})], \\[2ex] \Pbit^{(2)} & ~ = ~ \Pr[\hat{U}_2 \neq U_2] ~ = ~ \Pr[E \in \mathcal{E}^{(2)}] \\ & ~ = ~ \Pr[\mathrm{Col}(\bit{010})] + \Pr[\mathrm{Col}(\bit{011})] + \Pr[\mathrm{Col}(\bit{110})] + \Pr[\mathrm{Col}(\bit{111})], \\[2ex] \Pbit^{(3)} & ~ = ~ \Pr[\hat{U}_3 \neq U_3] ~ = ~ \Pr[E \in \mathcal{E}^{(3)}] \\ & ~ = ~ \Pr[\mathrm{Col}(\bit{001})] + \Pr[\mathrm{Col}(\bit{011})] + \Pr[\mathrm{Col}(\bit{101})] + \Pr[\mathrm{Col}(\bit{111})]. \end{aligned} \]

Somando essas três probabilidades, obtemos

\[ \begin{aligned} \Pbit^{(1)} + \Pbit^{(2)} + \Pbit^{(3)} & ~ = ~ \phantom{+} ~ 1 \Pr[\mathrm{Col}(\bit{001})] + 1 \Pr[\mathrm{Col}(\bit{010})] + 1 \Pr[\mathrm{Col}(\bit{100})] \\ & ~ \phantom{=} ~ + ~ 2 \Pr[\mathrm{Col}(\bit{011})] + 2 \Pr[\mathrm{Col}(\bit{101})] + 2 \Pr[\mathrm{Col}(\bit{110})] \\ & ~ \phantom{=} ~ + ~ 3 \Pr[\mathrm{Col}(\bit{111})]. \end{aligned} \]

O próximo passo é calcular as probabilidades de cada coluna. Isso é facilitado utilizando a distribuição de peso de cada coluna. Temos:

\[ \begin{aligned} \Pr[\mathrm{Col}(\bit{001})] & ~ = ~ 3 p^2 q^4 + 2 p^3 q^3 + 3 p^4 q^2, \\ \Pr[\mathrm{Col}(\bit{010})] & ~ = ~ 3 p^2 q^4 + 2 p^3 q^3 + 3 p^4 q^2, \\ \Pr[\mathrm{Col}(\bit{100})] & ~ = ~ 3 p^2 q^4 + 2 p^3 q^3 + 3 p^4 q^2, \\ \Pr[\mathrm{Col}(\bit{011})] & ~ = ~ \phantom{0 p^2 q^4 +} 4 p^3 q^3 + 1 p^4 q^2 + 2 p^5 q^1 + 1 p^6, \\ \Pr[\mathrm{Col}(\bit{101})] & ~ = ~ 1 p^2 q^4 + 4 p^3 q^3 + 1 p^4 q^2 + 2 p^5 q^1, \\ \Pr[\mathrm{Col}(\bit{110})] & ~ = ~ 1 p^2 q^4 + 4 p^3 q^3 + 1 p^4 q^2 + 2 p^5 q^1, \\ \Pr[\mathrm{Col}(\bit{111})] & ~ = ~ 3 p^2 q^4 + 2 p^3 q^3 + 3 p^4 q^2. \end{aligned} \]

Realizando as somas ponderadas, obtemos

\[ \begin{aligned} \Pbit^{(1)} + \Pbit^{(2)} + \Pbit^{(3)} & ~ = ~ \phantom{0}9 p^2 q^4 + \phantom{0}6 p^3 q^3 + \phantom{0}9 p^4 q^2 ~ + \\ & ~ \phantom{=} ~ \phantom{0}4 p^2 q^4 + 24 p^3 q^3 + \phantom{0}6 p^4 q^2 + 12 p^5 q^1 + \phantom{0}2 p^6~ + \\ & ~ \phantom{=} ~ \phantom{0}9 p^2 q^4 + \phantom{0}6 p^3 q^3 + \phantom{0}9 p^4 q^2 \\[1ex] & ~ = ~ 22 p^2 q^4 + 36 p^3 q^3 + 24 p^4 q^2 + 12 p^5 q^1 + \phantom{0}2 p^6. \end{aligned} \]

Portanto, a probabilidade de erro de bit é

\[ \Pbit = \frac{1}{3} \left( 22 p^2 q^4 + 36 p^3 q^3 + 24 p^4 q^2 + 12 p^5 q^1 + 2 p^6 \right). \]

A figura a seguir mostra a probabilidade de erro de bit em função da probabilidade de inversão de bit do canal.

O teorema a seguir generaliza esse exemplo para códigos de bloco lineares arbitrários [MacWilliams–Sloane, p. 20].

Teorema. Probabilidade de erro de bit para decodificação de mínima distância

A probabilidade de erro de bit para o decodificador de mínima distância de Hamming no canal BSC com probabilidade de inversão de bit $p$ é dada por

\[ \Pbit = \frac{1}{k} \sum_{u} \wH(u) \Pr[\mathrm{Col}(u)], \]

onde $u$ percorre todas as mensagens possíveis, $\wH(u)$ é o peso de Hamming de $u$, e $\Pr[\mathrm{Col}(u)]$ é a probabilidade de que o padrão de erro assuma um valor da coluna do arranjo padrão correspondente à mensagem $u$.

Embora tenha um apelo teórico, a aplicação prática do teorema acima é limitada, uma vez que o número de termos no somatório é $2^k$ e o cálculo de $\Pr[\mathrm{Col}(u)]$ pode ser complexo.

Decodificação MAP bit-a-bit. O esquema de decodificação que minimiza a probabilidade de erro de bit é o decodificador MAP bit-a-bit apresentado anteriormente.

Bibliografia

  1. Shu Lin; Daniel J. Costello, Jr.: Error Control Coding, 2nd edition, Pearson Education, 2004.
  2. Simon Haykin: Communication Systems, 4th edition, John Wiley & Sons, 2001.
  3. David J. C. MacKay: Information Theory, Inference, and Learning Algorithms, Cambridge University Press, 2003.
  4. F. J. MacWilliams; N. J. A. Sloane: The Theory of Error-Correcting Codes, North-Holland, 1977.