Unidad 3 · Códigos de bloque lineales · lo que el receptor puede calcular sin saber qué se mandó, la suma de columnas de H, el calculador del (7,4) y los dieciséis patrones de cada síndrome
El receptor tiene en la mano una sola cosa: lo que llegó. No sabe qué se transmitió —eso es lo que quiere averiguar— ni dónde se equivocó el canal. El síndrome es una cuenta sobre lo recibido que da un resultado que no depende de lo transmitido: sólo de lo que hizo el canal. Toda la decodificación algebraica, de acá hasta BCH, se apoya en eso.
Se transmite una palabra de código de un código y llega . Lo que el canal hizo se escribe como un vector más, el patrón de error , con un 1 en cada posición que el canal invirtió y un 0 en las demás:
La suma es bit a bit, módulo 2: sumar un 1 es dar vuelta el bit. Con la matriz de paridad del código, de , el síndrome de lo recibido es el vector de bits
Cada bit es una ecuación de paridad: es la suma de los bits de en las posiciones donde la fila de tiene un 1, y vale 1 cuando esa ecuación no cierra. En el Hamming (7,4) del curso,
y las tres ecuaciones son
Las cuatro primeras posiciones son el mensaje y las tres últimas la paridad, porque y . Cada ecuación mezcla tres bits de mensaje con un solo bit de paridad: repite la cuenta con la que el codificador armó y se fija si lo que llegó en la posición 4 coincide.
Paso 1: reemplazar lo recibido. El receptor calcula sobre , que es :
Paso 2: distribuir. El producto por una matriz es lineal, también sobre :
Paso 3: lo transmitido se anula. es palabra de código, y una palabra de código es justo un vector con : es el criterio de pertenencia. Queda
El receptor no conoce ni , pero calcula sobre una cantidad que es función de solo. Los dieciséis mensajes del (7,4), con el mismo patrón de error encima, dan el mismo síndrome. Es lo que vuelve viable toda la decodificación: cualquier pregunta sobre el error se puede contestar mirando , sin pasar por las palabras.
De ahí sale el criterio de detección, que es asimétrico. Si , hubo error con certeza: ninguna palabra de código da un síndrome no nulo. Si , lo recibido es palabra de código, que no es lo mismo que decir que no hubo error.
Leída por columnas, la cuenta se vuelve más útil que la matricial. Con la columna de y el conjunto de posiciones con error,
Las posiciones sin error multiplican su columna por 0 y desaparecen. El síndrome es la suma de las columnas de donde hubo error, y nada más. Las del (7,4), escritas de arriba abajo como , son
los siete vectores no nulos de tres bits, cada uno una vez. Con un solo error en la posición , el síndrome es ; como las siete son distintas y ninguna es nula, cada error simple da un síndrome propio y queda localizado.
El ejemplo del apunte: el mensaje se codifica como , el canal invierte la posición 2 y llega . Por las ecuaciones, , y : . Por columnas la cuenta es más corta, porque elige una sola. En ningún momento se comparó con las dieciséis palabras.
El apunte y la filmina dicen que, para este código, el síndrome es la posición del error escrita en binario. Con la sistemática de arriba no lo es: es y es , y leídas como números en cualquiera de los dos sentidos las siete columnas no dan 0 a 6 ni 1 a 7. Lo que sí vale es que la correspondencia entre síndromes no nulos y posiciones es uno a uno, y por eso el localizador sigue siendo un decodificador de 3 a 7 líneas: una tabla fija, no la lectura de un número. La cuyas columnas son las posiciones en binario existe, y es otro ordenamiento de las mismas siete columnas: da un código equivalente, con las posiciones permutadas, no el mismo.
El calculador de síndrome del RTL del curso es esas tres ecuaciones y una compuerta más. El bit de cada bus es la posición , así que cada línea se lee contra una fila de sin traducir nada:
always_comb begin
syndrome[0] = message_d[0] ^ message_d[2] ^ message_d[3] ^ message_d[4];
syndrome[1] = message_d[0] ^ message_d[1] ^ message_d[2] ^ message_d[5];
syndrome[2] = message_d[1] ^ message_d[2] ^ message_d[3] ^ message_d[6];
end
assign o_syndrome = syndrome;
assign o_zero_syndrome = (|syndrome == 1'b0);
Cada fila de tiene cuatro unos, así que cada bit del síndrome es un XOR de cuatro entradas: tres en total, sin memoria. message_d es la palabra recibida retenida un ciclo de reloj por un registro de entrada; el cálculo en sí es combinacional. Y o_zero_syndrome es el detector: el OR de los tres bits, negado. Vale 1 exactamente cuando , con la misma asimetría de la sección anterior.
Lo que el circuito no tiene es . Calcula sobre , que es lo único que le llega, y le sirve porque . Simulado el (7,4) entero sobre los dieciséis mensajes por los 128 patrones, la bandera de corrección del decodificador —que es o_zero_syndrome negado— se levanta en los 2048 casos exactamente cuando . Cómo se usa ese síndrome para corregir es el standard array y la decodificación por síndrome.
El síndrome tiene bits y el patrón de error . Hay síndromes para patrones, y a cada síndrome le tocan
patrones distintos. El sistema tiene incógnitas y ecuaciones: está indeterminado, y sus soluciones son un patrón cualquiera más cada una de las palabras de código, porque sumar una palabra no mueve el síndrome. En el (7,4) son 16 por síndrome. Enumerando los 128 patrones y agrupándolos por síndrome y por peso:
| síndrome | peso 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
|---|---|---|---|---|---|---|---|---|
| 000 | 1 | 0 | 0 | 7 | 7 | 0 | 0 | 1 |
| los otros 7 | 0 | 1 | 3 | 4 | 4 | 3 | 1 | 0 |
Los siete síndromes no nulos tienen el mismo reparto: uno de peso 1, tres de peso 2, y así hasta uno de peso 6. Para los de peso 2 son , y : , y dan todas .
Ninguna cuenta sobre elige entre los dieciséis: todos cumplen las ecuaciones por igual. La elección es estadística. Sobre un canal que invierte cada bit con probabilidad , un patrón de peso tiene probabilidad , y cada bit de más multiplica por : con , el de peso 1 es 99 veces más probable que cada uno de peso 2. Sumando los dieciséis, dado un síndrome no nulo el patrón de peso 1 es el que ocurrió con probabilidad 0,970, y con baja a 0,720. El de menor peso de cada grupo es el líder de coset, y es la apuesta del decodificador.
Con el síndrome es y la lista de abajo son las dieciséis palabras de código. Prendé un bit de : se marca una columna de y el síndrome pasa a ser esa columna. Ahora apretá «Siguiente mensaje» varias veces: cambian y , cambian los términos de las tres ecuaciones, y el síndrome no se mueve; el contador lleva cuántos mensajes probaste y cuántos síndromes distintos dieron. Con dos bits de error, la suma de dos columnas cae siempre en una tercera, y el síndrome queda igual al de un error solo en otra posición. Con tres bits bien elegidos —, por ejemplo— la suma da cero.
Las dos cosas que el síndrome no resuelve salen de la misma cuenta.
Un error que es palabra de código pasa sin dejar rastro. Si es una palabra no nula, y lo recibido es otra palabra válida: el receptor la acepta. En el (7,4) son las palabras no nulas, la fila del en la tabla de arriba: siete de peso 3, siete de peso 4 y una de peso 7. Ningún patrón de peso 1 o 2 está entre ellas, porque la distancia mínima es 3; cuánto pesa lo que se escapa está en un síndrome cero no prueba nada.
Dentro de un grupo, el síndrome no distingue. En el (7,4) dos columnas suman siempre una tercera, porque las siete son todos los vectores no nulos de tres bits y la suma de dos distintas no es nula ni igual a ninguna de las dos. Los 21 patrones dobles dan, los 21, el síndrome de un error simple en otra posición: da . El decodificador, que apuesta al patrón más liviano, corrige la posición 4 y entrega una palabra con tres bits mal: con dos errores, el decodificador empeora. No es un defecto del circuito: es el límite de la sección anterior, ocho síndromes para 128 patrones.