Codificación de bloque lineal
| Clarification activity | Teoría de la información |
| Author(s) | José María Díaz Nafría |
| Creation date | Dec 2023 |
| Status | 🔵 Ready to publish |
Un código de bloque lineal es un método de codificación de datos en el que los mensajes se transforman en bloques de mayor longitud mediante operaciones lineales sobre cuerpos finitos, de modo que las palabras de código forman un subespacio vectorial y permiten detectar y, en muchos casos, corregir errores de transmisión.
¿Por qué hablamos de paridad en códigos de bloque lineales?
La primera y más sencilla aproximación al control de errores, en términos históricos y prácticos, consiste en añadir un bit de paridad a cada bloque de unos pocos bits en el que se divide un flujo de datos para asegurar que todos los bloques de códigos válidos que se intenta transmitir por el canal cuentan con un número par de unos. De esa manera la mera constatación de la paridad de los códigos a la salida del canal digital permite identificar si se han producido o no errores en la transmisión (o mejor dicho, si los errores producidos en el canal son detectables).
Obsérvese que, por una parte, se trata de convertir un bloque de datos, que podemos considerar como el mensaje a transmitir, en un código de dimensión mayor añadiendo un digito adicional que determinamos mediante la suma en módulo dos del número de unos del mensaje. Este resultado, como puede verse en la fig.1, es el que agregamos al código, lo que hace que todos los códigos válidos tengan un número par de unos, y en recepción hacemos exactamente la misma operación, de modo que si el resultado es uno, esto nos sirve de indicación de que algo ha ido mal en la transmisión. Por tanto, las operaciones de transformación de mensajes en códigos son lineales y definidas en algebra de cuerpos finitos, y podemos hacer operaciones también lineales que nos permiten distinguir el subespacio de códigos válidos dentro de un espacio más amplio de códigos recibidos (y potencialmente corruptos), lo que hace que este tipo de codificación cuente con todos los elementos de la codificación de bloque lineal según lo que se había discutido en el artículo de codificación de bloque. Por otra parte, se trata de una aproximación muy elemental que permite detectar errores pero no corregirlos, sin embargo, las técnicas del mismo tipo desarrolladas a lo largo de varias décadas y discutidas a continuación en sus aspectos elementales permiten hacerlo mucho mejor.
Definiciones
Según se había definido en el artículo sobre codificación de bloque (§3), un código de bloque para el control de errores se reduce a una aplicación , sobre el alfabeto , quedando abierto el modo en el que se establece la correspondencia entre los elementos de un espacio y otro. Sin embargo, cuando nos restringimos a la codificación de bloque lineal, que es la que aquí nos ocupa, la relación que se establece entre los elementos es más sencilla y sistemática, gracias a la utilización de operaciones algebraicas simples (de suma y producto) con los elementos del conjunto , lo que facilita tanto su análisis como la realización de los codificadores y decodificadores.[1]
Debido a que los elementos del alfabeto son finitos (y muy frecuentemente binarios) las operaciones algebraicas y los espacios vectoriales formados a partir de ellas se definen sobre cuerpos finitos o de Galois, que denotamos como , donde es número de elementos u orden del cuerpo. No obstante, como en general los elementos del alfabeto o bien son binarios o agrupaciones binarias, serán de nuestra incumbencia los cuerpos finitos , con , y cuando nos restrinjamos a códigos binarios. De un modo u otro, podremos expresar los códigos de bloque compuestos por elementos del alfabeto (de símbolos) como subespacios dentro de espacio vectorial de dimensión construido sobre un cuerpo finito en virtud de las operaciones de suma () y producto (). Esta caracterización general de los espacios vectoriales en los que representaremos las operaciones de codificación nos permite ofrecer una definición sintética de los códigos de bloque linealesː
- Definición 1: código de bloque lineal
- un código de bloque es lineal si el conjunto de palabras de código es un subespacio vectorial de de dimensión .
- En el caso binario, el espacio vectorial , de dimensión , está definido sobre un cuerpo finito , es decir, el de símbolos binarios combinados mediante operaciones y , que a su vez coinciden con las de suma y producto de módulo 2, o las operaciones lógicas de disyunción exclusiva (XOR) y conjunción (AND) del álgebra de Boole.
- En el caso no binario, el espacio vectorial , de dimensión , está definido sobre un cuerpo finito donde , . Aquí cada uno de los elementos del cuerpo finito puede representarse mediante un polinomio de grado menor o igual queː donde .
Como los códigos válidos, , constituyen un subespacio de de dimensión , éste puede caracterizarse plenamente mediante los vectores de una de sus bases, , por tanto, cualquier podemos expresarlo en términos de dicha base:
, donde es la denominada matriz generadora:
Donde cabe observar que como la dimensión de es , es decir la de los mensajes, podemos hacer que coincida precisamente con los mensajes, y en consecuencia representa la transformación , que podemos representar como .
- Definición 2: matriz generadora
- Llamamos matriz generadora a la constituida por k vectores independientes del espacio de código .
Códigos sistemáticos
Atendiendo a las definiciones 1 y 2 y considerando queː (i) cualquier operación de intercambio de filas o columnas supone un mero cambio del orden de los vectores o sus coordenadas; (ii) que las suma de filas suponen una combinación lineal de la base de vectores; y (iii) que el producto por un escalar no nulo supondría un mero cambio de escala en alguna de las direcciones, es, por tanto, evidente que estas operaciones no cambian en sí el espacio vectorial de códigos, cuyas propiedades seguirán siendo las mismas. En consecuencia, siempre es posible encontrar una matriz equivalente (donde y reflejan la transformación correspondiente a las operaciones antes referidas) que responda a la siguiente forma:
Resulta evidente, de acuerdo a la definición 1, que si empleamos una matriz generadora que responda a la misma forma que para transformar los mensajes en palabras de código, el inicio de estas palabras estará compuesto por el mensaje mismo. Igualmente observamos que los símbolos restantes resultan de aplicar la matriz a los mensajes (aplicación que en general no es inyectiva debido a las dimensiones generalmente discordantes de ambos espacios). Por generalización de la técnica de introducir un bit de paridad para detectar de forma sencilla errores producidos en la transmisión símbolos, hablamos de dígitos de paridad y de matriz o submatriz de paridad.
Obsérvese que podríamos haber argumentado lo mismo para llegar a otro código equivalente en el que los códigos también contienen la palabra de datos, pero al final del mismo. En ambos casos hablamos de códigos sistemáticos y según la justificación anterior se trata en ambos casos de códigos totalmente equivalentes, en cuanto a las propiedades del espacio vectorial de códigos, pero que facilitan la decodificación al permitir extraer los datos una vez corregidos los errores que se hubieran producido en el canal, si es que eso fuera posible. Esto hace que el estudio de los códigos sistemáticos sea equivalente al de estudiar los códigos de bloque lineales en general.
- Definición 3: código sistemático
- Llamamos códigos sistemáticos a aquellos en los que la palabra de código contiene los mensajes, y su matriz generadora responde a alguna a las formas o .
Control de paridad y síndrome
Como decíamos al principio, los bits de paridad permitían identificar la ausencia de errores detectables en el canal digital mediante una simple cuenta de la paridad observada en los códigos recibidos (o suma en módulo 2 del número de unos), de modo que si esta cuenta es nula el código la transmisión se da por exitosa. Esta idea se generaliza en lo que llamamos prueba o test de paridad, que extiende esta idea recurriendo a la matriz de control de paridad que definimos en términos de una condición similar:
- Definición 4: matriz de control de paridad
- Llamamos matriz de control de paridad a aquella que verifica que el producto de un código válido por dicha matriz es nulo, es decir,.
Como tiene un valor arbitrario, será entonces necesario que , lo que, atendiendo a la forma de las matrices generadoras de los códigos sistemáticos (para paridad al final del bloque, se cumple con una matriz de la siguiente forma:
Como puede fácilmente probarse:
En consecuencia, la recepción de un código válido puede comprobarse , prueba que denominamos prueba o test de paridad.
Si aplicamos dicha prueba a un código eventualmente corrupto que podemos describir como , donde representa los errores que se hayan podido cometer en el canal digital: , cuyo resultado se denomina síndrome, razón por la cual la operación de cálculo del mismo se denomina también prueba o test de síndrome, que extiende el concepto de test de paridad al permitir no sólo distinguir si se ha producido error o no en la transmisión, sino también poder identificar y corregir algunos errores.
- Definición 5: síndrome
- Para un código con matriz de comprobación de paridad , llamamos síndrome de un vector de dimensión (i.e. ) al vector , cuya dimensión es (i.e. ).
Obsérvese, que en la medida que tiene dimensión , es posible hacer más distinciones que la de haberse o no no producido errores (detectables) en el canal digital. Existe además una relación biunívoca entre errores corregibles y síndromes, lo que constituye una propiedad fundamental de los códigos de bloque lineales. Por tanto, si conocemos esta relación, nos será posible corregir los errores que se hayan producido en el canal.
- Propiedades fundamentales de los códigos de bloque lineales[1]
- Un código binario C[n,k] es:
- capaz de corregir vectores de error.
- capaz de detectar vectores de error.
Corrección de errores
Si se recibe un código válido se dará por bueno, de lo contrario tratamos de encontrar el código que minimice el error, lo que se conoce como criterio de Máximo A Posteriori ó MAP, por maximizar el acierto para el código efectivamente recibido. Sin embargo, cuando la probabilidad de transmisión de todos los códigos es igual, este criterio se puede transformar —en virtud del teorema de Bayes— en el de Máxima Verosimilitud o MV, según el cual se busca el código válido que maximiza la probabilidad de recibir el código efectivamente recibido:
Si podemos considerar independencia en la sucesión de bits y sus errores, el criterio de maxima verosimilitud puede expresarse en términos de la probabilidad de error de bits de código, , que caracteriza el canal binario que además supondremos simétrico:
donde es la diferencia en nº de bits entre el bloque recibido y el código válido
Como a su vez la probabilidad de error de bits de código es menor que 1, y de hecho lo normal es que sea mucho menor, la maximización de la probabilidad de acierto en la corrección de errores equivale a la minimización de , lo que podemos expresar en términos de la distancia y peso Hamming que se definen como:
- Definición 6: Distancia Hamming
- Llamamos distancia Hamming, que designamos como o simplemente y a la diferencia en número de bits que hemos denotado como y que podemos expresar algebraicamente, usando una suma acumulada como:, donde representa un producto escalar
- Definición 7: Peso Hamming
- Llamamos peso Hamming, que denotamos como , a la distancia Hamming al código 0: , con .
En consecuencia, , lo que nos permite reexpresar el criterio de máxima verosimilitud como:
Recurriendo a estas definiciones, la figura 2 representa el esquema de decodificación de acuerdo al criterio de máxima verosimilitud, que presupone la comparación con el conjunto de códigos válidos, razón por la que se habla de búsqueda exhaustiva.
De acuerdo a las propiedades fundamentales antes referidas, puede fácilmente probarse que el esquema anterior es equivalente al de disponer de una tabla de patrones de errores corregibles y sus síndrome correspondientes. La decodificación consistiría en dicho caso en la determinación del síndrome y la lectura de su correspondiente patrón de error (que al agotar todos los síndromes posibles se puede organizar en una memoria en la que las direcciones coincidan con los valores de los síndromes). La conveniencia de recurrir a un método u otro dependerá del tamaño de las tablas requeridas y de la complejidad de la búsqueda asociada.
Debido a que los errores más frecuentes que no pueden corregirse corresponden a los que transforman un código válido en otro igualmente válido, aquellos códigos que se encuentran más próximos serán a su vez los más frecuentes. Por esta razón la distancia mínima entre códigos válidos, en términos de los bits que los diferencia, constituye un parámetro fundamental de los códigos, que denominamos distancia mínima.
- Definición 8: Distancia mínima
- Llamamos distancia mínima de un código de bloque lineal, que denotamos como , a , que en virtud de las propiedades de los códigos lineales equivale al mínimo de los pesos Hamming de los códigos válidos:
La figura 4 ilustra el sentido de la distancia mínima para conjunto de tres códigos cuya separación se expresa en términos de distancia de Hamming.
De acuerdo a esta caracterización, es evidente que no tenemos garantías de poder corregir errores cuyo peso Hamming sea igual o mayor que , así como tampoco tenemos garantía de poder corregir errores cuya distancia sea mayor o igual a que se encuentren a una distancia podremos al menos corregir (el entero superior). Y en sentido contrario, podemos tener la certeza de que todos los errores cuyo peso Hamming sea:
- son errores detectables
- son errores corregibles.
Cuando un código es capaz de corregir sólo los errores de peso Hamming hablamos de códigos perfectos.
- Definición 9: Códigos perfectos
- Llamamos códigos perfectos a los códigos de bloque lineal que sólo pueden corregir los errores de peso Hamming menores que (es decir, las esferas de radio entorno a todo cubren todo el espacio ).
Probabilidad de error tras la decodificación
La figura 5 sintetiza el proceso de codificación, transmisión a través de canales ruidosos y decodificación según los esquemas antes descritos. Nos interesará poder determinar el promedio de errores remanentes tras el proceso de corrección, ya que éste será el que sea entregado a las etapas subsiguientes de la cadena de recepción digital.
Teniendo en cuenta esta caracterización de los códigos de bloque lineales, es posible determinar la probabilidad de error de bloque tras el proceso de corrección de errores (), descartando todos los casos de errores que con seguridad podemos corregir (lo que por tanto se trata de una cota superior del error):
Que presupone un canal simétrico. Si a su vez se considera que para cada elemento del sumatorio anterior el número de bits erróneos dentro del bloque es j —suponemos que los errores se distribuyen por igual entre los bits de paridad y los de datos— entonces la contribución a la probabilidad de error de bit de cada sumando es , con lo cual la probabilidad de error de bit tras la decodificación () será:
De manera estricta, sabemos que la probabilidad de error de bloque (o mensaje) es:[1]
donde es el número de errores corregibles cuyo peso Hamming es . Sin embargo, se desconoce para la mayor parte de los códigos conocidos, razón por la cual la aproximación (8) nos ofrece una orientación de aplicación general.
Ejemplo
Supongamos que a la salida de un canal binario simétrico y sin memoria la probabilidad de error es . Si se emplea un código Golay extendido (24,12), cuya distancia mínima , podemos determinar la probabilidad de error a la salida del codificador usando las relaciones anteriores y las propiedades fundamentales de los códigos.
El número de síndromes diferentes es: , mientras que las combinaciones de errores de 1, 2 y 3 bits en el bloque de 24 bits es: . En consecuencia habrá 1771 patrones de error con peso Hamming 4 que corresponde a errores corregibles.
Según estas dimensiones y el valor indicado para la probabilidad de error de bit de código, p, la probabilidad de error de mensaje o bloque será:
Y la probabilidad de error de bit tras la decodificación: