Unidad 4 · Las familias · todas las columnas no nulas, la distancia 3 por la tercera columna, perfectos, el síndrome como dirección del error, el símplex dual y lo que el largo compra y lo que no
La unidad anterior dejó un criterio para leer una matriz de paridad: la distancia mínima es la menor cantidad de columnas de que suman cero. Leído al revés, es una receta: elegir las columnas es elegir el código. La construcción de Hamming es la respuesta más directa posible a esa receta. Pide que ninguna columna sea nula y que no haya dos iguales, y después toma todas las que cumplen.
Con filas, los vectores no nulos de bits son exactamente . Para cada , el código de Hamming de orden es el código lineal cuya tiene por columnas esos vectores, cada uno una vez. Los parámetros se leen de la definición: hay una columna por posición y una fila por bit de paridad, así que
Con sale el (7,4) de la unidad anterior. Escritas las columnas en el orden de los números que representan, del 1 al 7, con el bit más significativo arriba:
La definición fija el conjunto de columnas, no su orden. Dos órdenes distintos dan códigos equivalentes: los mismos parámetros, la misma distribución de pesos, y las posiciones permutadas. El orden es la única libertad de diseño que queda, y se usa para dos cosas distintas que la sección 04 separa. Los primeros miembros de la familia:
| m | código | tasa R = k/n | t |
|---|---|---|---|
| 3 | (7,4) | 0,5714 | 1 |
| 4 | (15,11) | 0,7333 | 1 |
| 5 | (31,26) | 0,8387 | 1 |
| 6 | (63,57) | 0,9048 | 1 |
| 7 | (127,120) | 0,9449 | 1 |
| 8 | (255,247) | 0,9686 | 1 |
La tasa tiende a 1, porque la paridad crece como y el largo como . La capacidad de corrección se queda en para toda la familia. Esas dos columnas son la tensión entera de la nota.
Paso 1: al menos 3. Ninguna columna es nula, así que ninguna sola suma cero. No hay dos iguales, así que ningún par suma cero: sólo pasa si . Por el criterio de las columnas, .
Paso 2: la tercera columna. Para ver que no es más, hace falta una palabra de peso 3. Se toman dos columnas cualesquiera, y con . Su suma es un vector de bits, no nulo porque son distintas. Y como tiene todos los vectores no nulos, esa suma es la columna de alguna posición :
con distinto de y de , porque si fuera sería . El vector con unos en , y cumple : es palabra, de peso 3. Entonces y : corrige un error, o detecta dos.
Paso 3: no se puede alargar. Con filas no hay una columna número que no sea nula ni repetida. Agregarla mete una columna repetida, y dos columnas iguales son una palabra de peso 2. Los Hamming son los códigos más largos con bits de paridad y ; dicho de otro modo, los de mayor tasa para esa distancia.
La cota de Hamming pide que las esferas de radio quepan en el espacio sin solaparse: . Con el miembro izquierdo es , y con ,
La cota se cumple con igualdad: todo código de Hamming es un código perfecto. Leído en síndromes, hay y se reparten así: el nulo para «sin error» y uno por cada error simple, que es su columna. Los líderes de coset son exactamente la palabra nula y los vectores de peso 1. No sobra ninguno.
Eso tiene dos caras. La buena: no hay síndromes desperdiciados, y la tabla de decodificación es la lista de las columnas. La mala: no queda ningún síndrome libre para avisar. Con dos errores en y el síndrome es , que por el paso 2 es la columna de una tercera posición. El decodificador invierte y entrega una palabra con tres bits mal, sin ninguna señal: es con dos errores, el decodificador empeora, y vale para toda la familia, no sólo para el (7,4). Lo arreglan el bit de paridad global del código extendido y los códigos acortados, que dejan síndromes sin dueño.
Los códigos binarios perfectos son pocos. La lista completa son las repeticiones de largo impar, los Hamming y el Golay (23,12). No hay otros.
Hay dos órdenes de columnas que valen la pena, y no se pueden tener a la vez.
El orden sistemático pone al final las columnas de peso 1, de modo que y : es la forma sistemática, con el mensaje intacto en las primeras posiciones. Es el que usa el (7,4) del curso, y ahí el síndrome no se lee como número: la correspondencia con las posiciones es una tabla.
El orden natural pone en la posición la columna que representa en binario al número , con el bit más significativo en la fila 0. Como el síndrome de un error simple es su columna,
El síndrome es la dirección del bit errado, contada desde 1. El corrimiento no es un capricho: el número 0 ya está tomado, porque quiere decir que no hubo error. En el (15,11), un error en la posición 10 —la undécima— da , que es 11. El localizador deja de ser una tabla de entradas y pasa a ser un decodificador binario de a líneas, una red combinacional que crece linealmente con .
El precio está en el codificador. Las columnas de peso 1 —los números 1, 2, 4, 8— caen en las posiciones 0, 1, 3 y 7, y el mensaje ocupa las once restantes, intercalado con la paridad. Un orden simplifica el codificador; el otro, el localizador.
Con dos errores la dirección miente de una forma precisa. El síndrome es la suma de las dos columnas, y sumar módulo 2 los dos números en binario es un XOR bit a bit: errores en las posiciones 2 y 9, direcciones 3 y 10, dan , que es 9. El decodificador invierte la posición 8, que estaba bien.
Prendé un bit cualquiera: el síndrome, leído de la fila 0 a la 3, es la posición más uno, y la marca de abajo cae justo sobre el error. Ahora prendé un segundo bit. La marca se va a otra posición, la del XOR de las dos direcciones, y el contador de bits mal pasa de 2 a 3. Probá con tres errores elegidos de modo que una dirección sea el XOR de las otras dos —1, 2 y 3, en las posiciones 0, 1 y 2—: el síndrome da cero y el decodificador no hace nada.
El código dual de un Hamming tiene a por generadora: es un , y tiene una propiedad rara.
Todas sus palabras no nulas pesan lo mismo, . Una palabra del dual es con un vector de bits, y su componente es el producto . Con , la función es lineal y no nula, así que vale 0 en un subespacio de dimensión y 1 en los otros vectores, ninguno de ellos nulo. Las columnas de son todos los no nulos, de modo que exactamente de ellas dan . El peso de no depende de .
Un código cuyas palabras están todas a la misma distancia unas de otras se llama símplex, por la figura de vértices equidistantes. En el dual del (15,11) las quince palabras no nulas pesan 8. Su enumerador de pesos tiene dos términos:
Con el dual en la mano, la identidad de MacWilliams da el enumerador del Hamming sin recorrer sus palabras. Se reemplaza en , se usa , y queda
Para el (7,4) da
que es la distribución de la unidad anterior. Para el (15,11), enumeradas sus 2048 palabras, la distribución coincide con la de la fórmula término a término:
| peso | 0 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 15 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| palabras | 1 | 35 | 105 | 168 | 280 | 435 | 435 | 280 | 168 | 105 | 35 | 1 |
El dato que más importa es , cuántas palabras hay a la distancia mínima, y sale sin álgebra del paso 2. Cada par de columnas cierra con una única tercera y da una única palabra de peso 3. Cada palabra de peso 3 se cuenta así tres veces, una por cada par de sus tres posiciones:
Da 7 en el (7,4), 35 en el (15,11), 155 en el (31,26) y 10 795 en el (255,247). La distancia mínima es 3 para todos, pero la cantidad de vecinos a esa distancia crece con el cuadrado del largo.
Sobre un canal que invierte cada bit con probabilidad , las dos formas de usar el código dan dos probabilidades.
Sólo detectar. Un error pasa sin ser visto cuando el patrón de error es una palabra no nula: . Con chico manda el término más bajo, .
Corregir. Como los líderes son el nulo y los de peso 1, la decodificación acierta si y sólo si el canal metió a lo sumo un error:
La aproximación es el primer término de la cola. Sin codificar, un bloque de bits llega con algún error con probabilidad : el código cambia la dependencia de lineal a cuadrática. Pero el coeficiente crece con el cuadrado del largo, y a igual el código largo pierde más bloques que el corto. Con , la fórmula exacta da en el (7,4) y en el (255,247). El largo apuesta todo a que el bloque, cada vez más grande, traiga a lo sumo un error.
La aproximación también tiene su límite, y es el mismo: vale mientras sea chico, porque descarta los bloques con tres errores o más. Con todavía anda en el (7,4), con un 3 % de más, pero en el (255,247) da 3,24: una probabilidad mayor que 1, donde la exacta es 0,724.
La probabilidad de bloque a igual no es una comparación justa entre largos, porque el código largo paga menos redundancia. Sobre un enlace BPSK con ruido gaussiano y decisión dura, el código reparte la energía de cada bit de mensaje entre símbolos, y la probabilidad de cruce del canal es
Un código de tasa alta casi no le quita energía al símbolo. La métrica es la tasa de error de bit después de decodificar, que el apunte aproxima con su ec. (6),
y la ganancia de codificación es la distancia horizontal entre esa curva y la de no codificar, a igual tasa de error de bit: cuántos dB de se ahorran. Para el (7,4) está medida en el código que todos inventan primero no paga nunca. Cuando el objetivo se vuelve cada vez más exigente, la ganancia con decisión dura tiende a un límite, la ganancia asintótica
que crece con el largo hacia dB. El porqué está en las pendientes: con chico, va como , porque hacen falta errores para equivocarse, y cada cae como . La cuenta con en lugar de , , es el límite con decisión blanda, y con decisión dura no se alcanza: le faltan dB. Medido con la ec. (6), la ganancia del (15,11) va 1,15 · 1,53 · 1,61 · 1,64 dB a , , y : se acerca a 1,66, no a los 3,42 de la otra fórmula. Y llega despacio. Tampoco es un techo estricto: el (7,4) lo pasa, con 0,59 dB a y 0,61 a , y recién después vuelve a bajar hacia su 0,58. La ganancia que se especifica es la de una tasa de error concreta, no el límite.
Andá del (7,4) al (255,247) de a uno, con el objetivo en . Las primeras barras suben y la asintótica también; en algún punto la barra deja de seguirla. Cambiá después el objetivo a y mirá dónde queda el máximo.
Calculada con la ec. (6) y la del canal, buscando por bisección el al que cada curva llega a la tasa objetivo:
| código | a 10⁻⁵ | a 10⁻⁸ | a 10⁻¹² | asintótica 10·log₁₀ 2R | cruce |
|---|---|---|---|---|---|
| (7,4) | 0,41 | 0,54 | 0,59 | 0,58 | 5,86 |
| (15,11) | 1,15 | 1,41 | 1,53 | 1,66 | 4,16 |
| (31,26) | 1,45 | 1,81 | 1,99 | 2,25 | 4,18 |
| (63,57) | 1,52 | 1,97 | 2,20 | 2,58 | 4,58 |
| (127,120) | 1,47 | 2,00 | 2,28 | 2,76 | 5,10 |
| (255,247) | 1,35 | 1,95 | 2,28 | 2,87 | 5,66 |
Todo en dB. A la ganancia crece hasta el (63,57), con 1,52 dB, y después baja, aunque la asintótica siga subiendo. Son los dos efectos de la sección anterior tirando para lados opuestos: el largo le devuelve energía al símbolo, porque se acerca a 1, y le cobra en , porque el bloque tiene más lugar para un segundo error. Cuanto más exigente el objetivo, más chico es en el punto de trabajo, menos pesa el coeficiente y más lejos queda el máximo: a está en el (127,120), y a el (127,120) y el (255,247) empatan en 2,28 dB, a tres milésimas.
El cruce —donde la curva codificada corta a la de no codificar, y por debajo del cual codificar empeora— tampoco es monótono: baja de 5,86 dB en el (7,4) a 4,16 en el (15,11) y vuelve a subir. Por encima de 5 dB quedan el (7,4), el (127,120) y el (255,247); los tres del medio cruzan entre 4,16 y 4,58. Y la ganancia no es «una fracción de dB»: a pasa de 1 dB desde el (15,11). La ec. (6) es una aproximación, pero no es la que mueve estos números: enumerando los patrones del (15,11), decodificando por síndrome y contando los bits de mensaje errados, la ganancia exacta a también da 1,15 dB.
La elección de en un diseño queda atada a dos cosas de afuera: la redundancia que el sistema tolera, que pone un piso a , y la tasa de error de bloque que se acepta al del canal, que pone un techo. Las longitudes rara vez coinciden con el bloque que el sistema impone, y por eso en la práctica casi todo Hamming viaja acortado.