UNIVERSIDAD CARLOS III DE MADRID ESCUELA POLITECNICA SUPERIOR MASTER EN MULTIMEDIA Y COMUNICACIONES Sobre Codificación Conjunta Fuente-Canal Luca Martino FEBRERO DE 2008 FEBRERO DE 2008 1 Introducción: Teorı́a Básica La codificación es, sin duda, una función esencial de cualquier sistema de comunicación. En general, lsa caracteristicas básica de una transmisión digital tendrı́an que ser: • eficiencia • fiabilidad • privacidad Dejando de lado el problema de la privacidad, podemos notar como los dos restante objetivos requieren enfoques exactamente opuestos. De hecho, la eficiencia, medida como la proporción entre la cantidad de información transmitida y la energı́a necesaria para transmitirla, exige quitar toda la redundancia en los datos antes del envı́o. Esta operación se suele llamar Codificación de fuente. Por otra parte, la fiabilidad requiere añadir redundancia para asegurar una correcta interpretación de los datos transmitidos. De esto se ocupa la Codificación de canal . Los dos principales resultados de la Teoria de la Información, nos proporcionan una cota inferior para la compresión de datos sin perdidas (R > H) y una cota superior para la velocidad de trasmisión de datos por un canal (R < C). El primer resultado nos dice que la longitud media por simbolo de una palabra código no puede ser menor de la Entropia de la fuente; por otra parte, el teorema de codificación afirma que, en un canal discreto sin memoria, la máxima tasa a la que se puede trasmitir sin error es el máximo de la infomación mutua (Capacidad) entre entrada y salida del sistema de comunicaciones. Se puede demostrar, que el hecho de dividir la codificación en dos paso, de fuente y de canal, no afecta del punto de vista de la trasmisión en un canal ruidoso. Por estas razones, casi siempre el diseño de un sistema de comunicación ha sido la combinación de estas dos partes, analizadas separadamente. Además se demuestra que optimizando los dos bloques de modo indepedientes se podrı́an alcanzar los resultados limites dados pro los teoremas de Shannon. De todas formas, por razones practicas relacionadas con complejidad y retardo, se han propuestos esquemas de codificación conjunta de fuente y canal. Además, desde el punto de vista teórica y no solo, surge automaticamente la pregunta si la condición H < C sea una condición necesaria y 1 suficiente para enviar información de una fuente por un canal. Se ha demostrado que si H < C existe un método de codificación conjunta fuente-canal con probabilidad de error tan baja como se quiera. Dicho de otra forma: Teorema: Sea H (bit/sı́mbolo) la entropia de la fuente y C (bit/segundo) la capacidad de canal. Es posible codificar los sı́mbolos emitidos por la fuente, C C − sı́mbolos por segundo, donde 0 < < H . No transmitiendo en media H C es posible transmitir a una velocidad superior a H . 2 Codificación conjunta: ¿por qué? El Teorema de Separación de la Teorı́a de la Información afirma la posibilidad de dividir en dos partes separadas la tareas de codificación; esta separeción no es justificable desde el punto de vista practico, por las siguintes razones: • longitud de bloques limitada por codificacı́on de fuente y canal puede reslutar un problema. • los bits a la salida del codificador de fuente suelen tener una redundancia residual, que en cierto modo, podrı́a ser aprovechada por el codificador de canal. • Se nececitan bloques de longitud infinita para lograr un ”perfecto” código de canal. • aún no se ha conseguido que la probabilidad de equivocarse en decodificación sea exactamente nula. El objetivo es mejorar las prestaciones de los sistemas de comunicación, sin explotar más los recursos disponible. Con este fı́n, se han estudiado algoritmos conjuntos de codificacı́on. La idea básica consiste en tratar de aprovechar la redundancia residual de los bits para mejorar la ”calidad” de la transmisión. 3 Códigos Huffman Un código de Huffman es un código de longitud variable, en el que la longitud de cada código depende de la frecuencia relativa de aparición de cada sı́mbolo: 2 cuanto más frecuente sea un sı́mbolo, su código asociado será más corto. Además, un código Huffman es un código libre de prefijos: es decir, ningún código forma la primera parte de otro código; esto permite que los mensajes codificados sean no ambiguos. El algoritmo consiste en la creación de un árbol binario que tiene cada uno de los sı́mbolos por hoja, y construido de tal forma que siguiéndolo desde la raı́z a cada una de sus hojas se obtiene el código Huffman asociado. Para derivar el código Huffman se hacen las siguientes operaciones: • Escoger los dos sı́mbolos ci , cj (que serán todo colocados en las hojas N4 ,N5 ,N6 ,N7 ) con probabilidades más pequeñas pi y pj . • Se sustituyen ci , cj con un nodo superior de probabilidad pi + pj . • se considera el nuovo nodo como una nuova hoja, es decir, como otro simbolo (no considerando los dos anteriores), y se repite desde el primer punto. • El código queda definido por el camino desde la raı́z N1 hasta cada hoja. Figure 1: Ejemplo Código Huffman. Para poder utilizar el algoritmo de Huffman es necesario conocer de antemano las frecuencias de aparición de cada sı́mbolo, y su eficiencia depende de lo próximas a las frecuencias reales que sean las estimadas. La eficiencia de 3 la codificación de Huffman también depende del balance que exista entre los hijos de cada nodo del árbol, siendo más eficiente conforme menor sea la diferencia de frecuencias entre los dos hijos de cada nodo. Este es el codificador estadı́stico más popular, y erróneamente se tiende a pensar que su funcionamiento es óptimo. Este algoritmo es capaz de producir un código óptimo en el sentido de Mı́nima Redundancia para el código de entrada. Esta compresión sólo será óptima si las probabilidades de todos los sı́mbolos de entrada son potencias enteras de 1/2. Y el peor de todos los casos se presentará cuando alguno de los sı́mbolos posean una probabilidad cercana a 1. 4 Código Convolucionales y Turbo La codificación del canal añade redundancia a los datos generados por la codificación de la fuente, de forma que se detectan e incluso se corrigen algunos errores introducidos por el canal. Los códigos de canal más comunes son los códigos bloques: reciben este nombre en virtud que estan constituidos pos bloques de longitud fija. Es decir, el codificador recibe k bits y entrega n bits a la salida, existiendo una relación biunı́voca entre la secuencia de k de mensaje y la secuencia final de n bits. Además, en el caso de los códigos sistemáticos, también qeuda bien definida dentro del bloque, cúal es la parte de mensaje y cúal es la parte redundante o de bits de paridad. La caracteristicas distintivas de los código convolucionales es que no tienen un formato de bloque y por lo tanto no tiene una longitud de bloque. La caracteristica fundamental de los convolucionales es aprovechar la correlaciones entre los bits transmitidos, es decir, codificador introduce una cierta memoria. Los n bits de salida de un convolucional no depiende solo de los k bits en entrada, sino también de los K − 1 nits precedentes (la tasa de código serı́a k/n ). El funcionamiento del convolucional está basado en K registros de desplazamiento (”memoria” de capacidad un bit) y n sumas módulo dos. La codificación de los bits se realiza a partir del valor del bit presente a la entrada y los valores de los m bits anteriores que están guardados en los registros. La descripción de un código convolucional puede hacerse de varias maneras: conexión de vectores o polinomios, diagrama de estado, diagrama de árbol y diagrama trellis son los esquemas más utilizados. En figura (2) se muestra el esquema en registros de despazamiento de un código convolucional, donde 4 por cada bit de información, mi , se trasmiten 2 bits, h1i y h2i . Los convolu- Figure 2: Ejemplo secuencia para un convolucional. cionales codifican la secuencia con una operación de convolución,porque son códigos tempo invariantes en el tiempo, y por lo tanto se pueden representar con una respuesta impulsiva (proporciona la salida cuando la secuencia de entrada es una delta de kornecker). Para la fig.2 las respuestas impulsivas de las dos salidas serı́an: g 1 = (1101) g 2 = (1111) (1) (2) La respuesta impulsiva es un vector binario de longitud el numero de memorias más uno. Existe un 1, si hay conección con la salida. Otra forma interesante de ver los conlucionales es la representacı́on polinomica a través de la Trasformada-D; esta transformada convierte nua secuencia en un polinomio en D donde a cada potencia Dj esta asociado un retardo j. Por ultimo, hay que decri que los convolucionales se podrian expresar a través de una matriz generadora G con si fueran códigos bloque lineales de longitud variable. Los Turbos Códigos se construyen concatenando 2 codificadores convolucionales a través de un barajador de bits. Si para los convolucionales la decodificación se basa en el algoritmo de Viterbi, para los código Turbo se utiliza una generalización llamada algoritmo BCJR. 5 Ejemplo JSCD Vamos a estudiar un ejemplo de Joint Source Channel Decoder. Sea C = {c1 , c2 , . . . , cC } el conjunto de las C palabras códigos de la fuente. Cada 5 simbolo cj ∈ C se puede escribir como: cj = [cj (1), cj (2), . . . cj (i), . . .] (3) Donde claramente cj (i) es una variable binaria que puede asumir los valores 0 o 1, y en general las longitudes de las cj son distintas. En figura 3 muestramos el ejemplo con codificación de Huffman; en este caso, C = 5 y c1 = [0, 0, 0], c2 = [0, 0, 1], c3 = [0, 1], c4 = [1, 0], c5 = [1, 1]. Indicamos con Ikj el conjunto Figure 3: Otro ejemplo de codificación Huffman. de ı́ndices de todas las palabras códigos con los primeros k − 1 bits iguales a los primeros k − 1 bits con la palabra código cj : Ikj = {n ∈ N |∀i < k, cn (i) = cj (i)} (4) Por convención I1j = {1, 2, . . . , C} para cualquier j (recordemos que se refiere a k − 1 bits, que en este caso serı́a 0). Si indicamos con P (cj ) la probabilidad del sı́mbolo y con P (cj (i)) la probabilidad especifica del bit i-esimo, podemos escribir la relación: P n n∈Ikj |cn (k)=cj (k) P (c ) j j j j P (5) P (c (k)|c (1), c (2), . . . , c (k − 1)) = n n∈I j P (c ) k Esto vale por como hemos asignado los bits en el árbol (según Huffman), y por la definición de Ikj . Por k = 1 la expresión de la izquierda se reduce 6 a la probabilidad P (cj (1)). Para entender la (5) podemos notar como la probabilidad de c1 se pueda escribir como: P (c1 ) = P (c1 (1) = 0, c1 (2) = 0, c1 (3) = 0) (6) Pero también podemos expresarlo ası́: P (c1 ) = P (c1 (1) = 0) · P (c1 (2) = 0|c1 (1) = 0) · P (c1 (3) = 0|c1 (2) = 0, c1 (1) = 0) (7) Ahora, la probabilidad que le primer bit de la palabra código sea 0, es (por 1 ≤ j ≤ 5: P (cj (1) = 0) = P (c1 ) + P (c2 ) + P (c3 ) (8) Es decir, todas las palabras código de las ramas de izquierda tienen el primer bit igual a 0. Mirando la fig.3 y razonando de la misma manera, se puede entender que: P (cj (2) = 0|cj (1) = 0) = P (c1 ) + P (c2 ) P (c1 ) + P (c2 ) + P (c3 ) P (cj (3) = 0|cj (2) = 0, cj (1) = 0) = P (c1 ) P (c1 ) + P (c2 )) (9) (10) Claramente podemos repetir los calculos para cada bit del árbol. Esta ecuación tiene valor para fuentes con independientes palabras códigos. Para fuentes con memoria, como una relación de Markov entre las palabras códigos, hay que tener en cuenta las palabras códogos precedentes: P (cj (1) = 0|c2 ) = P (c1 |c2 ) + P (c2 |c2 ) + P (c3 |c2 ) (11) Realmente la ecuación (5) es más general, en el sentido que es valida en ambos casos (para fuentes con o sin memorias). En decodificación se trata de aprovhechar la redundancia residual, que peude ser medida de esta forma: Rr = L̄ − H (12) Donde L̄ es la longitud media del código de Huffman y H la entropia de la fuente. Si inidcamos con Y la secuencia recibida y con X la enviada, nos gustarı́a encontrar el máximo de la probabilidad a posteriori (MAP): P (X|Y ) = P (Y |X) · P (X) P (Y ) 7 (13) Donde se ha utilizado la regla de Bayes. Tomando el logaritmo el criterio de maximización será: maxX [log P (Y |X) + log P (X)] (14) Donde podemos observar dos partes: la primera log P (Y |X) se refiere al canal, y la segunda log P (X) es al información a priori de la fuente. Considerando Figure 4: Esquema general. muestras independientes de ruido gaussiano, podemos escribir: X log P (Y |X) = log p(yji |ci (j)) (15) i,j y para la información a priori de la fuente: X log P (X) = log p(ci ) (16) i y utilizando las relaciones demostrada anteriormente: X log P (ci ) = log p(ci (j)|ci (1), ci (2), . . . , ci (j − 1)) (17) i Para maximizar la 14 se puede utilizar un algorithmo de Viterbi, como en la decodificación de los convolucionales, utilizando como metrica los dos terminos log p(yji |ci (j)) y log p(ci (j)|ci (1), ci (2), . . . , ci (j − 1)). Para utilizar este segundo término, hay que conocer y memorizar en que nodo del árbol nos encontramos. Si consideramos dos posibles secuencias {1, 1, 1, 0} y {0, 0, 1, 1}, podemos ver que en la figura 5 como la probabilidad a priori por la primera secuencia es de estar en nodo N2 y recibir un bit 0, mientras para segunda es de estar en el nodo N0 y recibir un bit 1. Claramente este metodo está etricamente relacionado a una decodificación con convolucionales, pero es facil extender al caso de Turbo códigos. 8 Figure 5: Trellis. 6 Bibliografia [1] ”Comunicaciones Digitales”. A. Artés, F. Pérez González, J. Cid, R. López, C. Mosquera, F. Pérez Cruz. [2] ”Elements of information Theory”. Second Edition. Thomas M. Cover, Joy A. Thomas. [3] ”Joint Source-Channel Soft Decoding of Variable-length Codes for Convolutional Codes with Turbo-Codes”. M. Jeanne, J.C. Carlach and P. Siohan. [4] ”Joint Source-Channel Soft Decoding of Huffman Codes with TurboCodes”. L. Guivarch, J.C. Carlach and P. Siohan. 9