You are on page 1of 12

Decodificación del código de prefijo.

Para decodificar una secuencia de palabras de código generadas a partir de un código fuente de
prefijo, el decodificador de origen simplemente comienza al inicio de la secuencia y decodifica
una palabra de código a la vez. Específicamente, establece lo que es equivalente a un árbol de
decisión, que es una representación gráfica de las palabras de código en el código fuente
particular. Por ejemplo, la figura 5.4 representa el árbol de decisión correspondiente al código
II en la tabla 5.2. El árbol tiene un estado inicial y cuatro estados terminales correspondientes a
los símbolos fuente s0, s1, s2 y s3. El decodificador siempre comienza en el estado inicial. El
primer bit recibido mueve el decodificador al estado terminal s0 si es 0 o bien a un segundo
punto de decisión si es 1. En el último caso, el segundo bit mueve el decodificador un paso más
abajo en el árbol, ya sea al estado terminal s1 si es 0 o bien a un tercer punto de decisión si es
1, y así sucesivamente. Una vez que cada estado terminal emite su símbolo, el decodificador se
restablece a su estado inicial. Tenga en cuenta también que cada bit en la secuencia codificada
recibida se examina solo una vez. Considere, por ejemplo, la siguiente secuencia codificada:
Esta secuencia se decodifica fácilmente como la secuencia fuente s1s3s2s0s0 .... Se invita al
lector a llevar a cabo este decodificador.

Como se mencionó anteriormente, un código de prefijo tiene la propiedad importante que se


puede decodificar instantáneamente. Pero lo contrario no es necesariamente cierto. Por
ejemplo, el código III en la tabla 5.2 no satisface la condición de prefijo, sin embargo, es
decodificable de manera única porque el bit 0 indica el comienzo de cada palabra de código en
el código.

Para profundizar en los códigos de prefijo, ejemplificados por el de la tabla 5.2, recurrimos a una
desigualdad, que se considera a continuación.

Desigualdad de Kraft.

Considere una fuente discreta sin memoria con el alfabeto de origen (s0, s1, ....., sk-1) y las
probabilidades de origen (p0, p1, ....., pk-1), con la palabra de código del símbolo sk que tiene
longitud lk, k = 0, 1, ...., A-1. Entonces, de acuerdo con la desigualdad de kraft, las longitudes de
la palabra de código siempre satisfacen la siguiente desigualdad:

(5,22)

donde el factor 2 se refiere a la cantidad de símbolos en el alfabeto binario. La desigualdad de


kraft es una condición necesaria pero no suficiente para que un código fuente sea un código de
prefijo.

En otras palabras, la desigualdad de (5.22) es simplemente una condición en las longitudes de la


palabra de código de un código de prefijo y no en las propias palabras de código. Por ejemplo,
refiriéndonos a los tres códigos enumerados en la tabla 5.2, vemos:

* El código I viola la desigualdad de kraft; no puede, por lo tanto, ser un código de prefijo.

* La desigualdad de kraft es satisfecha por los códigos II y III, pero solo el código II es un código
de prefijo.

Dada una fuente discreta sin memoria de entropía H (S), se puede construir un código de prefijo
con una longitud promedio de palabra de código L, que está delimitada de la siguiente manera:

(5,23)

El límite de la izquierda de (5,23) se satisface con la igualdad bajo la condición de que el símbolo
Sk sea emitido por la fuente con probabilidad

(5,24)

donde lk es la longitud de la palabra de código asignada al símbolo fuente Sk. Se dice que una
distribución gobernada por (5,24) es una distribución diádica. Para esta distribución,
naturalmente tenemos
Bajo esta condición, la desigualdad de kraft de (5,22) confirma que podemos construir un código
de prefijo, de modo que la longitud de la palabra de código asignada al símbolo fuente Sk es -
log2 Pk. Para dicho código, la longitud promedio de la palabra de código es

(5,25)

y la correspondiente entropía de la fuente es

(5,26)

Por lo tanto, en este caso especial (más bien estricto), encontramos (5,25) y (5,26) que el código
del prefijo se empareja con la fuente en que L = H (S).

¿Pero cómo hacemos coincidir el código de prefijo con una fuente arbitraria discreta sin
memoria? La respuesta a este problema básico radica en el uso de un código extendido. Deje
que Ln denote la longitud promedio de la palabra de código del código de prefijo extendido.
Para un código descifrable único, Ln es el más pequeño posible. De (5,23), encontramos que

o equivalente,

En el límite, cuando n se acerca al infinito, los límites inferior y superior en (5,28) convergen
como se muestra en

Podemos, por lo tanto, hacer la declaración:

* Al hacer que el orden n de un codificador de fuente de prefijo ampliado sea lo suficientemente


grande, podemos hacer que el código represente fielmente la fuente S discreta y sin memoria
tan fielmente como se desee.
En otras palabras, la longitud promedio de la palabra de código de un código de prefijo
extendido puede hacerse tan pequeña como la entropía de la fuente, siempre que la cadena
extendida tenga un orden lo suficientemente alto de acuerdo con el teorema de codificación
fuente.

Código Huffman:

A continuación se describe una clase importante de códigos de prefijos conocidos como códigos
Huffman, la ida básica detrás de la codificación de Huffman es la construcción de un algoritmo
simple que calcula un código de prefijo óptimo para una distribución dada, óptimo en el sentido
de que el código tiene la longitud esperada más corta. El resultado final es un código fuente cuya
longitud promedio de palabra de código se acerca al límite fundamental establecido por la
entropía de una fuente discreta sin memoria, es decir, H (S). La esencia del algoritmo utilizado
para sintetizar el código de Huffman es reemplazar el conjunto prescrito de estadísticas fuente
de una fuente discreta sin memoria por una más simple. Este proceso de reducción se continúa
paso a paso hasta que nos queda un conjunto final de solo dos fuente (símbolos), para las cuales
(0,1) es un código óptimo. A partir de este código trivial, trabajamos hacia atrás y, por lo tanto,
construimos el código de Huffman para la fuente dada.

Para ser específico, el algoritmo de codificación Huffman procede de la siguiente manera:

1. Los símbolos fuente se enumeran en orden de probabilidad decreciente. Los dos símbolos
fuente de la probabilidad más baja tienen asignados 0 y 1. Esta parte del paso se conoce como
la etapa de división.

2. Estos dos símbolos fuente se combinan en un nuevo símbolo fuente con una probabilidad
igual a la suma de las dos posibilidades originales. (Por lo tanto, la lista de símbolos de origen y,
por lo tanto, las estadísticas de origen, se reduce en uno). La probabilidad de que el nuevo
símbolo se coloque en la lista de acuerdo con su valor.

3. El procedimiento se repite hasta que nos queda una lista final de las estadísticas de fuente
(símbolos) de solo dos para las que se asignan los símbolos 0 y 1.

Huffman Tree.

Para ilustrar la construcción de un código de Huffman, considere los cinco símbolos del alfabeto
de una fuente discreta sin memoria y sus probabilidades, que se muestran en las dos columnas
más a la izquierda de la figura 5.5b. Siguiendo el algoritmo huffman, llegamos al final del cálculo
en cuatro pasos, lo que da como resultado un árbol Huffman similar al que se muestra en la
figura 5.5; el árbol de Huffman no debe confundirse con el árbol de decisión discutido
previamente en la figura 5.4. Las palabras de código del código de Huffman para la fuente se
tabulan en la figura 5.5a. La duración promedio de la palabra clave es, por lo tanto,

La entropía de la fuente discreta sin memoria especificada se calcula de la siguiente manera (ver
5.9):
Para este ejemplo, podemos hacer dos observaciones:

1. La longitud media de la palabra de código excede la entropía H (S) en solo un 3,67%.

2. La longitud promedio de la palabra de código L sí satisface (5,23).

Se debe mencionar que el proceso de codificación Huffman (es decir, el árbol Huffman) no es
único.

En particular, podemos citar dos variaciones en el proceso que son responsables de la falta de
singularidad del código de Huffman. Primero, en cada etapa de división en la construcción de un
código Huffman, hay arbitrariedad en la forma en que los símbolos 0 y 1 están asignados a los
dos últimos símbolos fuente. Sin importar de qué forma se realicen las asignaciones, sin
embargo, las diferencias resultantes son triviales. Segundo, la ambigüedad surge cuando se
encuentra que la probabilidad de un símbolo combinado (obtenido al sumar las últimas dos
probabilidades pertinentes a un paso en particular) es igual a otra probabilidad en la lista.
Podemos proceder colocando la probabilidad de los nuevos símbolos altos como sea posible,
como en el ejemplo 4.

Alternativamente, podemos colocarlo lo más bajo posible. (Se presume que cualquiera que sea
la forma en que se realice la colocación, alta o baja, se cumple de manera uniforme durante
todo el proceso de codificación). En este momento, surgen diferencias notables debido a que
las palabras de código en el código fuente resultante pueden tener diferentes longitudes. Sin
embargo, las longitudes medias de la palabra de código de un código de origen, definimos la
varianza de la longitud promedio de la palabra de código L sobre el conjunto de símbolos fuente
como

donde p0, p1, ...., pk-1 son las fuentes estáticas y lk es la longitud de la palabra de código
asignada al símbolo fuente sk. Generalmente se encuentra que cuando un símbolo combinado
se mueve lo más alto posible, el código resultante de Humano tiene una varianza
significativamente menor d ^ 2 que cuando se mueve lo más bajo posible. Sobre esta base, es
razonable elegir el antiguo código Huffman sobre el último.

Codificación Lempel-Ziv.

Un inconveniente del código de Huffman es que requiere el conocimiento de un modelo


probabilístico de la fuente; lamentablemente, en la práctica, las estadísticas de origen no
siempre se conocen a priori. Además, en el modelado de texto, encontramos que los requisitos
de almacenamiento impiden que el código de Huffman capture las relaciones de orden superior
entre palabras y frases porque el libro de códigos crece exponencialmente rápido en el tamaño
de cada supermúsculo de letras; la eficiencia del código está por lo tanto comprometida. Para
superar estas limitaciones prácticas de los códigos Huffman, podemos usar el algoritmo Lempel-
Ziv. que es intrínsecamente adaptativo y más simple de implementar que la codificación
Huffman.

Básicamente, la idea detrás de la codificación en el algoritmo de Lempel-Ziv se describe de la


siguiente manera:

La secuencia de datos fuente se analiza en segmentos que son las subsecuencias más cortas que
no se encontraron anteriormente.

Para ilustrar esta idea simple pero elegante, considere el ejemplo de la secuencia binaria

Se supone que los símbolos binarios 0 y 1 ya están almacenados en ese orden en el libro de
códigos. Nosotros escribimos

Subsecuencias almacenadas: 0,1

Datos a analizar: 000101110010100101

El proceso de codificación comienza a la izquierda. Con los símbolos 0 y 1 ya almacenados, la


subsecuencia más corta de la secuencia de datos encontrada por primera vez y no vista
anteriormente es 00; entonces escribimos:

Subsecuencias almacenadas: 0,1, 00

Datos a analizar: 0101110010100101 ..

La segunda subsecuencia más corta que no se ha visto antes es 01; en consecuencia, vamos a
escribir

Subsecuencias almacenadas: 0,0,00,01

Datos a analizar: 01110010100101 ……

La siguiente subsecuencia más corta no encontrada previamente es 011; por lo tanto, escribimos

Subsecuencias almacenadas: 0,1,00,01,011

Datos a analizar: 10010100101 ...


El decodificador Lempel-Ziv es tan simple como el codificador. Específicamente, usa el puntero
para identificar la subsecuencia raíz y luego agrega el símbolo de innovación.

Considere, por ejemplo, el bloque codificado binario 1101 en la posición 9. El último bit, 1, es el
símbolo de innovación. Los bits restantes, 110, apuntan a la subsecuencia raíz 10 en la posición
6. Por lo tanto, el bloque 1101 se decodifica en 101, que es correcto.

Del ejemplo que se describe aquí, observamos que, a diferencia de la codificación Huffman, el
algoritmo Lempel-Ziv usa códigos de longitud fija para representar un número variable de
símbolos fuente; esta característica hace que el código Lempel-Ziv sea adecuado para la
transmisión síncrona.

Canales discretos sin memoria.

Un canal discreto sin memoria es un modelo estadístico con una entrada X y una salida Y que es
una versión ruidosa de X; tanto X como Y son variables aleatorias. Cada unidad de tiempo, el
canal acepta un símbolo de entrada X seleccionado de un alfabeto X y, en respuesta, emite un
símbolo de salida Y del alfabeto Y. Se dice que el canal es "discreto" cuando ambos alfabetos X
e Y tener tamaños finitos. Se dice que es "sin memoria" cuando el símbolo de salida actual
depende solo del símbolo de entrada actual y no de ningún símbolo anterior o futuro.

La figura 5.7a muestra una vista de un canal discreto sin memoria. El canal se describe en
términos de un alfabeto de entrada

y un alfabeto de salida
La cardinalidad de los alfabetos X e Y, o cualquier otro alfabeto para el caso, se define como la
cantidad de elementos en el alfabeto. Además, el canal se caracteriza por un conjunto de
probabilidades de transición

para lo cual, según la teoría de la probabilidad, naturalmente tenemos

(5,35)

Cuando el número de símbolos de entrada J y el número de símbolos de salida K no son grandes,


puede representar gráficamente el canal discreto sin memoria de otra manera, como se muestra
en la figura 5.7b. En esta última representación, cada par de símbolos de entrada-salida (x, y),
caracterizado por la probabilidad de transición p (y | x)> 0, se une por una línea etiquetada con
el número p (y | x).

Además, el alfabeto de entrada X y el alfabeto de salida Y no necesitan tener el mismo tamaño;


de ahí el uso de J para el tamaño de X y K para el tamaño de Y. Por ejemplo, en la codificación
de canal, el tamaño K del alfabeto de salida Y puede ser mayor que el tamaño J del alfabeto de
entrada X; por lo tanto K> J. Por otro lado, podemos tener una situación en la que el canal emita
el mismo símbolo cuando se envía uno de los dos símbolos de entrada, en cuyo caso tenemos K
<J.

Una forma conveniente de describir un canal discreto sin memoria es organizar las diversas
probabilidades de transición del canal en forma de una matriz.

La matriz P de J-por-K se llama matriz de canal o matriz estocástica. Tenga en cuenta que cada
fila de la matriz de canal P corresponde a una entrada de canal fijo, mientras que cada columna
de la matriz corresponde a una salida de canal fijo. Nótese también que una propiedad
fundamental de la matriz de canal P, como se define aquí, es que la suma de los elementos a lo
largo de cualquier fila de la matriz estocástica es siempre igual a uno, de acuerdo con (5,35).

Canal binario simétrico.

El canal binario simétrico es de interés teórico e importancia práctica. Es un caso especial de


canal discreto sin memoria con J = K = 2. El canal tiene dos símbolos de entrada (x0 = 0, x1 = 1)
y dos símbolos de salida (y0 = 0, y1 = 1). El canal es simétrico porque la probabilidad de recibir 1
si se envía 0 es la misma que la probabilidad de recibir 0 si se envía 1. Este diagrama de
probabilidad condicional de un canal simétrico binario es como se muestra en la figura 5.8. En
consecuencia, podemos expresar la matriz estocástica como:

Dado que pensamos en la salida de canal Y (seleccionada del alfabeto Y) como una versión
ruidosa de la entrada de canal X (seleccionada del alfabeto X) y que la entropía H (X) es una
medida de la incertidumbre previa sobre X, ¿cómo se puede medir la incertidumbre sobre X
después de observar Y? Para responder a esta pregunta básica, extendemos las ideas
desarrolladas en la sección 5.2 definiendo la entropía condicional de X seleccionada del alfabeto
X, dada Y = yk. Específicamente, escribimos:

Esta cantidad es en sí una variable aleatoria que toma los valores H (X | Y = yk), H (X | Y = yk-1)
con las probabilidades p (y0), ...., p (yk-1), respectivamente. La expectativa de entropía H (X | Y
= yk) sobre el alfabeto de salida Y está, por lo tanto, dada por:

donde, en la última línea, usamos la definición de la probabilidad del evento conjunto (X = xk, Y
= yk) como se muestra por:

La cantidad H (X | Y) en 5,41 se llama entropía condicional, formalmente definida de la siguiente


manera:

La entropía condicional, H (X | Y), es la cantidad promedio de incertidumbre que queda sobre la


entrada del canal después de que se haya observado la salida del canal.

La entropía condicional H (X | Y) relaciona la salida de canal Y con la entrada de canal X. La


entropía H (X) define la entropía de la entrada de canal X por sí misma. Dadas estas dos
entropías, ahora presentamos la definición

que se llama información mutua del canal. Para agregar significado a este nuevo concepto,
reconocemos que la entropía H (X) explica la incertidumbre sobre la entrada del canal antes de
observar la salida del canal y la entropía condicional (X | Y) por la incertidumbre sobre la entrada
del canal después de observar la salida del canal.

Por lo tanto, podemos continuar haciendo la declaración:

La información mutua I (X, Y) es una medida de la incertidumbre sobre la entrada del canal, que
se resuelve al observar la salida del canal.
La información mutua I (Y, X) es una medida de la incertidumbre sobre la salida del canal, que
se resuelve enviando la entrada del canal.

Propiedades de la información mutua

Simetría: la información mutua de un canal es simétrica en el sentido de que

Para probar esta propiedad, primero usamos la fórmula entropía y luego usamos (5,35) y (5,38),
en ese orden, obteniendo:

donde, al pasar de la tercera a la línea final, utilizamos la definición de probabilidad conjunta.


Por lo tanto, sustituyendo:

Llegando a la demostración de:

No negatividad: La información mutua siempre es no negativa; es decir;

Esta propiedad estable que no se puede perder información, en promedio, observando la salida
de un canal.

Además, la información mutua es cero si, y solo si, los símbolos de entrada y salida del canal son
estadísticamente independientes.
Ahora que entendemos el significado de la entropía de una variable aleatoria, estamos
equipados para abordar un tema importante en la teoría de la comunicación: la representación
de los datos generados por una fuente discreta de información.

El proceso por el cual se realiza esta representación se llama codificación de origen. El


dispositivo que realiza la representación de los datos generados por una fuente de información
discreta.

El proceso por el cual se logra esta representación se llama codificación de origen. El


dispositivo que realiza la representación se llama un codificador de origen. Por razones que
deben describirse, puede ser conveniente conocer las estadísticas de la fuente. En particular, si
se sabe que algunos símbolos de origen son más probables que otros, podemos explotar esta
característica en la generación de un código fuente asignando palabras de código cortas a
símbolos de fuente frecuentes, y palabras de código largas a símbolos de fuente rara. Nos
referimos a dicho código fuente como un código de longitud variable. El código Morse, usado
en telegrafía en el pasado, es un ejemplo de un código de longitud variable. Nuestro principal
interés está en la formulación de un codificador de fuente que satisfaga dos requisitos:

You might also like