hpcs conf poster

4
DISE ˜ NO Y PROGRAMACI ´ ON DE UN CODEC HUFFMAN Cristian Aguirre Esparza [email protected] Abstract—A medida que la necesidad de los usuarios de enviar y recibir informaci´ on cada ves es mas extensa, surgio la necesidad de comprimir dicha informaci´ on de tal manera que esta sea posible enviarla y recibirla sin ocasionar perdidas pero a su ves en un numero menor de datos, de esta manera facilitar en mucho las comunicaciones. En base a esto la practica a desarrollarse, es el de dise˜ nar y programar un c´ odigo HUFFMAN ya sea para audio, video o texto, y utilizando otro c´ odigo sin perdidas comprobar el funcionamiento del c´ odigo HUFFMAN. En nuestro caso hemos elejido texto, ya que consideramos que de los tres campos, con texto se nos facilitaria ver y entender la operaci´ on y el funcionamiento del c´ odigo, que es el objetivo de esta pr´ actica. Keywords—Comprensi´ on, matlab, texto, huffman, RLZ. I. INTRODUCCI ´ ON E N ciencias de la computaci´ on y teor´ ıa de la informaci´ on, la codificaci´ on Huffman es un algoritmo usado para compresi´ on de datos. El t´ ermino se refiere al uso de una tabla de c´ odigos de longitud variable para codificar un determinado ımbolo (como puede ser un caracter en un archivo), donde la tabla ha sido rellenada de una manera espec´ ıfica bas´ andose en la probabilidad estimada de aparici´ on de cada posible valor de dicho s´ ımbolo. Fue desarrollado por David A. Huffman mientras era estudiante de doctorado en el MIT, y publicado en “A Method for the Construction of Minimum-Redundancy Codes”. Para poder utilizar el algoritmo de Huffman es necesario conocer de antemano las frecuencias de aparici´ on de cada s´ ımbolo, y su eficiencia depende de lo pr´ oximas a las frecuencias reales que sean las estimadas. Algunas implementaciones del algoritmo de Huffman son adaptativas, actualizando las frecuencias de cada ımbolo conforme recorre el texto. [1] II. OBJETIVOS 1) Dise˜ nar un codec Huffman en base a la teor´ ıa revisada. 2) Programar el codec Huffman. 3) Realizar pruebas de funcionamiento del codec. 4) Validar el codec Huffman (comparar con otro codec de compresi´ on con/sin p´ erdidas). III. MARCO TE ´ ORICO A. COMPRESI ´ ON DE DATOS (TEXTO) La compresi´ on es un caso particular de la codificaci´ on, cuya caracter´ ıstica principal es que el c´ odigo resultante tiene menor tama˜ no que el original. En otras palabras la compresi´ on de datos es la reducci´ on del volumen de datos tratables para representar una determinada informaci´ on empleando una menor cantidad de espacio. La compresi´ on se basa funda- mentalmente en buscar repeticiones en series de datos para despu´ es almacenar solo el dato junto al n ´ umero de veces que se repite. As´ ı, por ejemplo, si en un fichero aparece una secuencia como “AAAAAA”, ocupando 6 bytes se podr´ ıa almacenar simplemente ”6A” que ocupa solo 2 bytes. En realidad, el proceso es mucho m´ as complejo, ya que raramente se consigue encontrar patrones de repetici´ on tan exactos (salvo en algunas im´ agenes). Se utilizan algoritmos de compresi´ on. Por un lado, algunos buscan series largas que luego codifi- can en formas m´ as breves, por otro lado, algunos algoritmos, como el algoritmo de Huffman que es el que se utilizara en esta pr´ actica, examinan los caracteres m´ as repetidos para luego codificar de forma m´ as corta los que m´ as se repiten. Otros, como el LZW, construyen un diccionario con los patrones encontrados, a los cuales se hace referencia de manera posterior, y por ultimo, la compresi´ on RLE o Run-length encoding es una forma muy simple de compresi´ on de datos en la que secuencias de datos con el mismo valor consecutivas son almacenadas como un ´ unico valor m´ as su recuento. B. T ´ ECNICA DE CODIFICACI ´ ON HUFFMAN La codificaci´ on Huffman usa un m´ etodo espec´ ıfico para elegir la representaci´ on de cada s´ ımbolo, que da lugar a un odigo prefijo (es decir, la cadena de bits que representa a un s´ ımbolo en particular nunca es prefijo de la cadena de bits de un s´ ımbolo distinto) que representa los caracteres m´ as comunes usando las cadenas de bits m´ as cortas, y viceversa. Huffman fue capaz de dise¨ ı¿ 1 2 ar el m´ etodo de compresi´ on m´ as eficiente de este tipo: ninguna representaci´ on alternativa de un conjunto de s´ ımbolos de entrada produce una salida media m´ as peque˜ na cuando las frecuencias de los s´ ımbolos coinciden con las usadas para crear el c´ odigo. Posteriormente se encontr´ o

Upload: cristian-aguirre

Post on 25-Jun-2015

116 views

Category:

Documents


6 download

TRANSCRIPT

Page 1: Hpcs conf poster

DISENO Y PROGRAMACION DE UN CODECHUFFMANCristian Aguirre [email protected]

Abstract—A medida que la necesidad de los usuarios de enviary recibir informaci on cada ves es mas extensa, surgio la necesidadde comprimir dicha informaci on de tal manera que esta seaposible enviarla y recibirla sin ocasionar perdidas pero a su vesen un numero menor de datos, de esta manera facilitar en mucholas comunicaciones. En base a esto la practica a desarrollarse,es el de disenar y programar un codigo HUFFMAN ya seapara audio, video o texto, y utilizando otro codigo sin perdidascomprobar el funcionamiento del codigo HUFFMAN. En nuestrocaso hemos elejido texto, ya que consideramos que de los trescampos, con texto se nos facilitaria ver y entender la operacion yel funcionamiento del codigo, que es el objetivo de esta practica.

Keywords—Comprension, matlab, texto, huffman, RLZ.

I. INTRODUCCI ON

EN ciencias de la computacion y teorıa de la informacion,la codificacion Huffman es un algoritmo usado para

compresion de datos. El termino se refiere al uso de una tablade codigos de longitud variable para codificar un determinadosımbolo (como puede ser un caracter en un archivo), donde latabla ha sido rellenada de una manera especıfica basandoseenla probabilidad estimada de aparicion de cada posible valorde dicho sımbolo. Fue desarrollado por David A. Huffmanmientras era estudiante de doctorado en el MIT, y publicadoen “A Method for the Construction of Minimum-RedundancyCodes”. Para poder utilizar el algoritmo de Huffman esnecesario conocer de antemano las frecuencias de aparicionde cada sımbolo, y su eficiencia depende de lo proximasa las frecuencias reales que sean las estimadas. Algunasimplementaciones del algoritmo de Huffman son adaptativas,actualizando las frecuencias de cada sımbolo conformerecorre el texto. [1]

II. OBJETIVOS

1) Disenar un codec Huffman en base a la teorıa revisada.2) Programar el codec Huffman.3) Realizar pruebas de funcionamiento del codec.4) Validar el codec Huffman (comparar con otro codec de

compresion con/sin perdidas).

III. MARCO TE ORICO

A. COMPRESION DE DATOS (TEXTO)

La compresion es un caso particular de la codificacion,cuya caracterıstica principal es que el codigo resultante tienemenor tamano que el original. En otras palabras la compresionde datos es la reduccion del volumen de datos tratablespara representar una determinada informacion empleando unamenor cantidad de espacio. La compresion se basa funda-mentalmente en buscar repeticiones en series de datos paradespues almacenar solo el dato junto al numero de veces queserepite. Ası, por ejemplo, si en un fichero aparece una secuenciacomo “AAAAAA”, ocupando 6 bytes se podrıa almacenarsimplemente ”6A” que ocupa solo 2 bytes.

En realidad, el proceso es mucho mas complejo, ya queraramente se consigue encontrar patrones de repeticion tanexactos (salvo en algunas imagenes). Se utilizan algoritmosde compresion.

Por un lado, algunos buscan series largas que luego codifi-can en formas mas breves, por otro lado, algunos algoritmos,como el algoritmo de Huffman que es el que se utilizaraen esta practica, examinan los caracteres mas repetidos paraluego codificar de forma mas corta los que mas se repiten.Otros, como el LZW, construyen un diccionario con lospatrones encontrados, a los cuales se hace referencia de maneraposterior, y por ultimo, la compresion RLE o Run-lengthencoding es una forma muy simple de compresion de datos enla que secuencias de datos con el mismo valor consecutivasson almacenadas como un unico valor mas su recuento.

B. TECNICA DE CODIFICACI ON HUFFMAN

La codificacion Huffman usa un metodo especıfico paraelegir la representacion de cada sımbolo, que da lugar a uncodigo prefijo (es decir, la cadena de bits que representa aun sımbolo en particular nunca es prefijo de la cadena debits de un sımbolo distinto) que representa los caracteresmascomunes usando las cadenas de bits mas cortas, y viceversa.Huffman fue capaz de diseı¿1

2ar el metodo de compresion mas

eficiente de este tipo: ninguna representacion alternativa de unconjunto de sımbolos de entrada produce una salida media m´aspequena cuando las frecuencias de los sımbolos coincidenconlas usadas para crear el codigo. Posteriormente se encontro

Page 2: Hpcs conf poster

un metodo para llevar esto a cabo en un tiempo lineal si lasprobabilidades de los sımbolos de entrada (tambien conocidascomo “pesos”) estan ordenadas. El codificador Huffman creauna estructura arborea ordenada con todos los sımbolos yla frecuencia con que aparecen. Las ramas se construyenen forma recursiva comenzando con los sımbolos menosfrecuentes.

Para un grupo de sımbolos con una distribucion de proba-bilidad uniforme y un numero de miembros que es potencia dedos, la codificacion Huffman es equivalente a una codificacionen bloque binaria, por ejemplo, la codificacion ASCII. Lacodificacion Huffman es un metodo para crear codigos prefijotan extendido que el termino “codificacion Huffman” es am-pliamente usado como sinonimo de “codigo prefijo”, inclusocuando dicho codigo no se ha producido con el algoritmo deHuffman.

Aunque la codificacion de Huffman es optima para unacodificacion sımbolo a sımbolo dada una distribucion deprobabilidad, su optimalidad a veces puede verse accidental-mente exagerada. Por ejemplo, la codificacion aritmeticay lacodificacion LZW normalmente ofrecen mayor capacidad decompresion. Estos dos metodos pueden agrupar un numeroarbitrario de sımbolos para una codificacion mas eficiente, yen general se adaptan a las estadısticas de entrada reales.Esteultimo es util cuando las probabilidades no se conocen deforma precisa o varıan significativamente dentro del flujo dedatos.

C. TECNICA DE CODIFICACI ON RLE

La compresion RLE o Run-length encoding es una formamuy simple de compresi’on de datos en la que secuencias dedatos con el mismo valor consecutivas son almacenadas comoun unico valor mas su recuento. Esto es mas util en datos quecontienen muchas de estas “secuencias”; por ejemplo, graficossencillos con areas de color plano, como iconos y logotipos.

Por ejemplo, considera una pantalla que contiene texto ennegro sobre un fondo blanco. Habrıa muchas secuencias deeste tipo con pıxeles blancos en los margenes vacıos, y otrassecuencias de pıxeles negros en la zona del texto. Supongamosuna ınica lınea (o scanline), con N representando las zonas ennegro y B las de blanco:

“BBBBBBBBBBBBNBBBBBBBBBBBBNNNBBBBBBBBBBBBBBBBBBBBBBBBNBBBBBBBBBBBBBB”

Si aplicamos la codificacion run-length a esta lınea, ob-tendrıamos lo siguiente:

“12B1N12B3N24B1N14B”

Interpretado esto como 12 letras B, 1 letra N , 12 letras B,3 letras N, etc. El codigo run-length representa el original de67 caracteres en tan solo 16. Esto quiere decir que la lıneaoriginal pesa 67 bytes y la cadena codificada pesa solo 16bytes.

IV. DISENO Y PROGRAMACI ON DEL CODECHUFFMAN

Procedemos a realizar la compresion, codificacion y de-codificacion de un archivo de texto, que fue previamentealmacenado en la carpeta del programa para evitar errores.La realizacion del codigo se lo lleva a cabo en el softwareMatlab, en donde programamos la compresion y codificacionen un scrip, con el fin de generar un resultado explıcito delcomportamiento del sistema.

A. Etapa de almacenamiento

Primeramente el mensaje a codificar se lo almacena enun .txt con nombre mensaje.txt de manera que el usuariounicamente debera ingresar en este su mensaje a codificar yel programa accede a este txt para su codificacion.

B. Etapa de asignacion

El programa luego de ingresar al archivo txt procede a“asignar” a cada letra su respectivo codigo “ASCII” y loalmacena en un string de tal manera que se nos facilite trabajarcon numeros que representara cada letra.

C. Etapa de verificacion

En esta etapa lo que realizamos es la comprobacion decada caracter, de tal manera que vayamos almacenando elnumero de veces que se repite cada caracter y de esta maneraobtener la probabilidad del mismo, de esta manera sabremosla ocurrencia de cada uno, todas estas probabilidad se vanalmacenando en otro nuevo string.

D. Etapa de compresion

Hay dos funciones importantes que se encuentran incluidasen Matlab, hablamos de la funcion ¡huffmamndict¿ que nospermite crear el diccionario donde la primera columna de listasdel dict son los valores de los sımbolos y la segunda columnacorresponde a las palabras codigo de cada sımbolo. La funciondel huffmandict genera un codigo diccionario Huffman quecorresponde a una fuente con un modelo de probabilidadconocido. Las entradas requeridas son los sımbolos, quecorresponde a los distintos valores senalados que el mensajeproduce. Y tenemos tambien la funcion ¡huffmanenco¿, laque nos permite codificar el mensaje con el diccionarioanteriormente obtenido , y la funcion ¡huffmandeco¿ la quenos permite decodificar el mensaje para asi comprobar con elmesanje asignado en un principio.

E. Codigo en la herramienta MATLAB

%PRACTICA HUFFMAN CODEclcclear all% LEER ARCHIVOk=1;

Page 3: Hpcs conf poster

fid = fopen(“Mensaje.txt”); % abrir el archivocadena = fscanf(fid,“%c”); % archivo guardado matriz cadena

fprintf(’MENSAJE A CODIFICAR”);fprintf(’salto de linea’);

cadena %presenta el mensaje a codificarmensaje=double(cadena) %Presenta el mensaje en codigoASCII

for i=32:255 %225 caracteres ASCIIdatos=char(i); %char convierte el numero ASCCI a caractertotal=length(strfind(cadena,datos)); % formando una matrizcon la posicion donde% fue encontrado, leghth calcula el tamaı¿1

2o de la matriz

x=length(cadena);probabilidad=total/length(cadena); % probablidadif(total = 0) % sı¿1

2el total a sido diferente de cero (X,1)

L(k) = datos; % Almacena el mensajen=length(L);V(k) = total; % Almacena las veces que se repite la letra enel textoP(k) = probabilidad; % Almacena las probabilidades de cadaletraX(k) = cellstr(datos);

%fprintf (“%c ⁀’’, datos)% fprintf (“%f ”,probabilidad)fprintf(“Caracter: %c aparece :⁀%d veces ”,datos,total);%fprintf(“con probabilidad⁀%f ”,probabilidad);k=k+1;

endend

fprintf(“Tamaı¿12o del texto de: %d carac-

teres”,length(cadena));%tamaı¿1

2o total del txt

fprintf(“salto de linea”); % ORDENAR DE MAYOR AMENOR DEPENDIENDO SU PROBABILIDAD

b=P;c=L;

fprintf (“Simbolos de la fuente”)

simbolos = double(c)fprintf(“ ⁀FUENTE ORDENADA”);fprintf(“salto de linea”);

for i=1:nfor j=1:n-iif b(j) < b(j+1)

aux=b(j);b(j)=b(j+1);b(j+1)=aux;aux=c(j);c(j)=c(j+1);c(j+1)=aux;endendend

for i=1:nfprintf (’%c ⁀’, c(i))fprintf (’%f , b(i))i=i+1;end

bi=fliplr(b);nh=n ;for i=1:nh-1ph=bi(i)+bi(i+1);end

matriz=[];for i=1:nmatriz =[matriz, b(i)];i=i+1;end

while (length(matriz)¿2);suma = matriz(length(matriz)) + matriz(length(matriz) - 1) ;matriz( length(matriz) - 1 ) = suma;matriz( length(matriz) ) = [];matriz=sort(matriz, “descend”)end

fprintf(“DICCIONARIO”)dict = huffmandict(simbolos,b) %Asigna el diccionariofprintf(“MENSAJE CODIFICADO”)hcode =huffmanenco (mensaje,dict) %Codifica el mensajedhsig = huffmandeco(hcode,dict) %Decodifica el mensajefprintf(“MENSAJE DECODIFICADO”)mensajedeco = char(dhsig)

tamano1=(length(cadena))*8tamano2=length(hcode)fprintf(“Tamaı¿1

2o del archivo original: %d bits” ,tamano1)

fprintf(“Tamaı¿12o del archivo comprimido: %d bits”,tamano2)

F. Codigo de comparacion en la herramienta MATLAB

%CODIGO RLEclc;clear;st = “AABCDEABCDFGHTREFTFFDVD”

Page 4: Hpcs conf poster

codigo = “”;while length(st)codigo = [codigo st(1)];st = st(2:end);count = 1;while st & (codigo(end) == st(1))st = st(2:end);count = count + 1; endcodigo = [codigo num2str(count)];endNcod=length(codigo)Nor=length(st)Tcrun=(Ncod/Nor)*100;codigo

V. VALIDACI ON

Para la validacion se procedio a comprimir un determinadotexto para luego comprobar el tamano en bits del mensajeoriginal con el mensaje codificado en Huffman y a su ves conel codigo RLE y de esta manera determinar que codificacionserıa la mas adecuada y la mas eficiente.

La relacion de compresion se define por el cociente entreel tamano original del archivo que queremos comprimir y eltamano del archivo comprimido.

RC =To

T c(1)

El texto a comprimir tiene un tamano de 3416 bits. Eltexto comprimido con Huffman tiene un tamano de 1975 bits.El texto comprimido con RLE tiene un tamano de 6784 bits.

HUFFMANRC =

3416

1975(2)

RC = 1.73 : 1

RLERC =

3416

6784(3)

RC = 0.503 : 1

Podemos observar que la tecnica de codificacion Huffmantiene una relacion de compresion mayor a la codificacionRLE, demas de esto comparando el tamano de cada tecnicade codificacion, se puede observar claramente que la tecnicaHuffman es la mas eficiente. Ası mismo obtenemos el factorde compresion del codigo Huffman.

FC =1

RC ∗ 100%(4)

FC =1

1.73 ∗ 100%

FC = 59%

VI. CONCLUSIONES

1) Se pudo observar y entender mas a fondo el proced-imiento de la codificacion Huffman.

2) Se logro crear un algoritmo propio basado en la codifi-cacion Huffman con la ayuda de la herramienta matlab.

3) Se realizo multiples pruebas de funcionamiento del codecpara verificar su validad.

4) Se valido el codec Huffman comparando el tamano delos archivos tanto el original como el comprimido.

5) Se valido el codec Huffman comparandolo con el codigoRLE

6) La compresio Huffman en matlab es sumamente complejapor lo que ayudarse en las funciones propias de matlabfacilito mucho la tarea.

7) Al decodificar tanto utilizando Huffman como RLE sepudo obtener el mensaje original sin error alguno, por loque se comprobo tambien la codificacion sin perdidas.

VII. RECOMENDACIONES

1) En la programacion se debe tener mucho cuidado en laasignacion del codigo Huffman ya que se es propenso acometer errores en esta etapa.

2) Tener clara la idea sobre la codificacion Huffman de estamanera sabemos hacia donde deseamos llegar con nuestroalgoritmo.

3) Tener cuidado en el momento que se asigna la probabil-idad a cada caracter.

4) Si es posible utilizar las funciones propias de matlab,utilizarlas facilitan en mucho el trabajo.

VIII. REFERENCIAS

1) CODIFICACION “Codificacion Huffmancon Matlab”, Disponible en linea en:[http://www.buenastareas.com/ensayos/Simulaci%C3%B3n-En-Matlab-De-Codificacion-De/3052631.html],consultado el [10-11-2013]

2) MATLAB CENTRAL “Ascii to binary”, Disponible en:[http://www.mathworks.com/matlabcentral/answers/7245],consultadoel [10-11-2013].

3) KIOSKEA “La compresiOn de datos”, Disponibleen:[http://es.kioskea.net/contents/714-la-compresion-de-datos], consultado el [10-11-2013].

4) KIOSKEA “La compresiOn RLE”, Disponible en[http://es.kioskea.net/contents/713-la-compresion-rle],consultado el [11-11-2013]

5) SLIDESAHRE, “Codigos de Huffman” Disponible en[http://www.slideshare.net/gugaslide/codigo-de-huffman-presentation], consultado el [11-11-2013]