Sunteți pe pagina 1din 22

Objetivos:

Empleando el software matemtico Matlab implementar el algoritmo de compresin y descompresin de datos: Lempel Ziv. Comprobar el funcionamiento del algoritmo Lempel Ziv, basado en las secuencias codificadas y decodificadas y as verificar que Lempel Ziv es un algoritmo de compresin sin perdida de informacin

Ideado por Jacob Ziv y Abraham Lempel, y publicado en el IEEE (Instituto de Ingenieros Elctricos y Electrnicos) Transactions on Information Theory, vol. IT-23, N 3 de Mayo de 1977, si bien ya haba sido presentado anteriormente en el IEEE International Symposium on Information Theory celebrado en Ronneby, Suecia, en Junio de 1976. La mayora de los mtodos de compresin se basan en un anlisis inicial del texto para identificar cadenas repetidas para armar un diccionario de equivalencias, asignando cdigos breves a estas cadenas. En una segunda etapa, se convierte el texto utilizando los cdigos equivalentes para las cadenas repetidas. Esto requiere dos etapas, una de anlisis y una segunda de conversin y tambin requiere que el diccionario se encuentre junto con el texto codificado, incrementando el tamao del archivo de salida. Lempel Ziv (LZ) es un algoritmo que elimina la redundancia en la codificacin y la redundancia en la secuencia de aparicin, y cuya principal caracterstica, es su sencillez de implementacin y velocidad de ejecucin. Es un algoritmo de compresin los-sless, es decir, que los datos recuperados tras la compresin y descompresin son exactamente los datos de partida. La clave del mtodo LZ reside en que es posible crear, de manera automtica y en una nica pasada un diccionario de cadenas que se encuentren dentro del texto a comprimir mientras al mismo tiempo se procede a su codificacin. Dicho diccionario no es transmitido con el texto comprimido, puesto que el descompresor puede reconstruirlo usando la misma lgica con que lo hace el compresor y, si est codificado correctamente, tendr exactamente las mismas cadenas que el diccionario del compresor tena. 1

Porque este paquete computacional presenta varias ventajas que se describen brevemente a continuacin. Permite codificacin rpida y fcil en un lenguaje de muy alto nivel. No hay que preocuparse por las estructuras de datos, en particular, los arreglos no tienen que ser declarados antes de usarse. La interfaz interactiva permite rpida experimentacin y depuracin mas efectiva (permite la ejecucin controlada de un programa o un cdigo, para seguir cada instruccin ejecutada). Los archivos de Matlab son completamente porttiles en diferentes plataformas (Linux, Apple, Windows).

A continuacin se detallar los pasos para hacer uso de Lempel Ziv en Matlab:

1.) Clic en el icono de Matlab, anclado en el Escritorio del ordenador 2.) Clic en el cuadro File (Archivo), se escoge la opcin Open

3.) A continuacin la ventana despliega una serie de opciones de apertura de carpetas o archivos, se escoge el correcto, en nuestro caso Lempel Ziv, ya que esta es la carpeta que contiene el desarrollo del cdigo fuente, la interfaz grfica, etc.

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 botn Run.

6.) A continuacin se despliega la interfaz grfica donde el usuario puede hacer uso del programa de una forma ms fcil.

7.) Como se puede observar se puede ingresar el texto en la cuadro de texto denominado: Texto.

8.) A continuacion se aplasta el botn: Binario, el mismo que transformar a lenguaje binario el texto ingresado, posteriormente eso se visualizar en la parte posterior de la grfica, ya que ese ser el cuadro que se proceder a comprimir con Lempel Ziv.

Secuencia que se proceder a comprimir con Lempel Ziv

9.) Para poder comprimir la secuencia damos clic en el botn Comprimir, a continuacion se muestra el progreso de la compresin.

10.) Al finalizar el cuadro inferior muestra la secuencia comprimida:

Secuencia Comprimida

Radio de Descompresin 4

Se observa que el programa tambin muestra el radio de compresin: El radio de compresin, que se utiliza con frecuencia, es lo contrario al factor de compresin (nm. de bits sin compresin/ nm. De bits con compresin) y se lo expresa como porcentaje. Por ltimo, la ganancia de compresin, que tambin se expresa como porcentaje, equivale a 1 menos el radio de compresin.

11.) Para descomprimir, se hace clic en el botn: Descomprimir, y la secuencia que se comprimi al principio se observa que sali al final de la descompresin.

Secuencia Descomprimida

Limpiar

12.) Si se desea ingresar un nuevo texto se hace clic en el botn Limpiar y este borrar todo el historial existente en los cuadros de texto, luego se procede a realizar los pasos anteriores. 13.) Para salir del programa se cierra todas las ventanas,

DIAGRAMA DE FLUJO DEL ALGORITMO DE LEMPEL ZIV


COMPRESOR: INICIO

ingr=get(handles.edit1,'string'); ta=size(ingr); ingr='' tline = fgetl(fid);

SI

~ischar(tline )

NO

i=1:length(tline) ingr=cat(2,ingr,dec2bin(tline(i)));

fclose(fid); set(handles.edit1,'String',ingr)

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

c<ta(2)

NO

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

cod=[cod codtemp]; a=0; b=1;

b<=18

if b<=(17(str2num(codtemp(2)))) 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

FIN

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

(c+3)<=ta(2)

NO

copro=[cod(c+1) cod(c+2) cod(c+3)]; k=0;

SI

k<(str2num(copro(2)) )

NO

a=str2num(copro(1))+1; b=buf(a); d=1;

d=1;

SI

d<9

NO

buf(d)=buf(d+1); d=d+1;

buf(9)=b; k=k+1;

d<9

buf(d)=buf(d+1); d=d+1;

buf(9)=copro(3); t=9(str2num(copro(2))+1); d=1; decotemp=buf(t+1); decotemp(d)=buf(t+1);

t<9

decotemp(d)=buf(t+1); d=d+1; t=t+1;

c=c+3; x=c/ta(2); 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


function varargout = Lempelziv(varargin) % LEMPELZIV M-file for Lempelziv.fig % LEMPELZIV, by itself, creates a new LEMPELZIV or raises the existing % singleton*. % % H = LEMPELZIV returns the handle to a new LEMPELZIV or the handle to % the existing singleton*. % % LEMPELZIV('CALLBACK',hObject,eventData,handles,...) calls the local % function named CALLBACK in LEMPELZIV.M with the given input arguments. % % LEMPELZIV('Property','Value',...) creates a new LEMPELZIV or raises the % existing singleton*. Starting from the left, property value pairs are % applied to the GUI before Lempelziv_OpeningFcn gets called. An % unrecognized property name or invalid value makes property application % stop. All inputs are passed to Lempelziv_OpeningFcn via varargin. % % *See GUI Options on GUIDE's Tools menu. Choose "GUI allows only one % instance to run (singleton)". % % See also: GUIDE, GUIDATA, GUIHANDLES % Edit the above text to modify the response to help Lempelziv % Last Modified by GUIDE v2.5 23-Apr-2012 23:14:09 % Begin initialization code - DO NOT EDIT gui_Singleton = 1; gui_State = struct('gui_Name', mfilename, ... 'gui_Singleton', gui_Singleton, ... 'gui_OpeningFcn', @Lempelziv_OpeningFcn, ... 'gui_OutputFcn', @Lempelziv_OutputFcn, ... 'gui_LayoutFcn', [] , ... 'gui_Callback', []); if nargin && ischar(varargin{1}) gui_State.gui_Callback = str2func(varargin{1}); end if nargout [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:}); else gui_mainfcn(gui_State, varargin{:}); end % End initialization code - DO NOT EDIT % --- Executes just before Lempelziv is made visible. function Lempelziv_OpeningFcn(hObject, eventdata, handles, varargin) % This function has no output args, see OutputFcn. % hObject handle to figure % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % varargin command line arguments to Lempelziv (see VARARGIN) % Choose default command line output for Lempelziv handles.output = hObject; % Update handles structure guidata(hObject, handles); % Cambia El Icono de la esquina (cei). javaFrame = get(hObject,'JavaFrame'); javaFrame.setFigureIcon(javax.swing.ImageIcon('icon.JPG'));

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]); % UIWAIT makes Lempelziv wait for user response (see UIRESUME) % uiwait(handles.figure1); % --- 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) % Get default command line output from handles structure varargout{1} = handles.output;

function edit1_Callback(hObject, eventdata, handles) % hObject handle to edit1 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % Hints: get(hObject,'String') returns contents of edit1 as text % str2double(get(hObject,'String')) returns contents of edit1 as a double % --- Executes during object creation, after setting all properties. function edit1_CreateFcn(hObject, eventdata, handles) % hObject handle to edit1 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles empty - handles not created until after all CreateFcns called % Hint: edit controls usually have a white background on Windows. % See ISPC and COMPUTER. if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white'); end

function edit2_Callback(hObject, eventdata, handles) % hObject handle to edit1 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % Hints: get(hObject,'String') returns contents of edit1 as text % str2double(get(hObject,'String')) returns contents of edit1 as a double % --- Executes during object creation, after setting all properties. function edit2_CreateFcn(hObject, eventdata, handles) % hObject handle to edit1 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles empty - handles not created until after all CreateFcns called % Hint: edit controls usually have a white background on Windows. % See ISPC and COMPUTER. if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white'); end

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 seccin 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 % (enceracin). proc=[]; sproc=[]; n=1; % ---- Proceso que va incrementando el tamao de los vectores a compararse % para encontrar la secuencias repetidas mas largas dentro del buffer, n % tamao del vector. while n<9 % % % % % % Acumuladores, va generando un vector de tamao variable tanto de la parte a procesarse como de la procesada con el fin de tener vectores de igual tamao que se puedan comparar y as buscar la mxima longitud de repeticion posible (8), permite automatizar el proceso dado que si no existen repeticiones la maxima longitud es 1 y el programa lo detecta, n es el tamao del vector que se genera.

proc=[proc buf(9+n)]; sproc=[sproc buf(n)]; k=0; % % % % % proceso de comparacin, k controla la posicin en la que se ubica el vector sin procesar de longitud y posicn variable, lo que permite comparar secuencias en la seccin total del bufer con la seccin procesada de posicin fija con vector auxiliar de longitud variable que permite la comparacin. (n+k)<=18 aqu se modifica el vector que se comparar con el de la seccin a procesar, se forma automticamente dicho vector dependiendo de la posicin de inicio y del tamao 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.

while % % % % %

d=1; while (d+k)<=(n+k) sproc(d)=buf(d+k); d=d+1; end

13

% % % % %

aqu se realiza la verificacin de repeticiones, comparando los vectores del mismo tamao procesado y sin procesar, el ultimo siendo un vector fijo desde la posicin 9 y el otro mvil a traves de todo el bufer hasta la posicin 9, puesto que si va mas all en la seccin sin procesar habra fallos en la descompresin.

if sproc==proc; % la estructura que tiene (comparacin 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 seccin modificandola lo menos posible. % este if verifica que la posicin del vector movil no est dentro % de la seccin 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 cdigo 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 cdigo especfico basado % en alteraciones provocadas mas abajo que garantizan que % sea correcto. codtemp=[num2str(k) num2str(n-1) bufpr(n)]; % si el programa se encuentra en la seccin que genera el cdigo % con una longitud de repeticin cualquiera encuentra coincidencia % no hay necesidad de buscar mas coincidencias de la mima longitud, % k=18 provocar que se detenga la bsqueda y que se proceda a % realizar lo mismo con una longitud mayor. k=18; % variable acumuladora que permitir detectar si ha habido % coincidencias en la generacin de cdigo, para que si no es as % se genere un cdigo especfico 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 posicin 9 del bufer)) que % sera 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; % modificacin del estado de la barra de progreso waitbar(x) % acumulador que permite saber cuntos 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 % cdigo 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; % reconfiguracin y cierre de la barra y creacin de ratio de comprecin y % su respectivo grfico, para el mismo existen secciones de cdigo tambin % en las secciones de iniciacin de la ventana arriba. 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 % debido a la configuracin del programa este solo funciona si la % secuencia ingresada es de al menos 9 caracteres, si esto no es as se genera un error, debido a ello se usa % un try catch para aprovechar esta coondicin e informar al usuario q % la secuencia es muy pequea al generarse dicho error. msgbox('La secuencia a comprimir es muy pequea') end % hObject handle to pushbutton1 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % --- Executes on button press in pushbutton4. function pushbutton4_Callback(hObject, eventdata, handles) try % adquisicion de datos, creacion de bufer, declaracion de variables e % inicio de barra de espera. 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 cdigo 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. copro=[cod(c+1) cod(c+2) cod(c+3)]; k=0; % se realizan la interpolaciones del cdigo las veces que lo indica el % digito 2 del codigo q se esta procesando a ese inatante. 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 % Realiza la ltima iteracin que no est contemplada en el nmero 2 del % cdigo y coloca el dgito apropiado al final de la misma. d=1; while d<9 buf(d)=buf(d+1); d=d+1; end buf(9)=copro(3); % crea una variable que permite conocer cuntos dgitos 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: actualizacin de % la barra, obtencin del radio de compresin y su respectivo grfico. 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 condicin que genera un error es que exista % un 9 en la posicin que indica la posicion menos 1 de inicio de la % repeticin, puesto que el bufer es de long 9, dicho numero % representara una posicin 10 inexistente. msgbox('El cdigo ingresado no es vlido o est corrupto') close(h) end % hObject % eventdata % handles handle to pushbutton4 (see GCBO) reserved - to be defined in a future version of MATLAB structure with handles and user data (see GUIDATA)

% --- Executes on mouse press over figure background. function figure1_ButtonDownFcn(hObject, eventdata, handles) % hObject handle to figure1 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % --- Executes on mouse press over figure background, over a disabled or % --- inactive control, or over an axes background. function figure1_WindowButtonDownFcn(hObject, eventdata, handles) % hObject handle to figure1 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % --- Executes during object creation, after setting all properties. function figure1_CreateFcn(hObject, eventdata, handles) % hObject handle to figure1 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles empty - handles not created until after all CreateFcns called % --- Executes during object deletion, before destroying properties. function figure1_DeleteFcn(hObject, eventdata, handles) % hObject handle to figure1 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % --- 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) % --- Executes on button press in pushbutton5. function pushbutton5_Callback(hObject, eventdata, handles) % setea a las condiciones iniciales todos los elementos. set(handles.edit1,'string','SECUENCIA EN BINARIO') set(handles.edit2,'string','CDIGO') set(handles.edit4,'string','SECUENCIA DECODIFICADA') set(handles.edit3,'string','') set(handles.edit7,'string','') axes1=patch([0 1 1 0],[100 100 0 0],[0.5 0.5 0.5]);

17

% hObject % eventdata % handles

handle to pushbutton5 (see GCBO) reserved - to be defined in a future version of MATLAB structure with handles and user data (see GUIDATA)

function edit4_Callback(hObject, eventdata, handles) % hObject handle to edit4 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % Hints: get(hObject,'String') returns contents of edit4 as text % str2double(get(hObject,'String')) returns contents of edit4 as a double % --- Executes during object creation, after setting all properties. function edit4_CreateFcn(hObject, eventdata, handles) % hObject handle to edit4 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles empty - handles not created until after all CreateFcns called % Hint: edit controls usually have a white background on Windows. % See ISPC and COMPUTER. if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white'); end

function edit3_Callback(hObject, eventdata, handles) % hObject handle to edit3 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % Hints: get(hObject,'String') returns contents of edit3 as text % str2double(get(hObject,'String')) returns contents of edit3 as a double % --- Executes during object creation, after setting all properties. function edit3_CreateFcn(hObject, eventdata, handles) % hObject handle to edit3 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles empty - handles not created until after all CreateFcns called % Hint: edit controls usually have a white background on Windows. % See ISPC and COMPUTER. if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white'); end

function edit7_Callback(hObject, eventdata, handles) % hObject handle to edit7 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % Hints: get(hObject,'String') returns contents of edit7 as text % str2double(get(hObject,'String')) returns contents of edit7 as a double % --- Executes during object creation, after setting all properties. function edit7_CreateFcn(hObject, eventdata, handles)

18

% hObject % eventdata % handles

handle to edit7 (see GCBO) reserved - to be defined in a future version of MATLAB empty - handles not created until after all CreateFcns called

% Hint: edit controls usually have a white background on Windows. % See ISPC and COMPUTER. if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white'); end % --- Executes on button press in pushbutton6. function pushbutton6_Callback(hObject, eventdata, handles) fid=fopen('texto.txt'); ingr=''; while 1 tline = fgetl(fid); if ~ischar(tline), break, end for i=1:length(tline) ingr=cat(2,ingr,(tline(i))); end end fclose(fid); ingr2=char(ingr); set(handles.edit7,'String',ingr2) handles.ingr=ingr; guidata(hObject,handles); % hObject handle to pushbutton6 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % --- Executes on button press in pushbutton7. function pushbutton7_Callback(hObject, eventdata, handles) dat=get(handles.edit7,'string') binar=dec2bin(dat) ta=size(binar) a=1 g=[] x=a/ta(1); h=waitbar(0,'Convirtiendo a binario...'); while a<=ta(1) c=binar(a,:) g=cat(2,g,c) a=a+1 x=a/ta(1); waitbar(x) end x=1; waitbar(x,h,'Completado') close(h) set(handles.edit1,'string',g) % hObject handle to pushbutton7 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)

19

Se concluy que el algoritmo de Lempel Ziv es un eficaz algoritmo de compresin, aunque en la vida prctica es bastante utilizado para comprimir archivos de imgenes, por medio de la implementacin del algoritmo en un software pudimos constatar que tambin puede comprimir archivos de texto. Se concluy que al armar el diccionario sobre la marcha se evita hacer dos pasadas sobre el texto, una analizando y la otra codificando y dado que la regla de armado del diccionario es tan simple, el descompresor puede reconstruirlo a partir del texto comprimido mientras lo lee, evitando as incluir el diccionario dentro del texto comprimido. Por medio de la implementacin del cdigo en un software computacional se concluy que el algoritmo de Lempel Ziv es bastante eficiente para comprimir archivos de texto en especial texto en binario, especialmente en cadenas largas de texto, y cuando existen bucles largos de repeticin ya sean estos de ceros o unos. Por medio del programa se concluy que en muchos casos el resultado comprimido posee un alto porcentaje de compresin respecto de la informacin original, dicho de otra manera, los resultados comprimidos ocupan un menor nmero de bits respecto a los nmeros de bits que ocupan los de la informacin no comprimida. Por medio del programa computacional se constat que el algoritmo de compresin de Lempel Ziv es sin prdidas, ya que al descomprimir el archivo volvemos a tener el archivo original que se tena antes de la compresin.

Se recomienda utilizar el programa siguiendo el correspondiente manual incorporado, de esta manera se facilitar el uso del mismo para el usuario. Es recomendable usar el programa implementado para comprimir cadenas de textos largos ya que de esta manera se observar una mejor tasa de compresin respecto a la cadena original, adems el algoritmo funciona de mejor manera. No se recomienda utilizar el programa con cadenas de texto demasiado cortas, ya que el programa no comprimir debido a que el propio algoritmo de Lempel Ziv est bsicamente diseado para secuencias largas. Se recomienda utilizar el algoritmo de compresin Lempel Ziv para comprimir imgenes, pero como se pudo constatar tambin puede comprimir otros tipos de informacin como texto por ejemplo.

20

Se sugiere observar detenidamente todos los parmetros indicados en la ventana principal del programa implementado, de esta manera se podr constatar, comprender y comprobar de mejor manera el proceso de compresin realizado. Para ingresar nuevas cadenas de texto al compresor se recomienda utilizar el botn Limpiar, de esta forma se reiniciaran todos los parmetros en la ventana principal y se podr ingresar una nueva secuencia de texto para que sea comprimida.

BIBLIOGRAFA http://ocw.udl.cat/enginyeria-i-arquitectura/codificacio-i-transport-de-lainfomacio/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-zivcoding Paquete Computacional Matlab R2009a

21

INDICE
Pg

PORTADA

IMPLEMENTACION DEL ALGORITMO DE LEMPEL ZIV EN MATLAB

OBJETIVOS

INTRODUCCIN

MANUAL DE USUARIO DEL PROGRAMA

DIAGRAMA DE FLUJO DEL ALGORITMO DE LEMPEL ZIV

DIAGRAMA DE FLUJO DEL COMPRESOR

DIAGRAMA DE FLUJO DEL DESCOMPRESOR

CODIGO FUENTE DEL ALGORITMO DE LEMPEL ZIV APLICADO EN MATLAB

11

CONCLUSIONES

20

RECOMENDACIONES y SUGERENCIAS

20

BIBLIOGRAFA

21

22

S-ar putea să vă placă și