´
˜
DISENO Y PROGRAMACION DE UN CODEC
HUFFMAN
Cristian Aguirre Esparza
cbaguirre@utpl.edu.ec

Abstract—A medida que la nec...
un m´ todo para llevar esto a cabo en un tiempo lineal si las
e
probabilidades de los s´mbolos de entrada (tambi´ n conoci...
fid = fopen(“Mensaje.txt”); % abrir el archivo
cadena = fscanf(fid,“%c”); % archivo guardado matriz cadena

cadena %presenta...
codigo = “”;
while length(st)
codigo = [codigo st(1)];
st = st(2:end);
count = 1;
while st & (codigo(end) == st(1))
st = s...
Próxima SlideShare
Cargando en…5
×

Hpcs conf poster

279 visualizaciones

Publicado el

0 comentarios
0 recomendaciones
Estadísticas
Notas
  • Sé el primero en comentar

  • Sé el primero en recomendar esto

Sin descargas
Visualizaciones
Visualizaciones totales
279
En SlideShare
0
De insertados
0
Número de insertados
7
Acciones
Compartido
0
Descargas
12
Comentarios
0
Recomendaciones
0
Insertados 0
No insertados

No hay notas en la diapositiva.

Hpcs conf poster

  1. 1. ´ ˜ DISENO Y PROGRAMACION DE UN CODEC HUFFMAN Cristian Aguirre Esparza cbaguirre@utpl.edu.ec Abstract—A medida que la necesidad de los usuarios de enviar y recibir informaci´ n cada ves es mas extensa, surgio la necesidad o de comprimir dicha informaci´ n de tal manera que esta sea o 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 disenar y programar un c´ digo HUFFMAN ya sea o para audio, video o texto, y utilizando otro c´ digo sin perdidas o comprobar el funcionamiento del c´ digo HUFFMAN. En nuestro o caso hemos elejido texto, ya que consideramos que de los tres campos, con texto se nos facilitaria ver y entender la operaci´ n y o el funcionamiento del c´ digo, que es el objetivo de esta pr´ ctica. o a Keywords—Comprensi´ n, matlab, texto, huffman, RLZ. o ´ I. INTRODUCCION E N ciencias de la computaci´ n y teor´a de la informaci´ n, o ı o la codificaci´ n Huffman es un algoritmo usado para o compresi´ n de datos. El t´ rmino se refiere al uso de una tabla o e de c´ digos de longitud variable para codificar un determinado o s´mbolo (como puede ser un caracter en un archivo), donde la ı tabla ha sido rellenada de una manera espec´fica bas´ ndose en ı a la probabilidad estimada de aparici´ n de cada posible valor o 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´ n o de cada s´mbolo, y su eficiencia depende de lo pr´ ximas ı o a las frecuencias reales que sean las estimadas. Algunas implementaciones del algoritmo de Huffman son adaptativas, actualizando las frecuencias de cada s´mbolo conforme ı recorre el texto. [1] II. OBJETIVOS 1) 2) 3) 4) Dise˜ ar un codec Huffman en base a la teor´a revisada. n ı Programar el codec Huffman. Realizar pruebas de funcionamiento del codec. Validar el codec Huffman (comparar con otro codec de compresi´ n con/sin p´ rdidas). o e ´ III. MARCO TEORICO ´ A. COMPRESION DE DATOS (TEXTO) La compresi´ n es un caso particular de la codificaci´ n, o o cuya caracter´stica principal es que el c´ digo resultante tiene ı o menor tama˜ o que el original. En otras palabras la compresi´ n n o de datos es la reducci´ n del volumen de datos tratables o para representar una determinada informaci´ n empleando una o menor cantidad de espacio. La compresi´ n se basa fundao mentalmente en buscar repeticiones en series de datos para despu´ s almacenar solo el dato junto al n´ mero de veces que se e u 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´ s complejo, ya que a raramente se consigue encontrar patrones de repetici´ n tan o exactos (salvo en algunas im´ genes). Se utilizan algoritmos a de compresi´ n. o Por un lado, algunos buscan series largas que luego codifican en formas m´ s breves, por otro lado, algunos algoritmos, a como el algoritmo de Huffman que es el que se utilizara en esta pr´ ctica, examinan los caracteres m´ s repetidos para a a luego codificar de forma m´ s corta los que m´ s se repiten. a a 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´ n RLE o Run-length o encoding es una forma muy simple de compresi´ n de datos en o la que secuencias de datos con el mismo valor consecutivas son almacenadas como un unico valor m´ s su recuento. ´ a ´ ´ B. TECNICA DE CODIFICACION HUFFMAN La codificaci´ n Huffman usa un m´ todo espec´fico para o e ı elegir la representaci´ n de cada s´mbolo, que da lugar a un o ı c´ digo prefijo (es decir, la cadena de bits que representa a o un s´mbolo en particular nunca es prefijo de la cadena de ı bits de un s´mbolo distinto) que representa los caracteres m´ s ı a comunes usando las cadenas de bits m´ s cortas, y viceversa. a e o a Huffman fue capaz de dise¨¿ 1 ar el m´ todo de compresi´ n m´ s ı 2 eficiente de este tipo: ninguna representaci´ n alternativa de un o conjunto de s´mbolos de entrada produce una salida media m´ s ı a peque˜ a cuando las frecuencias de los s´mbolos coinciden con n ı las usadas para crear el c´ digo. Posteriormente se encontr´ o o
  2. 2. un m´ todo para llevar esto a cabo en un tiempo lineal si las e probabilidades de los s´mbolos de entrada (tambi´ n conocidas ı e como “pesos”) est´ n ordenadas. El codificador Huffman crea a una estructura arb´ rea ordenada con todos los s´mbolos y o ı la frecuencia con que aparecen. Las ramas se construyen en forma recursiva comenzando con los s´mbolos menos ı frecuentes. Para un grupo de s´mbolos con una distribuci´ n de probaı o bilidad uniforme y un n´ mero de miembros que es potencia de u dos, la codificaci´ n Huffman es equivalente a una codificaci´ n o o en bloque binaria, por ejemplo, la codificaci´ n ASCII. La o codificaci´ n Huffman es un m´ todo para crear c´ digos prefijo o e o tan extendido que el t´ rmino “codificaci´ n Huffman” es ame o pliamente usado como sin´ nimo de “c´ digo prefijo”, incluso o o cuando dicho c´ digo no se ha producido con el algoritmo de o Huffman. Aunque la codificaci´ n de Huffman es optima para una o ´ codificaci´ n s´mbolo a s´mbolo dada una distribuci´ n de o ı ı o probabilidad, su optimalidad a veces puede verse accidentalmente exagerada. Por ejemplo, la codificaci´ n aritm´ tica y la o e codificaci´ n LZW normalmente ofrecen mayor capacidad de o compresi´ n. Estos dos m´ todos pueden agrupar un n´ mero o e u arbitrario de s´mbolos para una codificaci´ n m´ s eficiente, y ı o a en general se adaptan a las estad´sticas de entrada reales. Este ı ultimo es util cuando las probabilidades no se conocen de ´ ´ forma precisa o var´an significativamente dentro del flujo de ı datos. ´ ´ C. TECNICA DE CODIFICACION RLE La compresi´ n RLE o Run-length encoding es una forma o 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´ s su recuento. Esto es m´ s util en datos que ´ a a ´ contienen muchas de estas “secuencias”; por ejemplo, gr´ ficos a sencillos con areas de color plano, como iconos y logotipos. ´ Por ejemplo, considera una pantalla que contiene texto en negro sobre un fondo blanco. Habr´a muchas secuencias de ı este tipo con p´xeles blancos en los m´ rgenes vac´os, y otras ı a ı secuencias de p´xeles negros en la zona del texto. Supongamos ı una ´nica l´nea (o scanline), con N representando las zonas en ı ı negro y B las de blanco: “BBBBBBBBBBBBNBBBBBBBBBBBBNNNBBBB BBBBBBBBBBBBBBBBBBBBNBBBBBBBBBBBBBB” Si aplicamos la codificaci´ n run-length a esta l´nea, obo ı tendr´amos lo siguiente: ı “12B1N12B3N24B1N14B” Interpretado esto como 12 letras B, 1 letra N , 12 letras B, 3 letras N, etc. El c´ digo run-length representa el original de o 67 caracteres en tan s´ lo 16. Esto quiere decir que la l´nea o ı original pesa 67 bytes y la cadena codificada pesa s´ lo 16 o bytes. ´ ˜ IV. DISENO Y PROGRAMACION DEL CODEC HUFFMAN Procedemos a realizar la compresi´ n, codificaci´ n y deo o codificaci´ n de un archivo de texto, que fue previamente o almacenado en la carpeta del programa para evitar errores. La realizaci´ n del c´ digo se lo lleva a cabo en el software o o Matlab, en donde programamos la compresi´ n y codificaci´ n o o en un scrip, con el fin de generar un resultado expl´cito del ı comportamiento del sistema. A. Etapa de almacenamiento Primeramente el mensaje a codificar se lo almacena en un .txt con nombre mensaje.txt de manera que el usuario unicamente debera ingresar en este su mensaje a codificar y el programa accede a este txt para su codificaci´ n. o B. Etapa de asignaci´ n o El programa luego de ingresar al archivo txt procede a “asignar” a cada letra su respectivo c´ digo “ASCII” y lo o almacena en un string de tal manera que se nos facilite trabajar con n´ meros que representara cada letra. u C. Etapa de verificaci´ n o En esta etapa lo que realizamos es la comprobaci´ n de o cada caracter, de tal manera que vayamos almacenando el numero de veces que se repite cada caracter y de esta manera obtener la probabilidad del mismo, de esta manera sabremos la ocurrencia de cada uno, todas estas probabilidad se van almacenando en otro nuevo string. D. Etapa de compresi´ n o Hay dos funciones importantes que se encuentran incluidas en Matlab, hablamos de la funci´ n ¡huffmamndict¿ que nos o permite crear el diccionario d´ nde la primera columna de listas o del dict son los valores de los s´mbolos y la segunda columna ı corresponde a las palabras c´ digo de cada s´mbolo. La funci´ n o ı o del huffmandict genera un c´ digo diccionario Huffman que o corresponde a una fuente con un modelo de probabilidad conocido. Las entradas requeridas son los s´mbolos, que ı corresponde a los distintos valores se˜ alados que el mensaje n produce. Y tenemos tambien la funci´ n ¡huffmanenco¿, la o que nos permite codificar el mensaje con el diccionario anteriormente obtenido , y la funci´ n ¡huffmandeco¿ la que o nos permite decodificar el mensaje para asi comprobar con el mesanje asignado en un principio. E. C´ digo en la herramienta MATLAB o %PRACTICA HUFFMAN CODE clc clear all % LEER ARCHIVO k=1;
  3. 3. fid = fopen(“Mensaje.txt”); % abrir el archivo cadena = fscanf(fid,“%c”); % archivo guardado matriz cadena cadena %presenta el mensaje a codificar mensaje=double(cadena) %Presenta el mensaje en codigo ASCII aux=b(j); b(j)=b(j+1); b(j+1)=aux; aux=c(j); c(j)=c(j+1); c(j+1)=aux; end end end for i=32:255 %225 caracteres ASCII datos=char(i); %char convierte el numero ASCCI a caracter total=length(strfind(cadena,datos)); % formando una matriz con la posicion donde % fue encontrado, leghth calcula el tama¨¿ 2 o de la matriz ı 1 for i=1:n fprintf (’%c ⁀ c(i)) ’, fprintf (’%f , b(i)) i=i+1; end x=length(cadena); probabilidad=total/length(cadena); % probablidad if(total = 0) % s¨¿ 1 el total a sido diferente de cero (X,1) ı 2 bi=fliplr(b); nh=n ; for i=1:nh-1 ph=bi(i)+bi(i+1); end fprintf(’MENSAJE A CODIFICAR”); fprintf(’salto de linea’); L(k) = datos; % Almacena el mensaje n=length(L); V(k) = total; % Almacena las veces que se repite la letra en el texto P(k) = probabilidad; % Almacena las probabilidades de cada letra X(k) = cellstr(datos); %fprintf (“%c ⁀’’, datos) % fprintf (“%f ”,probabilidad) ⁀ fprintf(“Caracter: %c aparece :%d veces ”,datos,total); ⁀ ”,probabilidad); %fprintf(“con probabilidad%f k=k+1; end end del texto de: %d caracfprintf(“Tama¨¿ 2 o ı 1 teres”,length(cadena));%tama¨¿ 2 o total del txt ı 1 fprintf(“salto de linea”); % ORDENAR DE MAYOR A MENOR 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:n for j=1:n-i if b(j) < b(j+1) matriz=[]; for i=1:n matriz =[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 diccionario fprintf(“MENSAJE CODIFICADO”) hcode =huffmanenco (mensaje,dict) %Codifica el mensaje dhsig = huffmandeco(hcode,dict) %Decodifica el mensaje fprintf(“MENSAJE DECODIFICADO”) mensajedeco = char(dhsig) tamano1=(length(cadena))*8 tamano2=length(hcode) fprintf(“Tama¨¿ 2 o del archivo original: %d bits” ,tamano1) ı 1 fprintf(“Tama¨¿ 2 o del archivo comprimido: %d bits”,tamano2) ı 1 F. C´ digo de comparaci´ n en la herramienta MATLAB o o %CODIGO RLE clc; clear; st = “AABCDEABCDFGHTREFTFFDVD”
  4. 4. 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; end codigo = [codigo num2str(count)]; end Ncod=length(codigo) Nor=length(st) Tcrun=(Ncod/Nor)*100; codigo VI. CONCLUSIONES 1) Se pudo observar y entender mas a fondo el procedimiento de la codificaci´ n Huffman. o 2) Se logr´ crear un algoritmo pr´ pio basado en la codifio o caci´ n Huffman con la ayuda de la herramienta matlab. o 3) Se realiz´ multiples pruebas de funcionamiento del codec o para verificar su validad. 4) Se valido el codec Huffman comparando el tama˜ o de n los archivos tanto el original como el comprimido. 5) Se valido el codec Huffman comparandolo con el c´ digo o RLE 6) La compresi´ Huffman en matlab es sumamente compleja o por lo que ayudarse en las funciones propias de matlab facilito mucho la tarea. 7) Al decodificar tanto utilizando Huffman como RLE se pudo obtener el mensaje original sin error alguno, por lo que se comprob´ tambien la codificaci´ n sin p´ rdidas. o o e ´ V. VALIDACION Para la validaci´ n se procedio a comprimir un determinado o texto para luego comprobar el tama˜ o en bits del mensaje n original con el mensaje codificado en Huffman y a su ves con el c´ digo RLE y de esta manera determinar que codificaci´ n o o ser´a la mas adecuada y la mas eficiente. ı La relaci´ n de compresion se define por el cociente entre o el tama˜ o original del archivo que queremos comprimir y el n tama˜ o del archivo comprimido. n RC = To Tc (1) El texto a comprimir tiene un tama˜ o de 3416 bits. El n texto comprimido con Huffman tiene un tama˜ o de 1975 bits. n El texto comprimido con RLE tiene un tama˜ o de 6784 bits. n HUFFMAN 3416 1975 RC = 1.73 : 1 RC = RLE RC = 3416 6784 VII. RECOMENDACIONES 1) En la programaci´ n se debe tener mucho cuidado en la o asignaci´ n del codigo Huffman ya que se es propenso a o cometer errores en esta etapa. 2) Tener clara la idea sobre la codificaci´ n Huffman de esta o manera sabemos hacia donde deseamos llegar con nuestro algoritmo. 3) Tener cuidado en el momento que se asigna la probabilidad a cada caracter. 4) Si es posible utilizar las funciones propias de matlab, utilizarlas facilitan en mucho el trabajo. 1) (2) 2) (3) 3) RC = 0.503 : 1 4) Podemos observar que la t´ cnica de codificaci´ n Huffman e o tiene una relaci´ n de compresi´ n mayor a la codificaci´ n o o o RLE, demas de esto comparando el tama˜ o de cada t´ cnica n e de codificaci´ n, se puede observar claramente que la t´ cnica o e Huffman es la mas eficiente. As´ mismo obtenemos el factor ı de compresi´ n del c´ digo Huffman. o o 1 RC ∗ 100% 1 FC = 1.73 ∗ 100% F C = 59% FC = (4) 5) VIII. REFERENCIAS ´ CODIFICACION “Codificaci´ n o Huffman con Matlab”, Disponible en linea en: [http://www.buenastareas.com/ensayos/Simulaci%C3%B3nEn-Matlab-De-Codificacion-De/3052631.html], consultado el [10-11-2013] MATLAB CENTRAL “Ascii to binary”, Disponible en: [http://www.mathworks.com/matlabcentral/answers/7245],consultado el [10-11-2013]. ´ KIOSKEA “La compresiOn de datos”, Disponible en:[http://es.kioskea.net/contents/714-la-compresion-dedatos], consultado el [10-11-2013]. ´ KIOSKEA “La compresiOn RLE”, Disponible en [http://es.kioskea.net/contents/713-la-compresion-rle], consultado el [11-11-2013] SLIDESAHRE, “C´ digos de Huffman” Disponible en o [http://www.slideshare.net/gugaslide/codigo-de-huffmanpresentation], consultado el [11-11-2013]

×