Instituto Politécnico Nacional
Introducción a los Sistemas de Comunicación Seguros
Unidad MISTI Culhuacan
Presentado a: Dr. Gualberto Aguilar Torres
Tarea
Sistemas Huffman
9
Por: Yango Alexander Colmenares
Fecha
Octubre de 2013
%% INSTITUTO POLITECNICO NACIONAL-MISTI CULHUACAN --- MEXICO DF 2013
%%Desarrollado por:Yango Colmenares
%Presentado a : Dr. Gualberto Aguilar Torres
%Programación en Matlab
%Codigo Huffman
clc;
clear all;
close all;
% Aqui se lee el archivo .txt
fileID = fopen('pruebaProba.txt');
% Se utiliza el comando fscanf para analizar el contenido del archivo
texto = fscanf(fileID,'%c');
% Se convierte el texto a minusculas
texto = lower(texto);
% En la siguiente variable obtenemos el total de letras del texto aunque
% se repitan, contanto espacios en blanco, simbolos, etc.
totalLetras = length(texto);
% Algoritmo para quitar acentos a vocales
for j=1:length(texto)
if strcmp(texto(j),'á')
texto(j)='a';
elseif strcmp(texto(j),'é')
texto(j)='e';
elseif strcmp(texto(j),'í')
texto(j)='i';
elseif strcmp(texto(j),'ó')
texto(j)='o';
elseif strcmp(texto(j),'ú')
texto(j)='u';
end
end
clear j;
% El comando control de flujo del texto 'ENTER' lo cambiamos por un
espacio
% en blanco
for j=1:length(texto)
if isstrprop(texto(j), 'cntrl')
texto(j)=' ';
end
end
clear j;
% Inicializamos la variable palabras Solas que contendra las palabra del
% texto sin repetirse
letrasSolas(1) = texto(1);
% Algoritmo que nos ayuda a encontrar las palabras sin repetirse del
texto
% para irlas guardando en el vector palabrasSolas
indicador = 0;
for j=1:length(texto)
for i=1:length(letrasSolas)
% Para comparar cadenas: strcmp(cadena1, cadena2);
if strcmp(letrasSolas(i),texto(j))
indicador = 1;
end
end
if indicador ~= 1
letrasSolas(i+1) = texto(j);
end
indicador = 0;
end
clear j i indicador;
% El siguiente algoritmo nos ayuda a contar el numero de palabras que se
% repiten dentro del texto cargado
contadorLetras = zeros(1,length(letrasSolas));
for j=1:length(letrasSolas)
for i=1:length(texto)
if strcmp(letrasSolas(j),texto(i))
contadorLetras(j) = contadorLetras(j) + 1;
end
end
end
clear j i;
% Histograma de las palabras encontradas dentro del texto mostrando la
% frecuencia de ellas
% bar(contadorLetras);
% El siguiente codigo obtiene la probabilidad de cada palabra
probaLetras = zeros(1,length(letrasSolas));
for j=1:length(letrasSolas)
probaLetras(j) = contadorLetras(j)/totalLetras;
end
clear j;
% Hasta aqui se termino de analizar el texto y se puede ahora proseguir
con
% la codificacion Huffman
%% Algoritmo de Huffman
% La variable letrasSolas las pasamos a celdas
for i=1:length(letrasSolas)
letrasSolasCell{i,1} = letrasSolas(i);
probaLetrasCell{i,1} = probaLetras(i);
codigosLetrasCell{i,1} = '';
end
clear i;
% Las siguientes variables nos ayudaran a realizar el algoritmo de
huffman
letrasSolasCellSort = letrasSolasCell;
probaLetrasCellSort = probaLetrasCell;
% Acomodamos las probabilidades de forma descendiente
for j=1:length(probaLetrasCellSort)
for i=1:length(probaLetrasCellSort)-1
if probaLetrasCellSort{i} < probaLetrasCellSort{i+1}
aux = probaLetrasCellSort{i};
aux1 = letrasSolasCellSort{i};
probaLetrasCellSort{i} = probaLetrasCellSort{i+1};
letrasSolasCellSort{i} = letrasSolasCellSort{i+1};
probaLetrasCellSort{i+1} = aux;
letrasSolasCellSort{i+1} = aux1;
end
end
end
clear j i aux aux1;
tope = length(letrasSolasCellSort);
for i=1:length(letrasSolasCellSort)-2
for j=1:tope-1
if j == tope-1
probaLetrasCellSort{j,i+1} =
probaLetrasCellSort{j,i}+probaLetrasCellSort{j+1,i};
sumasHuffman{i,1} = probaLetrasCellSort{j,i+1};
else
probaLetrasCellSort{j,i+1} = probaLetrasCellSort{j,i};
end
end
for k=1:tope-1
for l=1:tope-2
if probaLetrasCellSort{l,i+1} < probaLetrasCellSort{l+1,i+1}
aux = probaLetrasCellSort{l,i+1};
probaLetrasCellSort{l,i+1} =
probaLetrasCellSort{l+1,i+1};
probaLetrasCellSort{l+1,i+1} = aux;
end
end
end
tope = tope-1;
end
clear tope i j k l aux;
probaCopiaSort = probaLetrasCellSort;
tope = length(letrasSolasCellSort);
for i=1:length(letrasSolasCellSort)
indexLetrasSolas{i,1} = i;
end
clear i;
% Esta variable indicara hasta cuando se dejara de borrar las celdas para
una
% mejor busqueda del código
indicador = 0;
indPos = 0;
for j=1:length(letrasSolasCell)
for i=1:length(letrasSolasCell)-2
if j == 1
aux = indexLetrasSolas{j,i};
aux1 = probaLetrasCellSort{aux,i};
if (aux == tope) || (aux == tope-1)
for k=tope-1:-1:1
if sumasHuffman{i} == probaLetrasCellSort{k,i+1}
indexLetrasSolas{j,i+1} = k;
indicador = indicador + 1;
break;
end
end
else
for k=aux:tope-1
if indicador == 0
if aux1 == probaLetrasCellSort{k,i+1}
indexLetrasSolas{j,i+1} = k;
probaLetrasCellSort{aux,i} = 0;
break;
end
else
if aux1 == probaLetrasCellSort{k,i+1}
indexLetrasSolas{j,i+1} = k;
break;
end
end
end
end
tope = tope-1;
else
aux = indexLetrasSolas{j,i};
aux1 = probaLetrasCellSort{aux,i};
if (aux == tope) || (aux == tope-1)
for k=tope-1:-1:1
if sumasHuffman{i} == probaLetrasCellSort{k,i+1}
indexLetrasSolas{j,i+1} = k;
indicador = indicador + 1;
break;
end
end
else
for k=aux:tope-1
if indicador == 0
if aux1 == probaLetrasCellSort{k,i+1}
if k == indexLetrasSolas{j-1,i+1}
indexLetrasSolas{j,i+1} = k+1;
probaLetrasCellSort{aux,i} = 0;
break;
else
indexLetrasSolas{j,i+1} = k;
probaLetrasCellSort{aux,i} = 0;
break;
end
end
else
if aux1 == probaLetrasCellSort{k,i+1}
indexLetrasSolas{j,i+1} = k;
break;
end
end
end
end
tope = tope-1;
end
end
indicador = 0;
tope = length(letrasSolasCellSort);
end
tope = length(letrasSolasCellSort);
for j=1:length(letrasSolasCell)
for i=1:length(letrasSolasCell)-1
if indexLetrasSolas{j,i} == tope
codigosLetrasCell{j} = strcat(codigosLetrasCell{j},'1');
elseif indexLetrasSolas{j,i} == tope-1
codigosLetrasCell{j} = strcat(codigosLetrasCell{j},'0');
end
tope = tope - 1;
end
tope = length(letrasSolasCellSort);
end
% Creamos una tabla que servira de muestra para visualizar las
% codificaciones
for i=1:length(letrasSolasCell)
tabla{i,1} = letrasSolasCellSort{i,1};
end
for i=1:length(letrasSolasCell)
tabla{i,2} = probaCopiaSort{i,1};
end
for i=1:length(letrasSolasCell)
tabla{i,3} = codigosLetrasCell{i,1};
end
% Analisis del codigo y verificacion del sistema Huffman
% Crea la variable codificacion que contendra todo el texto codificado
for j=1:length(letrasSolasCellSort)
if strcmp(texto(1),letrasSolasCellSort{j})
codificacion = codigosLetrasCell{j};
end
end
% Codificar el texto analizado
for i=2:length(texto)
for j=1:length(letrasSolasCellSort)
if strcmp(texto(i),letrasSolasCellSort{j})
codificacion = strcat(codificacion,codigosLetrasCell{j});
end
end
end
% Copiamos la codificacion tal y como nos la entrega el algoritmo
anterior
% como copia segura
codificacion1 = codificacion;
% El siguiente algoritmo agrega '0's a la derecha para despues poderlo
% organizar en grupos de 8 tipo modulos
if mod(length(codificacion),8) ~= 0
for j=length(codificacion):length(codificacion)+7-
mod(length(codificacion),8)
codificacion(j+1) = '0';
end
end
% % Agrupar codificacion en grupos de 8 bits
i=1;
for j=1:floor(length(codificacion)/8)
grupos8Bits{j} = codificacion(i:i+7);
i=i+8;
end
% % Agrupar codificacion en grupos de 4 bits
i=1;
for j=1:floor(length(codificacion)/4)
grupos4Bits{j} = codificacion(i:i+3);
i=i+4;
end
% % Algoritmo que pasa la codificacion a Hexadecimal
if strcmp(grupos4Bits{1},'0000')
codificacionHex = '0';
elseif strcmp(grupos4Bits{1},'0001')
codificacionHex = '1';
elseif strcmp(grupos4Bits{1},'0010')
codificacionHex = '2';
elseif strcmp(grupos4Bits{1},'0011')
codificacionHex = '3';
elseif strcmp(grupos4Bits{1},'0100')
codificacionHex = '4';
elseif strcmp(grupos4Bits{1},'0101')
codificacionHex = '5';
elseif strcmp(grupos4Bits{1},'0110')
codificacionHex = '6';
elseif strcmp(grupos4Bits{1},'0111')
codificacionHex = '7';
elseif strcmp(grupos4Bits{1},'1000')
codificacionHex = '8';
elseif strcmp(grupos4Bits{1},'1001')
codificacionHex = '9';
elseif strcmp(grupos4Bits{1},'1010')
codificacionHex = 'A';
elseif strcmp(grupos4Bits{1},'1011')
codificacionHex = 'B';
elseif strcmp(grupos4Bits{1},'1100')
codificacionHex = 'C';
elseif strcmp(grupos4Bits{1},'1101')
codificacionHex = 'D';
elseif strcmp(grupos4Bits{1},'1110')
codificacionHex = 'E';
elseif strcmp(grupos4Bits{1},'1111')
codificacionHex = 'F';
end
for j=2:length(grupos4Bits)
if strcmp(grupos4Bits{j},'0000')
codificacionHex = strcat(codificacionHex,'0');
elseif strcmp(grupos4Bits{j},'0001')
codificacionHex = strcat(codificacionHex,'1');
elseif strcmp(grupos4Bits{j},'0010')
codificacionHex = strcat(codificacionHex,'2');
elseif strcmp(grupos4Bits{j},'0011')
codificacionHex = strcat(codificacionHex,'3');
elseif strcmp(grupos4Bits{j},'0100')
codificacionHex = strcat(codificacionHex,'4');
elseif strcmp(grupos4Bits{j},'0101')
codificacionHex = strcat(codificacionHex,'5');
elseif strcmp(grupos4Bits{j},'0110')
codificacionHex = strcat(codificacionHex,'6');
elseif strcmp(grupos4Bits{j},'0111')
codificacionHex = strcat(codificacionHex,'7');
elseif strcmp(grupos4Bits{j},'1000')
codificacionHex = strcat(codificacionHex,'8');
elseif strcmp(grupos4Bits{j},'1001')
codificacionHex = strcat(codificacionHex,'9');
elseif strcmp(grupos4Bits{j},'1010')
codificacionHex = strcat(codificacionHex,'A');
elseif strcmp(grupos4Bits{j},'1011')
codificacionHex = strcat(codificacionHex,'B');
elseif strcmp(grupos4Bits{j},'1100')
codificacionHex = strcat(codificacionHex,'C');
elseif strcmp(grupos4Bits{j},'1101')
codificacionHex = strcat(codificacionHex,'D');
elseif strcmp(grupos4Bits{j},'1110')
codificacionHex = strcat(codificacionHex,'E');
elseif strcmp(grupos4Bits{j},'1111')
codificacionHex = strcat(codificacionHex,'F');
end
end
%Se resuelve el codigo expresando la funcionalidad segun el texto marcado
fclose(fileID);
clear ans;

Codigo huffman (yango colmenares)

  • 1.
    Instituto Politécnico Nacional Introduccióna los Sistemas de Comunicación Seguros Unidad MISTI Culhuacan Presentado a: Dr. Gualberto Aguilar Torres Tarea Sistemas Huffman 9 Por: Yango Alexander Colmenares Fecha Octubre de 2013 %% INSTITUTO POLITECNICO NACIONAL-MISTI CULHUACAN --- MEXICO DF 2013 %%Desarrollado por:Yango Colmenares %Presentado a : Dr. Gualberto Aguilar Torres %Programación en Matlab %Codigo Huffman clc; clear all; close all; % Aqui se lee el archivo .txt fileID = fopen('pruebaProba.txt'); % Se utiliza el comando fscanf para analizar el contenido del archivo texto = fscanf(fileID,'%c'); % Se convierte el texto a minusculas texto = lower(texto); % En la siguiente variable obtenemos el total de letras del texto aunque % se repitan, contanto espacios en blanco, simbolos, etc. totalLetras = length(texto); % Algoritmo para quitar acentos a vocales for j=1:length(texto) if strcmp(texto(j),'á') texto(j)='a'; elseif strcmp(texto(j),'é') texto(j)='e'; elseif strcmp(texto(j),'í') texto(j)='i'; elseif strcmp(texto(j),'ó') texto(j)='o'; elseif strcmp(texto(j),'ú') texto(j)='u'; end
  • 2.
    end clear j; % Elcomando control de flujo del texto 'ENTER' lo cambiamos por un espacio % en blanco for j=1:length(texto) if isstrprop(texto(j), 'cntrl') texto(j)=' '; end end clear j; % Inicializamos la variable palabras Solas que contendra las palabra del % texto sin repetirse letrasSolas(1) = texto(1); % Algoritmo que nos ayuda a encontrar las palabras sin repetirse del texto % para irlas guardando en el vector palabrasSolas indicador = 0; for j=1:length(texto) for i=1:length(letrasSolas) % Para comparar cadenas: strcmp(cadena1, cadena2); if strcmp(letrasSolas(i),texto(j)) indicador = 1; end end if indicador ~= 1 letrasSolas(i+1) = texto(j); end indicador = 0; end clear j i indicador; % El siguiente algoritmo nos ayuda a contar el numero de palabras que se % repiten dentro del texto cargado contadorLetras = zeros(1,length(letrasSolas)); for j=1:length(letrasSolas) for i=1:length(texto) if strcmp(letrasSolas(j),texto(i)) contadorLetras(j) = contadorLetras(j) + 1; end end end clear j i; % Histograma de las palabras encontradas dentro del texto mostrando la % frecuencia de ellas % bar(contadorLetras); % El siguiente codigo obtiene la probabilidad de cada palabra probaLetras = zeros(1,length(letrasSolas)); for j=1:length(letrasSolas) probaLetras(j) = contadorLetras(j)/totalLetras;
  • 3.
    end clear j; % Hastaaqui se termino de analizar el texto y se puede ahora proseguir con % la codificacion Huffman %% Algoritmo de Huffman % La variable letrasSolas las pasamos a celdas for i=1:length(letrasSolas) letrasSolasCell{i,1} = letrasSolas(i); probaLetrasCell{i,1} = probaLetras(i); codigosLetrasCell{i,1} = ''; end clear i; % Las siguientes variables nos ayudaran a realizar el algoritmo de huffman letrasSolasCellSort = letrasSolasCell; probaLetrasCellSort = probaLetrasCell; % Acomodamos las probabilidades de forma descendiente for j=1:length(probaLetrasCellSort) for i=1:length(probaLetrasCellSort)-1 if probaLetrasCellSort{i} < probaLetrasCellSort{i+1} aux = probaLetrasCellSort{i}; aux1 = letrasSolasCellSort{i}; probaLetrasCellSort{i} = probaLetrasCellSort{i+1}; letrasSolasCellSort{i} = letrasSolasCellSort{i+1}; probaLetrasCellSort{i+1} = aux; letrasSolasCellSort{i+1} = aux1; end end end clear j i aux aux1; tope = length(letrasSolasCellSort); for i=1:length(letrasSolasCellSort)-2 for j=1:tope-1 if j == tope-1 probaLetrasCellSort{j,i+1} = probaLetrasCellSort{j,i}+probaLetrasCellSort{j+1,i}; sumasHuffman{i,1} = probaLetrasCellSort{j,i+1}; else probaLetrasCellSort{j,i+1} = probaLetrasCellSort{j,i}; end end for k=1:tope-1 for l=1:tope-2
  • 4.
    if probaLetrasCellSort{l,i+1} <probaLetrasCellSort{l+1,i+1} aux = probaLetrasCellSort{l,i+1}; probaLetrasCellSort{l,i+1} = probaLetrasCellSort{l+1,i+1}; probaLetrasCellSort{l+1,i+1} = aux; end end end tope = tope-1; end clear tope i j k l aux; probaCopiaSort = probaLetrasCellSort; tope = length(letrasSolasCellSort); for i=1:length(letrasSolasCellSort) indexLetrasSolas{i,1} = i; end clear i; % Esta variable indicara hasta cuando se dejara de borrar las celdas para una % mejor busqueda del código indicador = 0; indPos = 0; for j=1:length(letrasSolasCell) for i=1:length(letrasSolasCell)-2 if j == 1 aux = indexLetrasSolas{j,i}; aux1 = probaLetrasCellSort{aux,i}; if (aux == tope) || (aux == tope-1) for k=tope-1:-1:1 if sumasHuffman{i} == probaLetrasCellSort{k,i+1} indexLetrasSolas{j,i+1} = k; indicador = indicador + 1; break; end end else for k=aux:tope-1 if indicador == 0 if aux1 == probaLetrasCellSort{k,i+1} indexLetrasSolas{j,i+1} = k; probaLetrasCellSort{aux,i} = 0; break;
  • 5.
    end else if aux1 ==probaLetrasCellSort{k,i+1} indexLetrasSolas{j,i+1} = k; break; end end end end tope = tope-1; else aux = indexLetrasSolas{j,i}; aux1 = probaLetrasCellSort{aux,i}; if (aux == tope) || (aux == tope-1) for k=tope-1:-1:1 if sumasHuffman{i} == probaLetrasCellSort{k,i+1} indexLetrasSolas{j,i+1} = k; indicador = indicador + 1; break; end end else for k=aux:tope-1 if indicador == 0 if aux1 == probaLetrasCellSort{k,i+1} if k == indexLetrasSolas{j-1,i+1} indexLetrasSolas{j,i+1} = k+1; probaLetrasCellSort{aux,i} = 0; break; else indexLetrasSolas{j,i+1} = k; probaLetrasCellSort{aux,i} = 0; break; end end else if aux1 == probaLetrasCellSort{k,i+1} indexLetrasSolas{j,i+1} = k; break; end end
  • 6.
    end end tope = tope-1; end end indicador= 0; tope = length(letrasSolasCellSort); end tope = length(letrasSolasCellSort); for j=1:length(letrasSolasCell) for i=1:length(letrasSolasCell)-1 if indexLetrasSolas{j,i} == tope codigosLetrasCell{j} = strcat(codigosLetrasCell{j},'1'); elseif indexLetrasSolas{j,i} == tope-1 codigosLetrasCell{j} = strcat(codigosLetrasCell{j},'0'); end tope = tope - 1; end tope = length(letrasSolasCellSort); end % Creamos una tabla que servira de muestra para visualizar las % codificaciones for i=1:length(letrasSolasCell) tabla{i,1} = letrasSolasCellSort{i,1}; end for i=1:length(letrasSolasCell) tabla{i,2} = probaCopiaSort{i,1}; end for i=1:length(letrasSolasCell) tabla{i,3} = codigosLetrasCell{i,1}; end % Analisis del codigo y verificacion del sistema Huffman % Crea la variable codificacion que contendra todo el texto codificado for j=1:length(letrasSolasCellSort) if strcmp(texto(1),letrasSolasCellSort{j}) codificacion = codigosLetrasCell{j}; end end % Codificar el texto analizado for i=2:length(texto) for j=1:length(letrasSolasCellSort) if strcmp(texto(i),letrasSolasCellSort{j}) codificacion = strcat(codificacion,codigosLetrasCell{j});
  • 7.
    end end end % Copiamos lacodificacion tal y como nos la entrega el algoritmo anterior % como copia segura codificacion1 = codificacion; % El siguiente algoritmo agrega '0's a la derecha para despues poderlo % organizar en grupos de 8 tipo modulos if mod(length(codificacion),8) ~= 0 for j=length(codificacion):length(codificacion)+7- mod(length(codificacion),8) codificacion(j+1) = '0'; end end % % Agrupar codificacion en grupos de 8 bits i=1; for j=1:floor(length(codificacion)/8) grupos8Bits{j} = codificacion(i:i+7); i=i+8; end % % Agrupar codificacion en grupos de 4 bits i=1; for j=1:floor(length(codificacion)/4) grupos4Bits{j} = codificacion(i:i+3); i=i+4; end % % Algoritmo que pasa la codificacion a Hexadecimal if strcmp(grupos4Bits{1},'0000') codificacionHex = '0'; elseif strcmp(grupos4Bits{1},'0001') codificacionHex = '1'; elseif strcmp(grupos4Bits{1},'0010') codificacionHex = '2'; elseif strcmp(grupos4Bits{1},'0011') codificacionHex = '3'; elseif strcmp(grupos4Bits{1},'0100') codificacionHex = '4'; elseif strcmp(grupos4Bits{1},'0101') codificacionHex = '5'; elseif strcmp(grupos4Bits{1},'0110') codificacionHex = '6'; elseif strcmp(grupos4Bits{1},'0111') codificacionHex = '7'; elseif strcmp(grupos4Bits{1},'1000') codificacionHex = '8'; elseif strcmp(grupos4Bits{1},'1001') codificacionHex = '9'; elseif strcmp(grupos4Bits{1},'1010') codificacionHex = 'A'; elseif strcmp(grupos4Bits{1},'1011')
  • 8.
    codificacionHex = 'B'; elseifstrcmp(grupos4Bits{1},'1100') codificacionHex = 'C'; elseif strcmp(grupos4Bits{1},'1101') codificacionHex = 'D'; elseif strcmp(grupos4Bits{1},'1110') codificacionHex = 'E'; elseif strcmp(grupos4Bits{1},'1111') codificacionHex = 'F'; end for j=2:length(grupos4Bits) if strcmp(grupos4Bits{j},'0000') codificacionHex = strcat(codificacionHex,'0'); elseif strcmp(grupos4Bits{j},'0001') codificacionHex = strcat(codificacionHex,'1'); elseif strcmp(grupos4Bits{j},'0010') codificacionHex = strcat(codificacionHex,'2'); elseif strcmp(grupos4Bits{j},'0011') codificacionHex = strcat(codificacionHex,'3'); elseif strcmp(grupos4Bits{j},'0100') codificacionHex = strcat(codificacionHex,'4'); elseif strcmp(grupos4Bits{j},'0101') codificacionHex = strcat(codificacionHex,'5'); elseif strcmp(grupos4Bits{j},'0110') codificacionHex = strcat(codificacionHex,'6'); elseif strcmp(grupos4Bits{j},'0111') codificacionHex = strcat(codificacionHex,'7'); elseif strcmp(grupos4Bits{j},'1000') codificacionHex = strcat(codificacionHex,'8'); elseif strcmp(grupos4Bits{j},'1001') codificacionHex = strcat(codificacionHex,'9'); elseif strcmp(grupos4Bits{j},'1010') codificacionHex = strcat(codificacionHex,'A'); elseif strcmp(grupos4Bits{j},'1011') codificacionHex = strcat(codificacionHex,'B'); elseif strcmp(grupos4Bits{j},'1100') codificacionHex = strcat(codificacionHex,'C'); elseif strcmp(grupos4Bits{j},'1101') codificacionHex = strcat(codificacionHex,'D'); elseif strcmp(grupos4Bits{j},'1110') codificacionHex = strcat(codificacionHex,'E'); elseif strcmp(grupos4Bits{j},'1111') codificacionHex = strcat(codificacionHex,'F'); end end %Se resuelve el codigo expresando la funcionalidad segun el texto marcado fclose(fileID); clear ans;