En teoría de codificación , los códigos de bloque son una familia grande e importante de códigos de corrección de errores que codifican datos en bloques. Existe una gran cantidad de ejemplos de códigos de bloque, muchos de los cuales tienen una amplia gama de aplicaciones prácticas. La definición abstracta de códigos de bloque es conceptualmente útil porque permite a los teóricos de codificación, matemáticos y científicos informáticos estudiar las limitaciones de todos los códigos de bloque de una manera unificada. Dichas limitaciones a menudo toman la forma de límites que relacionan diferentes parámetros del código de bloque entre sí, como su velocidad y su capacidad para detectar y corregir errores.
Algunos ejemplos de códigos de bloque son los códigos Reed-Solomon , los códigos Hamming , los códigos Hadamard , los códigos Expander , los códigos Golay , los códigos Reed-Muller y los códigos Polares . Estos ejemplos también pertenecen a la clase de códigos lineales y, por lo tanto, se denominan códigos de bloque lineales . Más particularmente, estos códigos se conocen como códigos de bloque algebraicos o códigos de bloque cíclicos, porque se pueden generar utilizando polinomios booleanos.
Los códigos de bloques algebraicos suelen decodificarse de forma rígida mediante decodificadores algebraicos. [ jerga ]
El término código de bloque también puede referirse a cualquier código corrector de errores que actúa sobre un bloque de bits de datos de entrada para producir bits de datos de salida . En consecuencia, el codificador de bloques es un dispositivo sin memoria . Según esta definición, los códigos como los códigos turbo , los códigos convolucionales terminados y otros códigos iterativamente decodificables (códigos tipo turbo) también se considerarían códigos de bloque. Un codificador convolucional no terminado sería un ejemplo de un código sin bloques (sin marco), que tiene memoria y, en cambio, se clasifica como un código de árbol .
Este artículo trata sobre los "códigos de bloques algebraicos".
Los códigos de corrección de errores se utilizan para transmitir de forma fiable datos digitales a través de canales de comunicación poco fiables sujetos a ruido de canal . Cuando un emisor quiere transmitir un flujo de datos posiblemente muy largo utilizando un código de bloque, el emisor divide el flujo en fragmentos de un tamaño fijo. Cada uno de estos fragmentos se denomina mensaje y el procedimiento dado por el código de bloque codifica cada mensaje individualmente en una palabra de código, también llamada bloque en el contexto de los códigos de bloque. A continuación, el emisor transmite todos los bloques al receptor, que a su vez puede utilizar algún mecanismo de decodificación para (con suerte) recuperar los mensajes originales de los bloques recibidos posiblemente dañados. El rendimiento y el éxito de la transmisión general dependen de los parámetros del canal y del código de bloque.
Formalmente, un código de bloque es un mapeo inyectivo
Aquí, es un conjunto finito y no vacío y y son números enteros. El significado y la importancia de estos tres parámetros y otros parámetros relacionados con el código se describen a continuación.
El flujo de datos que se va a codificar se modela como una cadena sobre un alfabeto . El tamaño del alfabeto se escribe a menudo como . Si , entonces el código de bloque se denomina código de bloque binario . En muchas aplicaciones es útil considerar que es una potencia prima y se identifica con el campo finito .
Los mensajes son elementos de , es decir, cadenas de longitud . Por lo tanto, el número se denomina longitud del mensaje o dimensión de un código de bloque.
La longitud de bloque de un código de bloque es el número de símbolos en un bloque. Por lo tanto, los elementos de son cadenas de longitud y corresponden a bloques que pueden ser recibidos por el receptor. Por lo tanto, también se denominan palabras recibidas. Si para algún mensaje , entonces se denomina palabra de código de .
La velocidad de un código de bloque se define como la relación entre la longitud de su mensaje y la longitud de su bloque:
Una tasa alta significa que la cantidad de mensajes reales por bloque transmitido es alta. En este sentido, la tasa mide la velocidad de transmisión y la cantidad mide la sobrecarga que se produce debido a la codificación con el código de bloque. Es un simple hecho teórico de la información que la tasa no puede exceder, ya que los datos en general no se pueden comprimir sin pérdidas. Formalmente, esto se deduce del hecho de que el código es un mapa inyectivo.
La distancia o distancia mínima d de un código de bloque es el número mínimo de posiciones en las que difieren dos palabras de código distintas, y la distancia relativa es la fracción . Formalmente, para las palabras recibidas , sea la distancia de Hamming entre y , es decir, el número de posiciones en las que difieren y . Entonces la distancia mínima del código se define como
Dado que cualquier código debe ser inyectivo , dos palabras de código cualesquiera no coincidirán en al menos una posición, por lo que la distancia de cualquier código es al menos . Además, la distancia es igual al peso mínimo para los códigos de bloque lineales porque:
Una distancia mayor permite una mayor corrección y detección de errores. Por ejemplo, si solo consideramos los errores que pueden cambiar los símbolos de la palabra de código enviada pero nunca los borran o agregan, entonces el número de errores es el número de posiciones en las que difieren la palabra de código enviada y la palabra recibida. Un código con una distancia d permite al receptor detectar hasta errores de transmisión, ya que cambiar las posiciones de una palabra de código nunca puede generar accidentalmente otra palabra de código. Además, si no ocurren más de errores de transmisión, el receptor puede decodificar de forma única la palabra recibida en una palabra de código. Esto se debe a que cada palabra recibida tiene como máximo una palabra de código a una distancia . Si ocurren más de errores de transmisión, el receptor no puede decodificar de forma única la palabra recibida en general, ya que podría haber varias palabras de código posibles. Una forma en que el receptor puede hacer frente a esta situación es usar la decodificación de lista , en la que el decodificador genera una lista de todas las palabras de código en un radio determinado.
La notación describe un código de bloque sobre un alfabeto de tamaño , con una longitud de bloque , una longitud de mensaje y una distancia . Si el código de bloque es un código de bloque lineal, se utilizan los corchetes en la notación para representar ese hecho. Para los códigos binarios con , a veces se omite el índice. Para los códigos separables con distancia máxima , la distancia siempre es , pero a veces no se conoce la distancia precisa, no es trivial de probar o enunciar, o no es necesaria. En tales casos, puede faltar el componente -.
A veces, especialmente para códigos que no son de bloques, la notación se utiliza para códigos que contienen palabras de código de longitud . Para códigos de bloques con mensajes de longitud superior a un alfabeto de tamaño , este número sería .
Como se mencionó anteriormente, existe una gran cantidad de códigos de corrección de errores que en realidad son códigos de bloque. El primer código de corrección de errores fue el código Hamming(7,4) , desarrollado por Richard W. Hamming en 1950. Este código transforma un mensaje que consta de 4 bits en una palabra de código de 7 bits agregando 3 bits de paridad. Por lo tanto, este código es un código de bloque. Resulta que también es un código lineal y que tiene una distancia de 3. En la notación abreviada anterior, esto significa que el código Hamming(7,4) es un código.
Los códigos Reed-Solomon son una familia de códigos con y siendo una potencia principal . Los códigos de rango son una familia de códigos con . Los códigos Hadamard son una familia de códigos con y .
Una palabra de código podría considerarse como un punto en el espacio de dimensión - y el código es el subconjunto de . Un código tiene distancia significa que , no hay otra palabra de código en la bola de Hamming centrada en con radio , que se define como la colección de palabras de dimensión - cuya distancia de Hamming a no es mayor que . De manera similar, con distancia (mínima) tiene las siguientes propiedades:
se llama familia de códigos , donde es un código con monótona creciente .
La tasa de la familia de códigos C se define como
La distancia relativa de la familia de códigos C se define como
Para explorar la relación entre y , se conoce un conjunto de límites inferior y superior de códigos de bloque.
El límite Singleton es que la suma de la tasa y la distancia relativa de un código de bloque no puede ser mucho mayor que 1:
En otras palabras, cada código de bloque satisface la desigualdad . Los códigos Reed-Solomon son ejemplos no triviales de códigos que satisfacen el límite singleton con igualdad.
Para , . En otras palabras, .
Para el caso general, los siguientes límites de Plotkin se cumplen para cualquier distancia d :
Para cualquier código q -ario con distancia ,
, donde , es la función de entropía q -aria.
Defina .
Sea el número máximo de palabras de código en una bola de Hamming de radio e para cualquier código de distancia d .
Entonces tenemos el límite de Johnson : si
Los códigos de bloques están relacionados con el problema del empaquetamiento de esferas , que ha recibido cierta atención a lo largo de los años. En dos dimensiones, es fácil de visualizar. Tome un montón de monedas planas sobre la mesa y apriételas. El resultado es un patrón hexagonal como un nido de abejas. Pero los códigos de bloques dependen de más dimensiones que no se pueden visualizar fácilmente. El poderoso código Golay utilizado en las comunicaciones del espacio profundo utiliza 24 dimensiones. Si se utiliza como un código binario (que es lo que suele ser), las dimensiones se refieren a la longitud de la palabra clave como se definió anteriormente.
La teoría de la codificación utiliza el modelo de esfera de N dimensiones. Por ejemplo, ¿cuántas monedas se pueden colocar en un círculo sobre una mesa o, en tres dimensiones, cuántas canicas se pueden colocar en un globo terráqueo? Otras consideraciones entran en la elección de un código. Por ejemplo, el empaquetamiento de hexágonos en la restricción de una caja rectangular dejará espacio vacío en las esquinas. A medida que las dimensiones se hacen más grandes, el porcentaje de espacio vacío se hace más pequeño. Pero en ciertas dimensiones, el empaquetamiento utiliza todo el espacio y estos códigos son los llamados códigos perfectos. Hay muy pocos de estos códigos.
Otra propiedad es el número de vecinos que puede tener una sola palabra de código. [1] Nuevamente, considere los centavos como un ejemplo. Primero empaquetamos los centavos en una cuadrícula rectangular. Cada centavo tendrá 4 vecinos cercanos (y 4 en las esquinas que están más alejadas). En un hexágono, cada centavo tendrá 6 vecinos cercanos. Respectivamente, en tres y cuatro dimensiones, el empaquetamiento máximo está dado por las 12 caras y las 24 celdas con 12 y 24 vecinos, respectivamente. Cuando aumentamos las dimensiones, el número de vecinos cercanos aumenta muy rápidamente. En general, el valor está dado por los números de beso .
El resultado es que el número de formas en que el ruido puede hacer que el receptor elija un vecino (y por lo tanto un error) también aumenta. Esta es una limitación fundamental de los códigos de bloque y, de hecho, de todos los códigos. Puede ser más difícil provocar un error en un solo vecino, pero el número de vecinos puede ser lo suficientemente grande como para que la probabilidad total de error realmente se vea afectada. [1]