Está en la página 1de 2

Codificador Huffman

hnoguera.wordpress.com

Archivo asignar_codigos.m
function y = asignar_codigos(arbol, n_simbolos)
% Autor: Herminio Noguera Ruiz.
% Asignacin de cdigos a cada smbolo.
global y
y = cell(n_simbolos, 1);
asignar_codigos2(arbol, []);

Archivo asignar_codigos2.m
% Autor: Herminio Noguera Ruiz.
function asignar_codigos2(arbol, dum)
% Autor: Herminio Noguera Ruiz.
% Funcin llamada por asignar_codigos.
% Usa recursividad para ir asignando cdigos.
global y
if isa(arbol, 'cell')
asignar_codigos2(arbol{1}, [dum 0]);
asignar_codigos2(arbol{2}, [dum 1]);
else
y{arbol} = setstr(48+dum);
end

Archivo huff.m
% Autor: Herminio Noguera Ruiz.
function arbol = huff(Pi);
%
%
%
%
%
%
%
%
%

------------------------------------------------------------------------Autor: Herminio Noguera Ruiz.


Esta funcin crea el rbol de Huffman.
Simula una estructura de rbol usando estructura de celdas anidadas.
'Pi' es el vector con las probabilidades o nmero de apariencias de los
simbolos fuente.
'arbol' es el rbol de Huffman.
-------------------------------------------------------------------------

arbol = cell(length(Pi),1);
% Genera la estructura de celdas.
for i = 1:length(Pi)
% Rellena las celdas segn el nmero
arbol{i} = i;
% de smbolos en el alfabeto.
end
while size(arbol)-2
% Se repite hasta que solo haya dos ramas.
[Pi,i] = sort(Pi);
% Ordena las probabilidades de forma ascendente.
arbol = arbol(i);
% Reordena el rbol.
arbol{2} = {arbol{1},arbol{2}};
% Une las ramas 1 y 2
arbol(1)=[];
% y reduce.
Pi(2) = Pi(1)+Pi(2);
% Une probabilidades.
Pi(1)=[];
end

Archivo huffman.m
% Autor: Herminio Noguera Ruiz.
function [codigo, compresion] = huffman (Pi);
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%

------------------------------------------------------------------------Autor: Herminio Noguera Ruiz.


CODIFICADOR HUFFMAN
------------------Entrada:
-------'Pi' es el vector de probabilidades de los smbolos (ej. Pi=[0.4 0.2 0.2 0.1 0.1])
Tambin puede introducirse Pi como vector de ocurrencias de cada smbolo (ej. Pi=[45 5 6 80 23])
Salida:
------'codigo' matriz con el cdigo para cada smbolo en formato cadena de
ceros y unos.
'compresion' variable que almacena la tasa de compresin del cdigo.
-------------------------------------------------------------------------

Pi = Pi(:)/sum(Pi); % Normaliza las probabilidades y las coloca como vector columna.


arbol = huff(Pi);
codigo = char(asignar_codigos(arbol, length(Pi)));
compresion = ceil(log(length(Pi))/log(2))/ (sum(codigo' ~= ' ')*Pi);

Archivo test.m
% Autor: Herminio Noguera Ruiz.
% Test del algoritmo codificador de Cdigo Huffman.
% ------------------------------------------------Pi = [5 7 9 15 32 99 78];
fprintf('Nmero de apariencias de smbolos fuente:\n');
fprintf('-----------------------------------------\n\n');
for i=1:length(Pi)
fprintf('\tSmbolo %d: %d\n', i, Pi(i));
end
[codigo, compresion] = huffman (Pi);
codigo
compresion

hnoguera.wordpress.com

También podría gustarte