Unidad 3 · Decodificación por síndrome del Hamming (7,4)
El Hamming manda cuatro bits de mensaje y tres de paridad, y corrige un error. Con dos, uno espera que se rinda: que los deje como llegaron, o que arregle uno y se le escape el otro. No hace ninguna de las dos cosas. Con dos errores, el decodificador agrega un tercero. Pasa en los 21 patrones dobles, sin una excepción, y lo que entrega es una palabra válida a tres bits de la que se mandó.
Una palabra de código es cada uno de los 16 vectores de 7 bits que el código acepta: los cuatro bits del mensaje y, detrás, los tres de paridad que se calculan con ellos. El mensaje 1001 viaja como 1001 011, con la posición 0 a la izquierda. En el camino, el canal le suma un patrón de error : un vector con un 1 en cada posición que dio vuelta. Llega .
El receptor no conoce , pero puede calcular el síndrome, : tres bits que salen de multiplicar lo recibido por la matriz de paridad , la que anula a toda palabra de código. Como , el síndrome vale : depende sólo del error, no de lo que se mandó. Y se lee como una suma: el síndrome es la suma de las columnas de en las posiciones que el canal dio vuelta. La del es la del apunte:
Leídas de arriba abajo, sus columnas son , , , , , y : los siete vectores no nulos de tres bits, cada uno una vez. Un error en la posición da como síndrome , y como no hay dos columnas iguales, el síndrome dice dónde fue. El decodificador por síndrome no hace otra cosa: busca en una tabla de ocho entradas el patrón que le toca a cada síndrome —el líder de coset, el patrón de menor peso, o sea con menos unos, entre todos los que dan ese síndrome— y lo suma a lo recibido. En el los ocho líderes son el vector nulo y los siete errores simples.
Ésa es la garantía. La distancia mínima del código, la menor cantidad de posiciones en que difieren dos palabras, es , y de ahí sale la capacidad de corrección, : un error, en cualquier posición, se corrige siempre. La garantía no dice nada de dos.
Con errores en las posiciones y , el síndrome es . Dos vectores de tres bits distintos y no nulos suman otro no nulo, distinto de los dos. Y como las columnas de son todos los no nulos, esa suma es una columna: la de una tercera posición .
El decodificador recibe el síndrome de un error simple en , porque lo es, y da vuelta el bit . Ahora hay tres bits mal: los dos del canal y el que puso él.
Con la palabra del ejemplo del apunte, 1001 011, y el canal dando vuelta las posiciones 0 y 1, llega 0101 011. El síndrome es . El decodificador da vuelta el bit 3 y entrega 0100 011: una palabra de código, válida, a tres bits de la que se mandó. Del mensaje 1001, el canal había roto dos bits; el receptor se queda con 0100, que tiene tres mal.
Con un solo error, la apuesta segura es «menos»: el síndrome cae en la columna del error y la palabra sale limpia. Con dos, probá cualquier par: el síndrome cae siempre en una tercera columna, que se marca en rojo, y a la salida hay tres bits mal. La grilla de los 21 pares va guardando qué posición agregó el decodificador en cada par que probaste. Cambiar el mensaje no mueve nada de eso: el síndrome no depende de él.
Hay maneras de elegir dos posiciones de siete, y las 21 terminan igual. Medido decodificando los 21 pares sobre los 16 mensajes, 336 casos, la palabra entregada queda a distancia 3 de la transmitida —difiere en tres posiciones— en los 336. Y la simulación del corrector en SystemVerilog del curso, sobre los mismos 336, entrega los mismos mensajes.
El error final, además, no es cualquier vector de peso 3: es siempre una palabra de código. Lo que termina sumado a son los dos bits del canal más el que agrega el decodificador, y su síndrome es . El tiene siete palabras de peso 3, y cada una tiene tres pares adentro: . Por eso lo que sale siempre pasa por válido.
Lo que el receptor se queda es el mensaje, las cuatro primeras posiciones, y ahí el tercer bit a veces cae y a veces no. Contando, en cada par, cuántos de los cuatro bits de mensaje llegaron mal y cuántos salen mal:
| dónde cayeron | pares | al llegar | al salir |
|---|---|---|---|
| los dos en la paridad | 3 | 0 | 1 en los 3 |
| uno y uno | 12 | 1 | 1 en 6 · 2 en 6 |
| los dos en el mensaje | 6 | 2 | 2 en 3 · 3 en 3 |
A la salida, el mensaje tiene 1 bit mal en 9 pares, 2 en 9 y 3 en 3. En ningún par mejora: en 9 queda igual, porque el bit que agrega el decodificador cae en la paridad, y en los otros 12 empeora en uno. El caso más feo es el primero: con los dos errores en la paridad el mensaje había llegado intacto, y el decodificador lo rompe. En promedio, un par trae bits de mensaje mal y sale con : la mitad más.
Parece un decodificador mal hecho, y es el mejor posible. Sobre el canal binario simétrico, que da vuelta cada bit por separado con probabilidad , un patrón dado de peso tiene probabilidad . El error simple en y el doble en y dan el mismo síndrome, y el simple es más probable:
En , 99 veces más. Quedarse con el patrón de menor peso es la decisión de máxima verosimilitud: ninguna regla se equivoca menos. Y la cuenta no cambia si se juntan los tres dobles que comparten cada síndrome: los tres suman , y el simple les gana mientras . El tercer bit no es una falla de la regla. Es lo que la regla cuesta cuando el canal hizo lo menos probable.
Tampoco se le puede pedir que se abstenga. El síndrome de un doble es idéntico al de un simple: el decodificador no tiene con qué distinguirlos. La decodificación incompleta, la que corrige sólo los patrones de peso hasta y para el resto declara falla, acá no cambia nada: el es un código perfecto, sus ocho síndromes alcanzan justo para el vector nulo y los siete simples, , y no queda ninguno libre para avisar. Para que la bandera se levante hace falta un código que deje síndromes sin un error simple que los explique, como el : en un código perfecto la bandera no se levanta.
Y como lo que entrega es una palabra de código, un chequeo que vuelva a calcular el síndrome a la salida da cero. No queda rastro: un síndrome cero no prueba nada.
Decodificando los 128 patrones posibles, uno por uno, y contando cuántos bits salen mal según cuántos entraron:
| errores del canal | patrones | bits mal a la salida |
|---|---|---|
| 0 | 1 | 0 |
| 1 | 7 | 0 en los 7 |
| 2 | 21 | 3 en los 21 |
| 3 | 35 | 3 en 7 · 4 en 28 |
| 4 | 35 | 3 en 28 · 4 en 7 |
| 5 | 21 | 4 en los 21 |
| 6 | 7 | 7 en los 7 |
| 7 | 1 | 7 |
De los 120 patrones con dos errores o más, el decodificador no acierta ninguno: sólo corrige los ocho líderes. La salida es siempre una palabra de código, así que lo que queda mal también lo es, y por eso a la salida sólo hay 0, 3, 4 o 7 bits mal. Con tres errores que ya forman una palabra, 7 de los 35, el síndrome es cero y no toca nada; con los otros 28 agrega un cuarto. Con cuatro, en 28 de 35 da vuelta uno de los errados y quedan tres: menos bits mal, y la palabra igual equivocada. Y con seis, el síndrome es la columna del único bit que llegó bien —las siete columnas suman cero—, y el decodificador da vuelta justo ése.
Con chico, casi todo lo que sale mal entró con dos errores. Sumando la probabilidad exacta de cada uno de los 128 patrones sobre el canal binario simétrico: en , el decodificador entrega mal de los bloques, y el 98,3 % de esos son dobles; en , el 99,8 %. Los dobles no son un caso de borde: son la forma en que el se equivoca.
Y se ve en la tasa de error del mensaje. A primer orden la ponen los 21 pares, cada uno con bits mal en promedio repartidos entre cuatro: , o sea . Si el decodificador dejara los dobles como llegaron serían por par, : a primer orden, uno de cada tres bits de mensaje que salen mal lo puso él. La cuenta exacta en da contra los de la aproximación.
Decodificar igual conviene, por lejos: en el mismo canal, leer los cuatro bits de mensaje sin corregir da . El tercer bit no cambia qué bloques salen mal: encarece los que ya iban a salir mal. Cuánto cuesta corregir en vez de sólo detectar está en corregir uno cuesta 3/p, y si el código paga lo que gasta en paridad, medido en , en el código que todos inventan primero no paga nunca.