huffman.m
上传用户:cxsjwj
上传日期:2022-08-09
资源大小:34k
文件大小:3k
源码类别:

matlab例程

开发平台:

Matlab

  1. function CODE = huffman(p)
  2. %HUFFMAN Builds a variable-length Huffman code for a symbol source.
  3. %   CODE = HUFFMAN(P) returns a Huffman code as binary strings in
  4. %   cell array CODE for input symbol probability vector P. Each word
  5. %   in CODE corresponds to a symbol whose probability is at the
  6. %   corresponding index of P. 
  7. %   霍夫曼建立一个可变长度的霍夫曼编码的一个象征来源。 
  8. %   代码=霍夫曼(规划)返回一个霍夫曼编码的二进制字符串 
  9. %   单元数组码输入符号概率矢量P每个字 
  10. % ,相当于在代码中的一个象征,其概率在 
  11. % ,相应的指数P 
  12. %   Based on huffman5 by Sean Danaher, University of Northumbria,
  13. %   Newcastle UK. Available at the MATLAB Central File Exchange:
  14. %   Category General DSP in Signal Processing and Communications. 
  15. %   Copyright 2002-2004 R. C. Gonzalez, R. E. Woods, & S. L. Eddins
  16. %   Digital Image Processing Using MATLAB, Prentice-Hall, 2004
  17. %   $Revision: 1.5 $  $Date: 2003/10/26 18:37:16 $
  18. % Check the input arguments for reasonableness.
  19. error(nargchk(1, 1, nargin));
  20. if (ndims(p) ~= 2) | (min(size(p)) > 1) | ~isreal(p) | ~isnumeric(p)
  21.    error('P must be a real numeric vector.');     
  22. end
  23.    
  24. % Global variable surviving all recursions of function 'makecode'
  25. global CODE
  26. CODE = cell(length(p), 1);  % Init the global cell array
  27.                             
  28. if length(p) > 1            % When more than one symbol ...
  29.    p = p / sum(p);          % Normalize the input probabilities
  30.    s = reduce(p);           % Do Huffman source symbol reductions
  31.    makecode(s, []);         % Recursively generate the code
  32. else  
  33.    CODE = {'1'};            % Else, trivial one symbol case!
  34. end;   
  35. %-------------------------------------------------------------------%
  36. function s = reduce(p);
  37. % Create a Huffman source reduction tree in a MATLAB cell structure
  38. % by performing source symbol reductions until there are only two
  39. % reduced symbols remaining
  40. s = cell(length(p), 1);
  41. % Generate a starting tree with symbol nodes 1, 2, 3, ... to 
  42. % reference the symbol probabilities.
  43. for i = 1:length(p)
  44.    s{i} = i; 
  45. end
  46. while numel(s) > 2
  47.    [p, i] = sort(p);    % Sort the symbol probabilities
  48.    p(2) = p(1) + p(2);  % Merge the 2 lowest probabilities
  49.    p(1) = [];           % and prune the lowest one
  50.    
  51.    s = s(i);            % Reorder tree for new probabilities
  52.    s{2} = {s{1}, s{2}}; % and merge & prune its nodes
  53.    s(1) = [];           % to match the probabilitiesb
  54. end
  55. %-------------------------------------------------------------------%
  56. function makecode(sc, codeword)
  57. % Scan the nodes of a Huffman source reduction tree recursively to
  58. % generate the indicated variable length code words.
  59. % Global variable surviving all recursive calls
  60. global CODE                           
  61. if isa(sc, 'cell')                   % For cell array nodes,
  62.    makecode(sc{1}, [codeword 0]);    % add a 0 if the 1st element
  63.    makecode(sc{2}, [codeword 1]);    % or a 1 if the 2nd
  64. else                                 % For leaf (numeric) nodes,
  65.    CODE{sc} = char('0' + codeword);  % create a char code string
  66. end