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. 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. 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. 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]