16
Jorge Israel Ñique Tumbajulca Compresión de datos Huffman 1. Autor - Ñique Tumbajulca, Jorge Israel 2. Introducción Hasta el momento ,el objetivo principal de estudio en nuestros laboratorios an sido los diferentes tipos de cuantificación. .Asumiendo que la información dada en los informes anteriores a sido estudiada y mejorada analizando y buscando una respuesta concreta al porque de cada duda , podemos decir que somos capaces de analizar cualquier tipo de cuantificación estudiado ,con la ayuda de los modelos diseñados en la herramienta simulink de matlab .Y bien ya sabemos como cuantificar y codificar una señal ,pero tenemos idea de cómo reducir el tamaño de la codificación de un mensaje? y sabemos el porque de la compresión de un mensaje? . Pues bien éste informe esta diseñado para iniciar el estudio del método de compresión de datos ,asimismo realizar un análisis de la compresión de una señal, específicamente ,la compresión de datos Hufman que puede ser aplica a los sistemas de cuantificación estudiados . 3. Objetivos -Conocer el uso de nuevas funciones en matlab. -Realizar la compresión de datos Huffman para una señal aleatoria . -Conocer el funcionamiento de algunos compresores como winRan,winZip,Gzip,etc. 4. Fundamento Teórico 4.1Compresion de datos Huffman: Al implementar un sistema de comunicaron digital ,el siguiente paso después de cuantificar la señal es comprimirla .La compresión de datos sin perdida se fundamenta en la idea de que muchas veces la información a transmitir es redundante en si misma , por lo que realizar la compresión de la información significa disminuir esta redundancia. Huffman desarrollo un método para comprimir datos sin perdidas , este método consiste en mapear los símbolos , generados por una fuente de

[Teocom2]Huffman

Embed Size (px)

DESCRIPTION

teoria de comunicaciones

Citation preview

Page 1: [Teocom2]Huffman

����������������� ��������������� Jorge Israel Ñique Tumbajulca

������������������������������������������������������������������������������������������������������������������������������������������������� � � � � � ���� � � ��� � � �� � ���� � ����

Compresión de datos Huffman

1. Autor

- Ñique Tumbajulca, Jorge Israel

2. Introducción

Hasta el momento ,el objetivo principal de estudio en nuestros laboratorios an sido los diferentes tipos de cuantificación. .Asumiendo que la información dada en los informes anteriores a sido estudiada y mejorada analizando y buscando una respuesta concreta al porque de cada duda , podemos decir que somos capaces de analizar cualquier tipo de cuantificación estudiado ,con la ayuda de los modelos diseñados en la herramienta simulink de matlab .Y bien ya sabemos como cuantificar y codificar una señal ,pero tenemos idea de cómo reducir el tamaño de la codificación de un mensaje? y sabemos el porque de la compresión de un mensaje? . Pues bien éste informe esta diseñado para iniciar el estudio del método de compresión de datos ,asimismo realizar un análisis de la compresión de una señal, específicamente ,la compresión de datos Hufman que puede ser aplica a los sistemas de cuantificación estudiados .

3. Objetivos

-Conocer el uso de nuevas funciones en matlab. -Realizar la compresión de datos Huffman para una señal aleatoria . -Conocer el funcionamiento de algunos compresores como winRan,winZip,Gzip,etc.

4. Fundamento Teórico 4.1Compresion de datos Huffman:

Al implementar un sistema de comunicaron digital ,el siguiente paso después de cuantificar la señal es comprimirla .La compresión de datos sin perdida se fundamenta en la idea de que muchas veces la información a transmitir es redundante en si misma , por lo que realizar la compresión de la información significa disminuir esta redundancia. Huffman desarrollo un método para comprimir datos sin perdidas , este método consiste en mapear los símbolos , generados por una fuente de

Page 2: [Teocom2]Huffman

����������������� ��������������� Jorge Israel Ñique Tumbajulca

������������������������������������������������������������������������������������������������������������������������������������������������� � � � � � ���� � � ��� � � �� � ���� � ����

información , a un conjunto de código de números de bit variable ,ningún código debe ser prefijo de otro , de esta manera se evita ambigüedades al momento de decodificar la información comprimida. Emplear un código de números de bits variables tiene la ventaja de poder asignar el código con menor numero de bits al símbolo mas probable generado por la fuente de información , de la misma manera ,al símbolo menos probable se le asignará el mayor numero de bits .Para realizar eficientemente esta asignación ,es necesario conocer la probabilidad de cada símbolo que genera la fuente de Información. Veamos un ejemplo en el que se ha generado un diccionario Al implementar un sistema de comunicación digital, el siguiente paso después de cuantificar la señal es comprimirla. La compresión de datos sin pérdida se fundamenta en la idea He que muchas veces la información a transmitir es redundante en si misma, por lo que realizar la compresión de la información significa disminuir esta redundancia. Huffman desarrollo un método para comprimir datos sin pérdidas, este método consiste en mapear los símbolos, generados por una fuente de información, a un conjunto de códigos de número de bits variable, ningún código debe ser prefijo de otro de esta manera se evita ambigüedades al momento de decodificar la información comprimida. Emplear un código de número de bits variables tiene la ventaja de poder asignar el código con menor número de bits al símbolo más probable generado por la fuente de información, de la misma manera, al símbolo menos probable se le asignará el mayor número de bits. Para realizar eficientemente esta asignación Huffman para una codificación de 3 bits

Decimal Binario Probabilidad Código

0d 000b 0.36 1H

1d 001b 0.32 00H

2d 010b 0.16 010H

3d 011b 0.08 0110H

4d 100b 0.04 01110H

5d 101b 0.02 011110H

6d 110b 0.01 011111H

7d 111b 0.01 011110H

Tabla 1. Diccionario Huffman para 3 bits

Page 3: [Teocom2]Huffman

����������������� ��������������� Jorge Israel Ñique Tumbajulca

������������������������������������������������������������������������������������������������������������������������������������������������� � � � � � ���� � � ��� � � �� � ���� � ����

Se requiere codificar el siguiente mensaje

M = [0,1,3,2,0,0,1]

El mensaje codificado en binario quedaría de la siguiente manera

Mb = [000001011010000000001]

Para decodificar este mensaje basta con tomar las cifras de tres en tres y reemplazarlas por su equivalente en decimal, el mensaje comprimido empleando Huffman quedaría de la siguiente manera

Mh = [10001100101100] Decodificar el mensaje comprimido en Huffman no es tan sencillo como en binario, el método consisten en tomar un determinado número de bits hasta tener un código igual al de nuestro diccionario, para nuestrb ejemplo comenzamos tomando el “1” y notamos que es un elemento de nuestro diccionario al que le corresponde el símbolo “0”, luego tomamos el 0 y como no tenemos ningún código con 0 tomamos el siguiente dígito, ahora tenemos el 00 y vemos que es un código de nuestro diccionario al que le corresponde el símbolo 1, repetimos este procedimiento hasta el final. El mensaje decodificado quedaría de la siguiente manera

Mhdeco = [l|00|0110|010l|l|00]

Se pude observar que el código de Huffman comprime el mensaje ya que remplaza el '0d' en decimal por un solo bit el '1H' y no por el '000b' que es su equivalente en binario, también se observa que el '6d' en decimal tiene el código '011111H' el cual empleado seis bits es decir cuatro bits más que su código en binario lo que significa que si el mensaje tuviera en su mayoría el símbolo '6d' este diccionario terminaría expandiendo el mensaje en vez de comprimirlo.

5. Materiales -Pc con software Matlab R2006a (simulink)

Page 4: [Teocom2]Huffman

����������������� ��������������� Jorge Israel Ñique Tumbajulca

������������������������������������������������������������������������������������������������������������������������������������������������� � � � � � ���� � � ��� � � �� � ���� � ����

6. Procedimiento 6.1 Descripción:

Para esta experiencia crearemos un script cuyo objetivo fundamental es el de calcular el diccionario Huffman y la taza de compresión para n bits .Empezaré por dar una descripción general y especifica del funcionamiento del script ya que la descripción de cada función es dada en las conclusiones.

El script a editar es el siguiente.

Figura 1. Script en matlab.

Inicialmente se genera una señal aleatoria con varianza de 0.25 haciendo uso de las funciones randn y abs , el nombre de esta señal es xa. Éste proceso es análogo al que hacíamos en simulink, la diferencia es que en simulink disponíamos de un bloque gaussian generador el cual era configurado para generar una señal aleatoria especifica ,asimismo usábamos un bloque valor absoluto que en nuestro script viene a ser la función abs. La señal generada deberá ser cuantificada , para esto establecemos un codebook y una partición las cuales serán usadas con la función quantiz , la

Page 5: [Teocom2]Huffman

����������������� ��������������� Jorge Israel Ñique Tumbajulca

������������������������������������������������������������������������������������������������������������������������������������������������� � � � � � ���� � � ��� � � �� � ���� � ����

señal cuantificada en nuestro script toma el nombre de xi .En simulink esto vendría a ser el proceso realizado por el bloque quantizing encoder. Todo el proceso anterior es el mismo que en los laboratorios pasados la diferencia es que esta vez esta editado en un script .

Figura 2. Funcionamiento del script. Una vez que la señal ya a sido codificada podemos aplicar la compresión Huffman , para esto hallamos la probabilidad de cada símbolo de la señal cuantificada ,por ejemplo : Para una señal :

x=[1 2 0 3 1 0 0 2 1 0 2 1 1 ]

La probabilidad de cada símbolo esta dada por :

���������

simbolosdeTotal

igualesSimbolosobabilidadP

#

#Pr ==

Page 6: [Teocom2]Huffman

����������������� ��������������� Jorge Israel Ñique Tumbajulca

������������������������������������������������������������������������������������������������������������������������������������������������� � � � � � ���� � � ��� � � �� � ���� � ����

Entonces : Para : 0 P=0.31

1 P=0.38 2 P=0.23 3 P=0.08

El calculo de las probabilidades de cada señal esta dado por la función hist

(numero de veces que se repite un símbolo) dividida entre el numero de símbolos(l).Luego haciendo uso de los símbolos y sus probabilidades ejecutamos la función huffmandict la cual nos arrojara el diccionario Huffman para cada símbolo. La taza de compresión responde a la siguiente formula :

Esta formula es aplicada en la línea 14 de nuestro script ,previamente se calculó la medida del vector de la señal comprimida (length(xenco)) y la medida de la señal codificada con 8 bits (l*m).

7. Análisis de datos y resultados ����������7.1 Determinar el diccionario Huffman para 4 y 5 bits.

En nuestro script el número de bits esta determinado por n ,entonces para n=4 la cuantificación se ara con 4 bits , lo mismo será para n=5 donde la cuantificación se ara con 5 bits. Ademas , si queremos mostrar los valores en una lista debemos usar una instrucción mas, esta instrucción puede ser workspace u openvar , como ejemplo usaremos openvar para n=4 y workspace para n=5.

muestrasxbits

comprimidaseñalladetotalesbitsmuestrasxbitsCT

##

###..

−=

Page 7: [Teocom2]Huffman

����������������� ��������������� Jorge Israel Ñique Tumbajulca

������������������������������������������������������������������������������������������������������������������������������������������������� � � � � � ���� � � ��� � � �� � ���� � ����

Para 4 bits:

Figura 3. Diccionario Huffman para 4 bits.

Los codigos resultantes según las probabilidades de cada símbolo , se muestran en la siguiente tabla:

Figura 4. Tabla de códigos Huffman.

Symbolos Código

0 [0 0 1] 1 [1 0] 2 [0 0 0] 3 [0 1 0] 4 [1 1 0] 5 [0 1 1 0] 6 [0 1 1 1] 7 [1 1 1 1] 8 [1 1 1 0 0] 9 [1 1 1 0 1 0] 10 [1 1 1 0 1 1 0] 11 [1 1 1 0 1 1 1 0] 12 [1 1 1 0 1 1 1 1 0] 13 [1 1 1 0 1 1 1 1 1 1 1] 14 [1 1 1 0 1 1 1 1 1 1 0] 15 [1 1 1 0 1 1 1 1 1 0]

Page 8: [Teocom2]Huffman

����������������� ��������������� Jorge Israel Ñique Tumbajulca

������������������������������������������������������������������������������������������������������������������������������������������������� � � � � � ���� � � ��� � � �� � ���� � ����

Ademas la función hist tambien plotea la relacion de xi con los símbolos:

Figura 5. Relacion Xi vs símbolo

Para 5 bits:

El codigo usado es el siguiente: n=5

Figura 6. Diccionario Huffman para 5 bits.

Page 9: [Teocom2]Huffman

����������������� ��������������� Jorge Israel Ñique Tumbajulca

������������������������������������������������������������������������������������������������������������������������������������������������� � � � � � ���� � � ��� � � �� � ���� � ����

Los codigos resultantes según las probabilidades de cada símbolo , se muestran en la siguiente tabla:

Symbolos códigos 0 [0 0 0 0]

1 [0 1 1] 2 [1 0 0] 3 [0 0 0 1] 4 [0 0 1 0] 5 [0 0 1 1] 6 [1 1 1 0] 7 [1 0 1 1]

8 [0 1 0 0]

9 [1 1 0 1] 10 [1 1 0 0] 11 [0 1 0 1 0] 12 [1 0 1 0 1] 13 [1 1 1 1 0] 14 [1 0 1 0 0 0]

15 [1 1 1 1 1 0] 16 [0 1 0 1 1 0] 17 [0 1 0 1 1 1] 18 [1 0 1 0 0 1 0 1]

19 [1 1 1 1 1 1] 20 [1 0 1 0 0 1 0 0]

21 [1 0 1 0 0 1 1 1 1 0]

22 [1 0 1 0 0 1 1 1 0] 23 [1 0 1 0 0 1 1 0 0 1] 24 101001111111111 25 [1 0 1 0 0 1 1 0 0 0]

26 [1 0 1 0 0 1 1 0 1]

27 101001111111110

28 10100111111110

29 1010011111110

30 101001111110 31 10100111110

Figura 3. Relacion Xi símbolo

Page 10: [Teocom2]Huffman

����������������� ��������������� Jorge Israel Ñique Tumbajulca

������������������������������������������������������������������������������������������������������������������������������������������������� � � � � � ���� � � ��� � � �� � ��� �� � ����

Ademas la función hist tambien plotea la relacion de xi con los

símbolos:

Figura 7. Relacion Xi vs símbolo 7.2 Graficar la taza de compresión versus la varianza del mensaje

gaussiano para una varianza entre 0.001 y 0.250 con aumentos de 0.001 empleando 8 bits.

Para que el valor de la varianza varié , aremos uso de la instrucción for ,la cual aumentara 0.001 a 0.001 hasta llegar a 0.250 .Los valores de la taza de compresión obtenidos para cada varianza se almacenaran en un vector al igual que las varianzas ,de esta manera , cuando la instrucción for termine de ejecutarse , se graficara los vectores con los valores almacenado.

Page 11: [Teocom2]Huffman

����������������� ��������������� Jorge Israel Ñique Tumbajulca

������������������������������������������������������������������������������������������������������������������������������������������������� � � � � � ���� � � ��� � � �� � ����� � ����

Figura 8. Código para grafica de taza de compresión La grafica queda de la siguiente forma:

Figura 9. Código para grafica de taza de compresión

Page 12: [Teocom2]Huffman

����������������� ��������������� Jorge Israel Ñique Tumbajulca

������������������������������������������������������������������������������������������������������������������������������������������������� � � � � � ���� � � ��� � � �� � ����� � ����

Preferí muestrearla para que se vea mejor, pero si se prefiere solo se cambia la instrucción stem por la instrucción plot.

8. Cuestionario 8.1 Comentar todas las funciones empleadas en este laboratorio . Randn(x,y) Ésta función genera una , matriz (señal aleatoria)cuya dimensión es

x*y .Análogo al bloque noise generador usado en simulink , ésta vendría a ser nuestra fuente de señal aleatoria .

Hist(x,y)

Da el numero de veces que se repite ‘x’ en una serie de bits ‘y’, tambien grafica esta relación .

Length(x,y) Muestra el tamaño del vector . Huffmandict(x,y)

Crea un diccionario de código Huffman para los símbolos ‘x’ de acuerdo a su probabilidad de concurrencia ‘y’

Huffmanenco(x,y)

Diríamos que decodifica (comprime) el código ’x‘ con el código del diccionario Huffman ‘y’.

Huffmanenco(x,y)

Decodifica la señal comprimida (descomprime) teniendo como referencia el diccionario Huffman .

Page 13: [Teocom2]Huffman

����������������� ��������������� Jorge Israel Ñique Tumbajulca

������������������������������������������������������������������������������������������������������������������������������������������������� � � � � � ���� � � ��� � � �� � ����� � ����

Cuantiz(x,y,z)

Cuantifica una señal ‘x’ requiriendo un codebook ‘x’ y una particon ‘y’.

. 8.2 Investigar otros métodos de compresión de datos sin perdidas y

explicar su funcionamiento. Algunos métodos de compresión sin perdidas basados en la teoría de

shanon son:

- Método huffman (explicado anteriormente) - Codificación Aritmética - Lempel-ziv - RLE

La experiencia se realizo utilizando el método huffman .A continuación se describen rápidamente los otros dos métodos : Método Aritmético: El código aritmético is el método mas eficiente para codificar símbolos de acuerdo a su probabilidad de concurrencia. A diferencia del código Huffman el código aritmético ofrece una mejor compresión, pero su implementación es mas complicada que la del código Huffman. Desafortunadamente el uso de este código es restringido , no esta permitido usar este código sin antes adquirir una licencia .El código aritmético es parte del formato JPGE .

Método Lempel-ziv: El código lenmpel-ziv fue creado por Jacob Ziv y Abraham Lempel .Los algoritmos iniciales (originales) son LZ77 y LZ78 luego , se crearon otros algoritmos teniendo como base los dos anteriores. El código lempel-ziv es un algoritmo basado en un diccionario que direcciona secuencias de bytes desde contenidos anteriores en lugar de los datos original. En general solo existe un esquema de codificación, y todos los datos serán codificados de la misma forma.

Page 14: [Teocom2]Huffman

����������������� ��������������� Jorge Israel Ñique Tumbajulca

������������������������������������������������������������������������������������������������������������������������������������������������� � � � � � ���� � � ��� � � �� � ����� � ����

Run Length Encoding (RLE) RLE es un método antiguo , sus algoritmos tienen una implementación simple y es utilizado para la compresión de imágenes de un solo color. Cada secuencia de símbolos iguales es remplazada por un número que representa el numero de veces en que se repite el símbolo acompañado del símbolo q se esta repitiendo por ejemplo:

jjjjjjjj entonces tendremos 9j. Burrows-Wheeler-Transformation (BWT) Este método fue creado por Michael Burrows y David J. Wheeler .El grupo original de datos sera convertido en una secuencia optima que presentara símbolos que se repiten , por ejemplo: Dragon Culqui Cabezon Dubersillo full tennis frontón Entonces tendremos: �

����������������������������������������

��������� ������� ��������������

� Los símbolos anteriores , que ahora son idénticos pueden ser codificados por método Huffman o código aritmético. Además la cantidad de bits aumenta con relación a los obtenidos de la codificación de la secuencia anterior ya que es necesario mas bits para llegar a obtener los datos originales. � �

Page 15: [Teocom2]Huffman

����������������� ��������������� Jorge Israel Ñique Tumbajulca

������������������������������������������������������������������������������������������������������������������������������������������������� � � � � � ���� � � ��� � � �� � ����� � ����

8.3 Comentar el método de compresión de Lempel-Ziv y sus distintas variantes.

Básicamente busca secuencias repetidas dentro de los datos, y cada vez que encuentra una de ellas la reemplaza por un puntero a la zona en la que comienza la primera secuencia, mas la longitud que se debe tomar a partir de esa posición. En caso de que no haya repeticiones, se emite la secuencia como un literal.

Ejemplo: abracadabra

La secuencia que se repite es abra

Las variantes de este código están basados en los dos originales los cuales son LZ77 y LZ78:

-Lempel-Ziv-Storer-Szymanski (LZSS) (Basado en LZ77) -Lempel-Ziv-Welch (LZW) (Basado en LZ78)

8.4 Averiguar que algoritmo emplean los programas de compresión como

el winRAN ,winZIP ,Gzip ,etc.

winRar: RZLL winZIP: LZ77 Gzip: Algoritmo Deflate= LZ77+Huffman; JPGE: Método diferencial

9. Conclusiones recomendaciones

-Se aprendieron nuevas instrucciones en matlab .. -Se llego a comprimir una señal aleatoria con código Huffman .

Page 16: [Teocom2]Huffman

����������������� ��������������� Jorge Israel Ñique Tumbajulca

������������������������������������������������������������������������������������������������������������������������������������������������� � � � � � ���� � � ��� � � �� � ����� � ����

-Se recomienda intentar realizar la compresión de una imagen por el método de Huffman .

10. Referencias

-Compresión Huffman (Informe)........................................Ing. Duber Pérez - Guía de usuario (simulink help) - http://es.wikipedia.org/wiki/Compresi%C3%B3n_de_datos - http://www.programacion.net/tutorial/gzip/4/ - http://www.binaryessence.com/dct/en000040.htm - http://coco.ccu.uniovi.es/immed/compresion/descripcion/fundamentos/fundamentos.htm