RETO MES DE ABRIL .............................docx
Codigo huffman (yango colmenares)
1. 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
2. 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;
3. 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
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 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')