besttree.m
上传用户:haiyisale
上传日期:2013-01-09
资源大小:3246k
文件大小:2k
源码类别:

波变换

开发平台:

Matlab

  1. function [Ts,Ds,ento,n2m] = besttree(Ts,Ds)
  2. %BESTTREE Best tree (wavelet packet).
  3. %   BESTTREE computes the optimal sub-tree of an initial tree
  4. %   with respect to an entropy type criterion.
  5. %   The resulting tree may be much smaller than the initial one.
  6. %
  7. %   [T,D] = BESTTREE(T,D) computes the modified tree
  8. %   structure T and data structure D, corresponding to
  9. %   the best entropy value.
  10. %
  11. %   [T,D,E] = BESTTREE(T,D) returns the best tree T,
  12. %   data structure D and in addition, the best entropy value E.
  13. %
  14. %   [T,D,E,N] = BESTTREE(T,D) returns the best tree T,
  15. %   data structure D, entropy value E and in addition,
  16. %   the vector N containing the indices of the merged nodes.
  17. %   See also BESTLEVT, MAKETREE, WENTROPY, WPDEC, WPDEC2.
  18. %   M. Misiti, Y. Misiti, G. Oppenheim, J.M. Poggi 12-Mar-96.
  19. %   Last Revision: 05-May-1999.
  20. %   Copyright 1995-2002 The MathWorks, Inc.
  21. %   $Revision: 1.11 $
  22. % Check arguments.
  23. if errargn(mfilename,nargin,[2],nargout,[2:4]), error('*'); end
  24. ent  = wdatamgr('read_ent',Ds);
  25. ento = NaN;
  26. ento = ento(ones(size(ent)));
  27. rec  = ento;
  28. an_ind = wtreemgr('allnodes',Ts)+1;
  29. tn_ind = wtreemgr('tnodes',Ts)+1;
  30. rec(an_ind) = 2;
  31. rec(tn_ind) = 1;
  32. ento(tn_ind) = ent(tn_ind);
  33. order = wtreemgr('order',Ts);
  34. J = wrev(find(rec==2));
  35. for ind_n = J
  36.     ind_child = [1:order]+(ind_n-1)*order+1;
  37.     echild = sum(ento(ind_child));
  38.     if echild < ent(ind_n)
  39.         ento(ind_n) = echild;
  40.         rec(ind_n) = 2;
  41.     else
  42.         ento(ind_n) = ent(ind_n);
  43.         rec(ind_n) = rec(ind_child(1))+2;
  44.         rec(ind_child) = -rec(ind_child);
  45.     end
  46. end
  47. n2m = wrev(find(rec>2))-1;
  48. for n = n2m
  49.     [Ts,Ds] = wpjoin(Ts,Ds,n);
  50. end
  51. depth = wtreemgr('depth',Ts);
  52. nbn   = (order^(depth+1)-1)/(order-1);       
  53. ento  = ento(1:nbn);
  54. Ds    = wdatamgr('write_ento',Ds,ento);