6.23: Sutiles de Codificación
( \newcommand{\kernel}{\mathrm{null}\,}\)
- Algunas sutilezas de la codificación, incluyendo la autosincronización y una comparación de los códigos Huffman y Morse.
En el código Huffman, las secuencias de bits que representan símbolos individuales pueden tener longitudes diferentes, por lo que el índice de flujo de bits m no aumenta en el paso de bloqueo con el índice n de la señal con valor de símbolo. Para capturar la frecuencia con la que se deben transmitir los bits para mantenerse al día con la producción de símbolos de la fuente, solo podemos calcular promedios. Si nuestro código fuente promedia¯B(A) bits/símbolo y símbolos se producen a una tasa R, la tasa de bits promedio es igual
¯B(A)R
y esta cantidad determina la duración T del intervalo de bits.
Calcular la relación entre T y la tasa de bits promedio¯B(A)R
Solución
T=1¯B(A)R
Una sutileza de la codificación fuente es si necesitamos “comas” en el flujo de bits. Cuando usamos un número desigual de bits para representar símbolos, ¿cómo determina el receptor cuándo comienzan y terminan los símbolos? Si creaste un código fuente que requiriera un marcador de separación en el flujo de bits entre símbolos, sería muy ineficiente ya que esencialmente estás requiriendo un símbolo extra en el flujo de transmisión.
Un buen ejemplo de esta necesidad es el Código Morse: Entre cada letra, el telégrafo necesita insertar una pausa para informar al receptor cuando ocurren los límites de las letras.
Como se muestra en este ejemplo, no se colocan comas en el flujo de bits, pero se puede decodificar sin ambigüedades la secuencia de símbolos del flujo de bits. Huffman demostró que su código (máximamente eficiente) tenía la propiedad de prefijo: Ningún código para un símbolo comenzó el código de otro símbolo. Una vez que se tiene la propiedad prefix, el flujo de bits se autosincroniza parcialmente: Una vez que el receptor sabe dónde comienza el flujo de bits, podemos asignar una secuencia de símbolos única y correcta al flujo de bits.
Esboce un argumento de que la codificación de prefijo, ya sea derivada de un código Huffman o no, proporcionará decodificación única cuando se usa un número desigual de bits/símbolo en el código.
Solución
Debido a que ninguna palabra de código comienza con la palabra de código de otra persona, la primera palabra de código encontrada en un flujo de bits debe ser la correcta. Tenga en cuenta que debemos comenzar por el inicio del flujo de bits; saltar al medio no garantiza una decodificación perfecta. El final de una palabra clave y el comienzo de otra podría ser una palabra clave, y nos perderíamos.
Sin embargo, tener un código de prefijo no garantiza la sincronización total: Después de saltar a la mitad de un flujo de bits, ¿podemos encontrar siempre los límites de símbolo correctos? El problema de la autosincronización mitiga el uso de algoritmos eficientes de codificación de fuentes.
Mostrar con el ejemplo que un flujo de bits producido por un código Huffman no necesariamente se sincroniza automáticamente. ¿Los códigos de longitud fija se sincronizan automáticamente?
Solución
Considera el flujo de bits... 0110111... tomado del flujo de bits 0|10|110|110|111|... Descodificaríamos la parte inicial incorrectamente, luego sincronizaríamos. Si tuviéramos un código de longitud fija (digamos 00,01,10,11), la situación es mucho peor. ¡Saltar al medio lleva a que no haya sincronización en absoluto!
Otro problema son los errores de bit inducidos por el canal digital; si ocurren (y lo harán), la sincronización se puede perder fácilmente incluso si el receptor arrancó “en sincronía” con la fuente. A pesar de las pequeñas probabilidades de error que ofrece el buen diseño del conjunto de señales y el filtro coincidente, un error poco frecuente puede devastar la capacidad de traducir un flujo de bits en una señal simbólica. Necesitamos formas de reducir los errores de recepción sin exigir que p e sea más pequeño.
El primer sistema de comunicaciones eléctricas, el telegrama, era digital. Cuando se desplegó por primera vez en 1844, comunicaba texto a través de conexiones por cable usando un código binario, el código Morse, para representar letras individuales. Para enviar un mensaje de un lugar a otro, los operadores de telégrafos tocarían el mensaje usando una clave telegráfica a otro operador, quien transmitiría el mensaje al siguiente operador, presumiblemente acercando el mensaje a su destino. En definitiva, el telégrafo se basó en una red no muy diferente a los conceptos básicos de las redes informáticas modernas. Decir que presagiaba las comunicaciones modernas sería quedarse corto. También estaba muy por delante de algunas tecnologías necesarias, a saber, el Teorema de Codificación de Fuentes. El código Morse, que se muestra en la siguiente tabla, no era un código de prefijo. Para separar los códigos para cada letra, el código Morse requería que se insertara un espacio, una pausa, entre cada letra. En la teoría de la información, ese espacio cuenta como otra letra de código, lo que significa que el código Morse codificaba texto con un código fuente de tres letras: puntos, guiones y espacio. El código fuente resultante no está dentro de un poco de entropía, y es groseramente ineficiente (alrededor del 25%). En la tabla se muestra un código Huffman para texto en inglés, que como sabemos es eficiente.