Está en la página 1de 3

Actividad Codificación de Huffman

Nombre: Arnaldo Ugarte Pentón


Matrícula: 934703

Para el siguiente informe se procede a realizar un análisis del archivo


4LETTERS.WOR dado en la página web de la asignatura el cual contiene un conjunto
de letras o símbolos. Según las órdenes de la actividad “Codificación de Huffman” se
propone un pequeño programa donde se codifica y se decodifica los carateres según
la codificación de huffman de varianza mínima tomando cada símbolo como un
caracter y posteriormente estos se comparan tomando los símbolos como las
combinaciones de dos carateres.

S1 ->Arreglo de celdas alfanuméricas tomados los símbolos como 1 carácter


P1 –> Arreglo de la probabilidad de celdas alfanuméricas tomados los símbolos como
1 carácter

Codigo para llenar los arreglos S1 y P1


for i = 1:1:256
if (ASCII1(i) ~= 0)
S1(j) = i; % guardando el caracter alfanumérico(símbolo) en S[j]
P1(j) = ASCII1(i)/length(lettersTransposed); % Guardando la frecuencia relativa en P[j]
j = j + 1;
end
end

Codigo para la codificación/decodificación del fichero 4LETTERS.WOR


AvLenght1 = 0;
[DICT1,AvLenght1] = huffmandict(S1,P1); %Hallando el diccionario
ENCO1 = huffmanenco(lettersTransposed,DICT1); %Codificando la fuente
RazonCompresion1 = length(ENCO1)/(length(lettersTransposed)*8);
DECO1 = huffmandeco(ENCO1,DICT1); %Decodificando
redundancia1 = AvLenght1 - H1; %Calculando redundancia
Eficiencia1 = (1 - redundancia1/H1)*100; %calculando Eficiencia

No se muestra el código para comprobar que el texto decodificado es idéntico al


original porque se supone que lo sea ya que las funciones de
codificación/decodificación están implementadas como una función por defecto de
Matlab.
S2 -> Arreglo de celdas alfanuméricas tomados los símbolos como 2 caracteres
P2 -> Arreglo de la probabilidad de las celdas alfanuméricas tomados los símbolos
como 2 caracteres
Para esta segunda parte del código se tomaron los caracteres de dos en dos
agrupándolo como un solo símbolo, para guardar esto en un array de enteros de una
dimensión se hizo un OR lógico entre el primer caracter encontrado desplazado a la
izquierda 8 bits y el segundo caracter tomados de dos en dos en el texto.
Ejemplo
a -> 97 -> 01100001 z -> 122 ->01111010

a desplazado 8 bit a la izquierda -> 0110000100000000


z -> 01111010 OR
az ->0110000001111010

Para esto se utilizó a siguiente función


bitor(bitshift(uint16(lettersTransposed(i)),8),uint16(lettersTransposed(i+1)))
Donde i es la posición del primer caracter y i+1 es la posición del segundo, esto se
insertó dentro de un ciclo for que recorre todo el texto y se guardó dentro de un array
llamado lettersTransposed2

j = 1;
for i = 1:1:256*256
if (ASCII2(i) ~= 0) %se descarta el cero porque log0 no existe
Prob = ASCII2(i)/length(lettersTransposed2);
H2 = H2 + Prob*log2(1/Prob); %calculando entropía de segundo orden
P2(j) = Prob; %Llenando el arreglo P2[]
S2(j) = i; %Llenando el arreglo S2[]
j = j + 1;
end
end

Codigo para la codificación/decodificación del fichero 4LETTERS.WOR


AvLenght2 = 0;
[DICT2,AvLenght2] = huffmandict(S2,P2); %Hallando el diccionario
ENCO2 = huffmanenco(lettersTransposed2,DICT2); %Codificando la fuente
RazonCompresion2 = length(ENCO2)/(length(lettersTransposed2)*16);
DECO2 = huffmandeco(ENCO2,DICT2); %decodificandola1
redundancia2 = AvLenght2 - H2;
Eficiencia2 = (1 - redundancia2/H2)*100;

Después hay que hacerle una segunda decodificación porque los símbolos están
agrupados como 2 caracteres cada uno de 8 bits dando un símbolo de 16 bits. Se
Utiliza el siguiente código.

for i = 1:1:length(lettersTransposed2)
a = bitshift(uint16(lettersTransposed2(i)),-8);
b = bitshift(uint16(lettersTransposed2(i)),+8);
b = bitshift(uint16(b),-8);
FinalDECO2(i*2-1) = a;
FinalDECO2(i*2) = b;
end

Al igual que en la primera parte del texto no se muestra el código para comprobar que
el texto decodificado es idéntico al original porque se supone que lo sea ya que las
funciones de codificación/decodificación están implementadas como una función por
defecto de Matlab.

Con el programa se obtienen los siguientes resultados.


H1 = 4.591119e+00
H2 = 7.972497e+00
Longitud media 1 = 4.6e+00
Longitud media 2 = 8.0e+00
Razon de compresion 1 = 5.78e-01
Razón de Compresión 2 = 5.00e-01
Redundancia 1 = 3.1e-02
Redundancia 2 = 3.1e-02
Eficiencia 1 = 9.932e+01
Eficiencia 2 = 9.961e+01

Como se puede observar con los resultados anteriores en la codificación de Huffman


es más eficiente tomar los símbolos como caracteres de 2 en 2, así como que debe
mejorar la eficiencia, razón de compresión y redundancia si se toman más conjuntos
de caracteres como 1 símbolo. Al igual que la entropía se debería comportar
decreciente a partir de cierto punto ya que si todos los caracteres del texto se toman
como un símbolo la entropía debería ser la mínima.

También podría gustarte