Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Implementacion Del Lempel Ziv en Matlab PDF
Implementacion Del Lempel Ziv en Matlab PDF
1
Porque este paquete computacional presenta varias ventajas que se describen
brevemente a continuación.
A continuación se detallará los pasos para hacer uso de Lempel Ziv en Matlab:
2
4.) Clic en el nombre de archivo: Lempelziv, Tipo MATLAB M-file (debido a que
este contiene toda la informacion del algoritmo).
5.) Una vez que nos encontramos en el archivo ‘‘.m’’, se prosigue a hacer correr el
programa, dando clic en el botón Run.
3
8.) A continuacion se aplasta el botón: Binario, el mismo que transformará a
lenguaje binario el texto ingresado, posteriormente eso se visualizará en la
parte posterior de la gráfica, ya que ese será el cuadro que se procederá a
comprimir con Lempel Ziv.
Secuencia Comprimida
Radio de Descompresión
4
Se observa que el programa también muestra el radio de compresión:
Secuencia
Descomprimida
Limpiar
12.) Si se desea ingresar un nuevo texto se hace clic en el botón Limpiar y este
borrará todo el historial existente en los cuadros de texto, luego se procede a
realizar los pasos anteriores.
5
DIAGRAMA DE FLUJO DEL ALGORITMO DE LEMPEL ZIV
COMPRESOR:
INICIO
ingr=get(handles.edit1,'string');
ta=size(ingr);
ingr=''
tline = fgetl(fid);
SI NO
~ischar(tline
)
i=1:length(tline) fclose(fid);
set(handles.edit1,'String',ingr)
ingr=cat(2,ingr,dec2bin(tline(i)));
Texto en binario
ingr=get(handles.edit1,'string');
ta=size(ingr);
buf=[num2str(0) num2str(0) num2str(0) num2str(0) num2str(0) num2str(0)
num2str(0) num2str(0) num2str(0) ingr(1) ingr(2) ingr(3) ingr(4) ingr(5)
ingr(6) ingr(7) ingr(8) ingr(9)];
a=0;
c=0;
x=c/ta(2);
t=0;
cod=[];
h=waitbar(0,'Comprimiendo...');
l=1
SI NO
c<ta(2)
6
l=1; proc=[];
sproc=[];
n=1;
NO
SI
l<=9
n<9
bufpr(l)=buf(9+l);
l=l+1; FIN
proc=[proc buf(9+n)];
sproc=[sproc buf(n)];
k=0;
while (n+k)<=18
d=1;
while (d+k)<=(n+k)
sproc(d)=buf(d+k);
d=d+1;
end
if sproc==proc;
if (k+1)>=9
else
if t==0
codtemp=[num2str(k)
num2str(n) bufpr(n+1)];
k=18;
a=a+1;
else
codtemp=[num2str(k)
num2str(n-1) bufpr(n)];
k=18;
a=a+1;
end
end
end
k=k+1;
end
n=n+1;
end
if a==0
codtemp=[num2str(8)
num2str(0) bufpr(1)];
end
7
cod=[cod codtemp];
a=0;
b=1;
b<=18
if b<=(17-
(str2num(codtemp(2)))) FIN
buf(b)=buf(b+(str2num(codte
mp(2))+1));
else
if (b-9+c)<=ta(2)
buf(b)=ingr(b-9+c);
else
buf(b)='~';
t=1;
end
end
b=b+1;
end
8
DESCOMPRESOR:
INICIO
cod=get(handles.edit2,'string');
ta=size(cod);
buf=[num2str(0) num2str(0) num2str(0)
num2str(0) num2str(0) num2str(0) num2str(0)
num2str(0) num2str(0)];
c=0;
deco=[];
x=c/ta(2);
h=waitbar(0,'Descomprimiendo...');
SI NO
(c+3)<=ta(2)
SI NO
k<(str2num(copro(2))
)
a=str2num(copro(1))+1; d=1;
b=buf(a);
d=1;
SI NO
d<9
buf(9)=b;
buf(d)=buf(d+1);
k=k+1;
d=d+1;
9
d<9
buf(d)=buf(d+1); buf(9)=copro(3);
d=d+1; t=9-
(str2num(copro(2))+1);
d=1;
decotemp=buf(t+1);
decotemp(d)=buf(t+1);
t<9
decotemp(d)=buf(t+1); c=c+3;
d=d+1; x=c/ta(2);
t=t+1; waitbar(x)
deco=[deco decotemp];
x=1;
waitbar(x,h,'Completado')
close(h)
l=size(deco);
por=(ta(2)/l(2))*100;
set(handles.edit4,'string',deco)
set(handles.text4,'Visible','on')
set(handles.edit3,'string',por)
axes1=patch([0 1 1 0],[100 100 0 0],[0.5 0.5
0.5]);
axes1=patch([0 1 1 0],[por por 0 0],'g');
axis([0, 1, 0, 100])
axis off
FIN
10
Con sus respectivos comentarios
if nargout
[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
gui_mainfcn(gui_State, varargin{:});
end
11
%C EvIta que se muestren los ejes del axis.
axis off
axes1=patch([0 1 1 0],[100 100 0 0],[0.5 0.5 0.5]);
% --- Outputs from this function are returned to the command line.
function varargout = Lempelziv_OutputFcn(hObject, eventdata, handles)
% varargout cell array for returning output args (see VARARGOUT);
% hObject handle to figure
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
12
% --- Executes on button press in pushbutton1.
function pushbutton1_Callback(hObject, eventdata, handles)
try
ingr=get(handles.edit1,'string');
ta=size(ingr);
buf=[num2str(0) num2str(0) num2str(0) num2str(0) num2str(0) num2str(0)
num2str(0) num2str(0) num2str(0) ingr(1) ingr(2) ingr(3) ingr(4) ingr(5)
ingr(6) ingr(7) ingr(8) ingr(9)];
a=0;
c=0;
x=c/ta(2);
t=0;
cod=[];
h=waitbar(0,'Comprimiendo...');
% Inicio del proceso de compresion, se realiza hasta que se haya procesado
todo lo ingresado.
while c<ta(2)
% Separa en un vector la sección sin procesar del bufer.
l=1;
while l<=9
bufpr(l)=buf(9+l);
l=l+1;
end
% ---------------------------------------.
% Declaracion de las variables a usarse en los proximos ciclos
% (enceración).
proc=[];
sproc=[];
n=1;
while n<9
proc=[proc buf(9+n)];
sproc=[sproc buf(n)];
k=0;
while (n+k)<=18
% aquí se modifica el vector que se comparará con el de la sección
% a procesar, se forma automáticamente dicho vector dependiendo de
% la posición de inicio y del tamaño del mismo, lo que permite
% buscar repeticiones de cualquier longitud hasta 8 en cualquier
% parte del bufer, ya que con k se va realizando el desplazamiento.
d=1;
while (d+k)<=(n+k)
sproc(d)=buf(d+k);
d=d+1;
end
13
% aquí se realiza la verificación de repeticiones, comparando los
% vectores del mismo tamaño procesado y sin procesar, el ultimo
% siendo un vector fijo desde la posición 9 y el otro móvil a
% traves de todo el bufer hasta la posición 9, puesto que si va mas
% allá en la sección sin procesar habra fallos en la descompresión.
if sproc==proc;
% la estructura que tiene (comparación de algo de lo cual lo que
% vale es el caso contrario) es resultado de un intento de lograr
% el objetivo del programa de un efoque previo diferente del cual
% se recicló esta sección modificandola lo menos posible.
% este if verifica que la posición del vector movil no esté dentro
% de la sección sin procesar
if (k+1)>=9
else
% este if evita que si la longitud de la secuencia ingresada no
% coincide exactamente con los desplazamientos progresivos de
% la misma en el bufer provoque que los últimos espacios se
% llenen con ceros alterando el código generado.
if t==0
codtemp=[num2str(k) num2str(n) bufpr(n+1)];
k=18;
a=a+1;
else
% en el caso que la rescuencia restante ingresada no
% complete el bufer se genera un código específico basado
% en alteraciones provocadas mas abajo que garantizan que
% sea correcto.
k=18;
% variable acumuladora que permitirá detectar si ha habido
% coincidencias en la generación de código, para que si no es así
% se genere un código específico para dicho caso.
a=a+1;
end
end
end
k=k+1;
end
n=n+1;
end
% aqui se genera el codigo (80(contenido de la posición 9 del bufer)) que
% sería el correcto en el caso que no haya habido una sola coincidencia.
if a==0
codtemp=[num2str(8) num2str(0) bufpr(1)];
end
% se acumula el codigo tempporal(de cada ves que se pocesa
% el bufer).
cod=[cod codtemp];
a=0;
b=1;
t=0;
% modificación del estado de la barra de progreso
waitbar(x)
% acumulador que permite saber cuántos caracteres se han procesado
c=c+(str2num(codtemp(2))+1);
14
x=c/ta(2);
% desplazador de la secuencia ingresada a traves ddel bufer dependiendo del
% código generado en la últim configuracion del bufer.
while b<=18
if b<=(17-(str2num(codtemp(2))))
buf(b)=buf(b+(str2num(codtemp(2))+1));
else
if (b-9+c)<=ta(2)
buf(b)=ingr(b-9+c);
else
% en el caso que la longitud restante sea insuficiente se rellena
% con ~ evitando llenado automatico de ceros que provoca un codigo
% erroneo.
buf(b)='~';
% la variable que detecta este estado cambia para permitir realizar
% los procesos pertinentes.
t=1;
end
end
b=b+1;
end
end
x=1;
waitbar(x,h,'Completado')
close(h)
set(handles.edit2,'string',cod)
y=size(cod);
por=(y(2)/ta(2))*100;
set(handles.text4,'Visible','on')
set(handles.edit3,'string',por)
axes1=patch([0 1 1 0],[100 100 0 0],[0.5 0.5 0.5]);
axes1=patch([0 1 1 0],[por por 0 0],'g');
axis([0, 1, 0, 100]);
axis off
catch
cod=get(handles.edit2,'string');
ta=size(cod);
buf=[num2str(0) num2str(0) num2str(0) num2str(0) num2str(0) num2str(0)
num2str(0) num2str(0) num2str(0)];
c=0;
deco=[];
15
x=c/ta(2);
h=waitbar(0,'Descomprimiendo...');
% --- Descompresor.
% controla que se procese el código de 3 en 3 hasta que se procese todo el
% codigo.
while (c+3)<=ta(2)
% crea un vector con los 3 digitos del codigo a procesarse en ese
instante.
while k<(str2num(copro(2)))
a=str2num(copro(1))+1;
b=buf(a);
d=1;
while d<9
buf(d)=buf(d+1);
d=d+1;
end
buf(9)=b;
k=k+1;
end
d=1;
while d<9
buf(d)=buf(d+1);
d=d+1;
end
buf(9)=copro(3);
% crea una variable que permite conocer cuántos dígitos del nuevo estado
% del bufer son correspondientes a la secuencia original y vuelca los
% mismos a un vector sobreescribible que se acumulará en otro vector que
% guarda la secuencia total (decotemp y deco respectivamente).
t=9-(str2num(copro(2))+1);
d=1;
decotemp=buf(t+1);
decotemp(d)=buf(t+1);
while t<9
decotemp(d)=buf(t+1);
d=d+1;
t=t+1;
end
% acumula la longitud que se va procesando para controlar el avance del
% proceso y evitar bucle infinito
c=c+3;
x=c/ta(2);
waitbar(x)
deco=[deco decotemp];
end
% crea las mismas condiciones finales que en el compresor: actualización de
% la barra, obtención del radio de compresión y su respectivo gráfico.
x=1;
waitbar(x,h,'Completado')
close(h)
l=size(deco);
por=(ta(2)/l(2))*100;
set(handles.edit4,'string',deco)
16
set(handles.text4,'Visible','on')
set(handles.edit3,'string',por)
axes1=patch([0 1 1 0],[100 100 0 0],[0.5 0.5 0.5]);
axes1=patch([0 1 1 0],[por por 0 0],'g');
axis([0, 1, 0, 100])
axis off
catch
% para el descompresor la condición que genera un error es que exista
% un 9 en la posición que indica la posicion menos 1 de inicio de la
% repetición, puesto que el bufer es de long 9, dicho numero
% representaría una posición 10 inexistente.
% --- Executes on key press with focus on figure1 and none of its controls.
function figure1_KeyPressFcn(hObject, eventdata, handles)
% hObject handle to figure1 (see GCBO)
% eventdata structure with the following fields (see FIGURE)
% Key: name of the key that was pressed, in lower case
% Character: character interpretation of the key(s) that was pressed
% Modifier: name(s) of the modifier key(s) (i.e., control, shift) pressed
% handles structure with handles and user data (see GUIDATA)
17
% hObject handle to pushbutton5 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
18
% hObject handle to edit7 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles empty - handles not created until after all CreateFcns called
19
Se concluyó que el algoritmo de Lempel Ziv es un eficaz algoritmo de
compresión, aunque en la vida práctica es bastante utilizado para comprimir
archivos de imágenes, por medio de la implementación del algoritmo en un
software pudimos constatar que también puede comprimir archivos de texto.
20
Se sugiere observar detenidamente todos los parámetros indicados en la
ventana principal del programa implementado, de esta manera se podrá
constatar, comprender y comprobar de mejor manera el proceso de
compresión realizado.
BIBLIOGRAFÍA
http://ocw.udl.cat/enginyeria-i-arquitectura/codificacio-i-transport-de-la-
infomacio/Contenidos/2/CompSinPerd.pdf
http://www.programacion.com/articulo/introduccion_a_la_compresion_de_datos:_lempe
l-ziv-_gzip_186/4
http://es.kioskea.net/contents/video/compress.php3
http://www.mathworks.com/matlabcentral/fileexchange/29345-exemple-of-lempel-ziv-
coding
Paquete Computacional Matlab R2009a
21
INDICE
Pág
PORTADA I
OBJETIVOS 1
INTRODUCCIÓN 1
CONCLUSIONES 20
RECOMENDACIONES y SUGERENCIAS 20
BIBLIOGRAFÍA 21
22