Bitácora · FEC · Concepto

El código lineal y la matriz G

Unidad 3 · Códigos de bloque lineales · el subespacio, la tasa, la matriz generadora, la forma sistemática y las 16 palabras del (7,4)

Por un canal de n bits pueden pasar 2n palabras. Un código declara válidas sólo 2k, que alcanzan justo para los 2k mensajes de k bits; las otras 2n−2k quedan prohibidas, y si llega una, hubo error. Toda la teoría de los códigos de bloque es elegir bien ese subconjunto. Un código lineal pide una sola cosa más: que el subconjunto sea un subespacio. Con eso alcanzan k vectores para describirlo entero, y codificar pasa a ser un producto de un vector por una matriz.

01 · La definición

Un código de bloque lineal (n,k) sobre GF(2) es un subespacio de dimensión k de Vn, el espacio de las n-tuplas binarias. Sus 2k elementos son las palabras de código. n es la longitud de bloque, k la cantidad de bits de información, y los n−k que sobran son redundancia, o paridad. La tasa es la fracción del flujo que es información:

R=kn

El ejemplo de toda la unidad es el Hamming (7,4): 16 palabras válidas entre 128, una de cada ocho, y R=4/7≈0,571. De cada siete bits que viajan, cuatro son del usuario. Es el mismo Hamming que cruza a no codificar en 5,85 dB.

De ser un subespacio salen dos propiedades que se usan todo el tiempo:

  1. La palabra nula está siempre, sea cual sea el código.
  2. La suma de dos palabras es otra palabra. La suma es bit a bit, módulo 2: un XOR.

Sobre GF(2) esas dos son la definición entera, no una consecuencia. Los únicos escalares son 0 y 1, así que multiplicar por un escalar no agrega ninguna exigencia; y la primera sale de la segunda, porque v+v=0 para cualquier v. Un conjunto no vacío de vectores binarios es un código lineal si y sólo si es cerrado para la suma. El conjunto {0000, 1100, 1010, 0111} tiene cuatro palabras, 22, pero no es lineal: 1100 + 1010 = 0110 no está.

La segunda propiedad tiene un costado que rinde mucho más adelante. Sumarle una palabra fija v a todas las palabras del código las devuelve a todas, sólo que en otro orden: el resultado está en el código por la suma cerrada, y dos palabras distintas no pueden ir a parar a la misma. El código se ve igual desde cualquiera de sus palabras, y por eso para analizar los errores alcanza con suponer que se transmitió la nula: es lo que hace que la distancia mínima se lea como un peso.

02 · La matriz generadora

Un subespacio de dimensión k tiene una base de k vectores linealmente independientes, g0,g1,…,gk−1. Puestos como filas forman la matriz generadora G, de k×n. El mensaje u=(u0,…,uk−1) se codifica como

v=u·G=u0g0+u1g1+⋯+uk−1gk−1

Leído bit a bit: cada ui=1 elige la fila gi, y la palabra es el XOR de las filas elegidas. Con eso la suma cerrada se ve en una línea: si v=uG y v′=u′G, entonces v+v′=(u+u′)G: la suma de dos palabras es la palabra de la suma de los mensajes.

Lo que cuesta. El codificador no guarda las 2k palabras: guarda las k·n entradas de G. Para el (255,239) del trabajo final es la diferencia entre una tabla de 2239 palabras, que no entra en ningún universo, y 60.945 bits. Ésa es la razón de pedir linealidad: no es una comodidad matemática, es lo que vuelve al código implementable.

Las filas tienen que ser independientes. Si una fila es suma de otras, dos mensajes distintos caen en la misma palabra. Con las filas del (7,4) pero la cuarta cambiada por g0+g1, el mensaje 1101 suma g0+g1+(g0+g1)=0, la misma palabra que 0000. Los 16 mensajes dan sólo 8 palabras distintas, cada una dos veces, y el receptor no tiene forma de saber cuál de los dos se mandó.

La base no es única. Cualquier otra base del mismo subespacio da otra G con el mismo código: cambia qué palabra le toca a cada mensaje, no el conjunto de palabras. Cuántas hay se cuenta eligiendo las filas en orden, cada una fuera del subespacio que generan las anteriores:

(24−1)(24−2)(24−22)(24−23)=15·14·12·8=20.160

El (7,4) tiene 20.160 matrices generadoras, y recorriendo todas las cuaternas de palabras no nulas e independientes salen exactamente ésas. Todas codifican el mismo conjunto de 16 palabras, y las capacidades de detectar y corregir dependen sólo del conjunto. Lo que decide cuál usar es la comodidad.

03 · La forma sistemática

De todas esas matrices, hay una que se prefiere. G está en forma sistemática cuando se escribe

G=[IkP]

con Ik la identidad de k×k y P de k×(n−k). Desarrollando u·G con esa forma, el mensaje sale intacto en las primeras k posiciones y detrás vienen n−k bits de paridad:

v=(u0,…,uk−1⏟mensaje,p0,…,pn−k−1⏟paridad),pj=∑i=0k−1uipij

Cada bit de paridad es el XOR de los bits de mensaje que marca la columna j de P: una ecuación de paridad. Todo el diseño del código vive en P. La ventaja es del receptor: si no hubo errores, lee el mensaje directamente, sin deshacer ninguna transformación. Y la matriz de paridad sale sin hacer cuentas, H=[PTIn−k].

Es una sola. De las 20.160 G del (7,4), la sistemática es exactamente una, y no por casualidad: si las primeras cuatro posiciones de uG tienen que repetir u, la fila gi tiene que ser la única palabra del código que empieza con un 1 en la posición i y ceros en las otras tres. No queda nada para elegir. La convención de poner el mensaje adelante sí es una elección, y en toda la unidad se usa ésta.

La G del (7,4), con las posiciones de 0 a 6 de izquierda a derecha:

G=[1000110010001100101110001101]=[I4P]

Leyendo las tres columnas de P de arriba abajo salen las tres ecuaciones de paridad:

p0=u0+u2+u3p1=u0+u1+u2p2=u1+u2+u3

En hardware. El codificador del RTL del curso es exactamente eso. Los cuatro bits de mensaje pasan como cables a las posiciones 0 a 3 de la salida, y la paridad son tres asignaciones, una por columna de P. El bit i de cada bus es la posición i: i_info[i] es ui y parity[j] es pj, que va a la posición 4+j.

assign parity[0] = i_info[0] ^ i_info[2] ^ i_info[3];
assign parity[1] = i_info[0] ^ i_info[1] ^ i_info[2];
assign parity[2] = i_info[1] ^ i_info[2] ^ i_info[3];

Cada columna de P tiene tres unos, así que cada bit de paridad es un XOR de tres entradas, y el codificador entero es combinacional: cuatro cables y tres compuertas, sin un solo registro. Simulado sobre los 16 mensajes, entrega las mismas 16 palabras que u·G.

Simulación Codificar es sumar filas de G — cada bit de u que prendés elige una fila de G, y la palabra es el XOR de las filas elegidas. Abajo, las 16 palabras del código, tapadas hasta que armes el mensaje que lleva a cada una. Arranca en u = 0000.
u — v = u·G — filas sumadas — mensaje intacto — palabras halladas — guardada + actual —

Con u = 0000 no hay ninguna fila elegida y la palabra es la nula. Prendé u0 y u3: se suman g0 y g3, y sale 1001 011, con el mensaje adelante y la paridad atrás. Guardala, armá 0110 y mirá la suma: 1111 111, que es la palabra de 1111. Probá con las que quieras: no hay suma de dos palabras que se salga del código. Y prendé la otra base, la que cambia g0 por g0+g1: el mismo 1001 sale 1101 000, y las primeras cuatro posiciones ya no son el mensaje. De los 16 mensajes, 8 cambian de palabra, pero las palabras que aparecen en la grilla son las mismas 16. Cambió la correspondencia, no el código.

04 · Las 16 palabras del (7,4)

Los cuatro primeros bits son el mensaje; los tres últimos, la paridad. La columna w es el peso, la cantidad de unos de la palabra:

uvwuvw
00000000 000001100110 1003
10001000 110301010101 1104
01000100 011300110011 0103
00100010 111411101110 0104
00010001 101311011101 0003
11001100 101410111011 1004
10101010 001301110111 0014
10011001 011411111111 1117

Una es de peso 0, siete de peso 3, siete de peso 4 y una de peso 7. La más liviana que no es nula tiene tres unos, y eso, por la suma cerrada, es lo mismo que decir que dos palabras distintas difieren siempre en tres posiciones o más: es la distancia mínima del código, y lo que le permite corregir un error. Las cuatro filas de G están en la tabla —son las palabras de 1000, 0100, 0010 y 0001— y las otras doce son sumas de ellas.

05 · Cuándo no hay forma sistemática

El apunte dice que toda G de rango k se lleva a [IkP] con operaciones de fila y, si hace falta, permutando columnas. Ese «si hace falta» tiene un precio. Las operaciones de fila cambian la base y dejan el código igual; permutar columnas cambia el código.

El caso más chico: el (4,2) {0000, 1100, 0011, 1111}. En todas sus palabras las posiciones 0 y 1 son iguales, así que ninguna empieza con 10 y el mensaje no puede ir intacto ahí. Escalonando sus filas, los pivotes caen en las columnas 0 y 2, no en 0 y 1. Intercambiando las posiciones 1 y 2 sale {0000, 1010, 0101, 1111}, que sí tiene G=[I2P]. Es un código equivalente: los mismos pesos, las mismas distancias, la misma capacidad de corregir. Pero son otras palabras, y un decodificador escrito para uno no sirve para el otro sin deshacer la permutación.

El (7,4) también tiene posiciones donde el mensaje no entra. De las 35 formas de elegir cuatro posiciones, 28 sirven para llevar el mensaje intacto y 7 no. Las siete que fallan son las que dejan afuera, exactamente, las tres posiciones de una palabra de peso 3. Esa palabra vale cero en las cuatro elegidas, igual que la nula, y si dos palabras distintas coinciden ahí, esas cuatro posiciones no pueden distinguir 16 mensajes. Por ejemplo, 0100 011 tiene sus unos en 1, 5 y 6: las posiciones 0, 2, 3 y 4 no alcanzan.

Para tener a mano

  1. Un código lineal (n,k) es un subespacio de dimensión k de Vn: 2k palabras entre 2n, con tasa R=k/n. Sobre GF(2), lineal es lo mismo que cerrado para la suma; la nula viene incluida.
  2. v=u·G: cada ui=1 elige la fila gi y la palabra es el XOR de las elegidas. Las filas tienen que ser independientes, o dos mensajes chocan.
  3. El codificador guarda k·n bits, no 2k palabras: es lo que hace implementable al código.
  4. Otra base da otra G y el mismo código. El (7,4) tiene 20.160, y una sola es sistemática.
  5. G=[IkP]: el mensaje va intacto adelante y cada bit de paridad es un XOR de bits de mensaje, uno por columna de P. Entonces H=[PTIn−k].
  6. En el (7,4): p0=u0+u2+u3, p1=u0+u1+u2, p2=u1+u2+u3. En hardware, cuatro cables y tres XOR de tres entradas.
  7. Permutar columnas para llegar a la forma sistemática da un código equivalente, no el mismo.
Siguiente → Inicio
Relacionados La matriz de paridad y el código dual El síndrome La distancia mínima El código que todos inventan primero no paga nunca Los códigos cíclicos