En informática , los códigos de transformada de Luby ( códigos LT ) son la primera clase de códigos fuente prácticos que son códigos de corrección de borrado casi óptimos . Fueron inventados por Michael Luby en 1998 y publicados en 2002. [1] Al igual que otros códigos fuente , los códigos LT dependen de gráficos bipartitos dispersos para intercambiar la sobrecarga de recepción por velocidad de codificación y decodificación. La característica distintiva de los códigos LT es emplear un algoritmo particularmente simple basado en la operación o exclusiva ( ) para codificar y decodificar el mensaje. [2]
Los códigos LT no tienen tasa de transferencia porque el algoritmo de codificación puede, en principio, producir una cantidad infinita de paquetes de mensajes (es decir, el porcentaje de paquetes que se deben recibir para decodificar el mensaje puede ser arbitrariamente pequeño). Son códigos de corrección de borrado porque se pueden utilizar para transmitir datos digitales de manera confiable en un canal de borrado .
La siguiente generación, más allá de los códigos LT, son los códigos Raptor (véase, por ejemplo, IETF RFC 5053 o IETF RFC 6330), que tienen codificación y decodificación de tiempo lineal. Los códigos Raptor se basan fundamentalmente en códigos LT, es decir, la codificación para códigos Raptor utiliza dos etapas de codificación, donde la segunda etapa es la codificación LT. De manera similar, la decodificación con códigos Raptor se basa principalmente en la decodificación LT, pero la decodificación LT se mezcla con técnicas de decodificación más avanzadas. El código RaptorQ especificado en IETF RFC 6330, que es el código fuente más avanzado, tiene probabilidades de decodificación y rendimiento muy superiores en comparación con el uso de un código LT únicamente.
¿Por qué utilizar un código LT?
El esquema tradicional para transferir datos a través de un canal de borrado depende de una comunicación bidireccional continua.
- El remitente codifica y envía un paquete de información.
- El receptor intenta decodificar el paquete recibido. Si puede decodificarlo, el receptor envía un acuse de recibo al transmisor. De lo contrario, el receptor solicita al transmisor que vuelva a enviar el paquete.
- Este proceso bidireccional continúa hasta que todos los paquetes del mensaje se hayan transferido exitosamente.
Algunas redes, como las que se utilizan para la transmisión inalámbrica celular, no tienen un canal de retroalimentación. Las aplicaciones en estas redes aún requieren confiabilidad. Los códigos fuente en general, y los códigos LT en particular, resuelven este problema adoptando un protocolo de comunicación esencialmente unidireccional.
- El remitente codifica y envía paquete tras paquete de información.
- El receptor evalúa cada paquete a medida que lo recibe. Si hay un error, el paquete erróneo se descarta. De lo contrario, el paquete se guarda como parte del mensaje.
- Finalmente, el receptor tiene suficientes paquetes válidos para reconstruir el mensaje completo. Cuando se ha recibido correctamente todo el mensaje, el receptor indica que la transmisión ha finalizado.
Como se mencionó anteriormente, el código RaptorQ especificado en IETF RFC 6330 supera a un código LT en la práctica.
Codificación LT
El proceso de codificación comienza dividiendo el mensaje no codificado en n bloques de longitud aproximadamente igual. A continuación, se generan los paquetes codificados con la ayuda de un generador de números pseudoaleatorios .
- El grado d , 1 ≤ d ≤ n , del siguiente paquete se elige al azar.
- Se eligen aleatoriamente exactamente d bloques del mensaje.
- Si M i es el bloque i del mensaje, la porción de datos del siguiente paquete se calcula como
- donde { i 1 , i 2 , ..., i d } son los índices elegidos aleatoriamente para los bloques d incluidos en este paquete.
- Se añade un prefijo al paquete codificado, que define cuántos bloques n hay en el mensaje, cuántos bloques d se han incluido en forma exclusiva en la porción de datos de este paquete y la lista de índices { i 1 , i 2 , ..., i d }.
- Finalmente, se aplica algún tipo de código de detección de errores (quizás tan simple como una verificación de redundancia cíclica ) al paquete y este se transmite.
Este proceso continúa hasta que el receptor señala que el mensaje ha sido recibido y decodificado exitosamente.
Descodificación LT
El proceso de decodificación utiliza la operación " o exclusiva " para recuperar el mensaje codificado.
- Si el paquete actual no está limpio o si replica un paquete que ya ha sido procesado, el paquete actual se descarta.
- Si el paquete recibido limpiamente en la actualidad es de grado d > 1, primero se procesa contra todos los bloques completamente decodificados en el área de cola de mensajes (como se describe con más detalle en el siguiente paso) y luego se almacena en un área de búfer si su grado reducido es mayor que 1.
- Cuando se recibe un paquete nuevo y limpio de grado d = 1 (bloque M i ) (o el grado del paquete actual se reduce a 1 mediante el paso anterior), se lo mueve al área de cola de mensajes y luego se lo compara con todos los paquetes de grado d > 1 que residen en el búfer. Se lo aplica mediante OR exclusivo en la porción de datos de cualquier paquete almacenado en búfer que se haya codificado utilizando M i , se decrementa el grado de ese paquete coincidente y se ajusta la lista de índices para ese paquete para reflejar la aplicación de M i .
- Cuando este proceso desbloquea un bloque de grado d = 2 en el búfer, ese bloque se reduce a grado 1 y a su vez se mueve al área de cola de mensajes, y luego se procesa contra los paquetes que quedan en el búfer.
- Cuando los n bloques del mensaje se han movido al área de cola de mensajes, el receptor envía una señal al transmisor de que el mensaje se ha decodificado correctamente.
Este procedimiento de decodificación funciona porque A A = 0 para cualquier cadena de bits A . Después de que d − 1 bloques distintos hayan sido codificados de forma exclusiva en un paquete de grado d , el contenido original no codificado del bloque no coincidente es todo lo que queda. En símbolos tenemos
Variaciones
Son posibles varias variaciones de los procesos de codificación y decodificación descritos anteriormente. Por ejemplo, en lugar de anteponer a cada paquete una lista de los índices de bloque de mensaje reales { i 1 , i 2 , ..., i d }, el codificador podría simplemente enviar una "clave" corta que sirviera como semilla para el generador de números pseudoaleatorios (PRNG) o la tabla de índices utilizada para construir la lista de índices. Dado que el receptor equipado con el mismo RNG o la misma tabla de índices puede recrear de manera confiable la lista "aleatoria" de índices a partir de esta semilla, el proceso de decodificación puede completarse con éxito. Alternativamente, al combinar un código LT simple de grado promedio bajo con un código de corrección de errores robusto, se puede construir un código raptor que superará en la práctica a un código LT optimizado. [3]
Optimización de códigos LT
Sólo hay un parámetro que puede utilizarse para optimizar un código LT directo: la función de distribución de grados (descrita como un generador de números pseudoaleatorios para el grado d en la sección de codificación LT anterior). En la práctica, los otros números "aleatorios" (la lista de índices { i 1 , i 2 , ..., i d } ) se toman invariablemente de una distribución uniforme en [0, n ), donde n es el número de bloques en los que se ha dividido el mensaje. [4]
El propio Luby [1] analizó la " distribución ideal de solitones " definida por
Esta distribución de grados minimiza teóricamente el número esperado de palabras de código redundantes que se enviarán antes de que se pueda completar el proceso de decodificación. Sin embargo, la distribución ideal de solitones no funciona bien en la práctica porque cualquier fluctuación en torno al comportamiento esperado hace probable que en algún paso del proceso de decodificación no haya ningún paquete disponible de grado 1 (reducido), por lo que la decodificación fallará. Además, algunos de los bloques originales no se combinarán con ninguno de los paquetes de transmisión. Por lo tanto, en la práctica, una distribución modificada, la " distribución robusta de solitones ", se sustituye por la distribución ideal. El efecto de la modificación es, generalmente, producir más paquetes de grado muy pequeño (alrededor de 1) y menos paquetes de grado mayor que 1, excepto por un pico de paquetes en una cantidad bastante grande elegida para asegurar que todos los bloques originales se incluirán en algún paquete. [4]
Véase también
Notas y referencias
- ^ ab M.Luby, "Códigos LT", 43º Simposio Anual IEEE sobre Fundamentos de la Ciencia de la Computación, 2002.
- ^ La operación exclusiva o (XOR), simbolizada por ⊕, tiene la propiedad muy útil de que A ⊕ A = 0, donde A es una cadena arbitraria de bits .
- ^ Códigos fuente, por DJC MacKay, publicado por primera vez en IEEE Proc.-Commun., Vol. 152, No. 6, diciembre de 2005.
- ^ ab Optimización de la distribución de grados de códigos LT con un enfoque de muestreo de importancia, por Esa Hyytiä, Tuomas Tirronen y Jorma Virtamo (2006).
Enlaces externos
- "Implementación de código de transformación Luby en C#"
- "Implementación de Códigos Fuente para almacenamiento en C/C++"
- "Introducción a los códigos fuente: Códigos LT con Python"