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

波变换

开发平台:

Matlab

  1. function [out1,out2,out3,out4,out5,out6] = ...
  2.                         wdatamgr(opt,in2,in3,in4,in5,in6,in7,in8,in9,in10)
  3. %WDATAMGR Manager for data structure.
  4. %   WDATAMGR is a type of data manager for the wavelet packet
  5. %   tree structure.
  6. %   [OUT1,OUT2] = WDATAMGR(O,D,IN3,IN4,IN5) where D is the
  7. %   Data Structure and O is a string option.
  8. %   The possible options are:
  9. %   'write_cfs': writes coefficients for a terminal node,
  10. %     data  = wdatamgr('write_cfs',data,tree,node,coefs)
  11. %   'read_cfs'   : reads coefficients for a terminal node,
  12. %     coefs = wdatamgr('read_cfs',data,tree,node);
  13. %   'read_ent'   : reads the entropy vector,
  14. %     ent   = wdatamgr('read_ent',data,nodes)        
  15. %   'read_ento'  : reads the optimal entropy vector,
  16. %     ento  = wdatamgr('read_ento',data,nodes)
  17. %   'read_tp_ent': reads the type and the parameter for entropy,
  18. %     [type_ent,param] = wdatamgr('read_tp_ent',data)
  19. %   'read_wave'  : reads the name of wavelet,
  20. %     wave = wdatamgr('read_wave',data)
  21. %   'write_wave': writes the name of wavelet,
  22. %     data  = wdatamgr('write_wave',data,wname)
  23. %
  24. %   See also WPDEC, WPDEC2, WTREEMGR.
  25. %   M. Misiti, Y. Misiti, G. Oppenheim, J.M. Poggi 12-Mar-96.
  26. %   Last Revision: 15-Jul-1999.
  27. %   Copyright 1995-2002 The MathWorks, Inc.
  28. % $Revision: 1.11 $
  29. %   INTERNAL OPTIONS :
  30. %-------------------------
  31. % 'beglen'      : begin and length of coefficient vector.
  32. % 'order'       : tree order.
  33. %
  34. % 'write'       : writes initial Data Structure.
  35. % 'wcfs'        : writes coefs. for a ter. node
  36. %                   (index in tree structure)
  37. % 'wsizes'      : writes the lengths vector.
  38. % 'write_ent'   : writes the entropy vector.
  39. %     data  = wdatamgr('write_ent',data,ent,nodes) or
  40. % 'write_ento'  : writes the optimal entropy vector.
  41. %     data  = wdatamgr('write_ento',data,ento,nodes)
  42. %
  43. % 'replace'     : replaces part of coefficients.
  44. %                   (first and last indexes in tree structure)
  45. % 'change'      : replaces part of coefficients.
  46. %                   (indexes in tree structure)
  47. %
  48. % 'rcfs'        : reads coefs. for a ter. node (index in tree structure)
  49. % 'rmcfs'       : reads coefs. for terminal "brothers" nodes
  50. %                   (index of left one in tree structure)
  51. % 'rallcfs'     : reads all coefficients.
  52. % 'rsizes'      : reads the size of packets at at all depths.
  53. %
  54. % 'write_tp_ent': writes the type and the parameter for entropy.
  55. %     data   = wdatamgr('write_tp_ent',data,type_ent,param)
  56. % Check arguments.
  57. if errargn(mfilename,nargin,[2:10],nargout,[0:6]), error('*'); end
  58. if strcmp(opt,'beglen')
  59.     % in2 = order
  60.     % in3 = tree structure --  in4 = k (index in tree structure)
  61.     if in2 == 2
  62.         out1 = sum(in3(2,1:in4-1));
  63.         out2 = in3(2,in4);
  64.     elseif in2 == 4
  65.         % attention prod([])=1
  66.         if in4 ~= 1
  67.             out1 = sum(prod(in3(2:3,1:in4-1)));
  68.         else
  69.             out1 = 0;
  70.         end
  71.         out2 = prod(in3(2:3,in4));
  72.     end
  73.     out1 = out1+1;
  74.     return;
  75. end
  76. if strcmp(opt,'write')
  77.     % Data Structure
  78.     %--------------------------
  79.     % data = [ 
  80.     %       cfs(:)'         in2
  81.     %       sizes           in3
  82.     %       x_shape         in4
  83.     %       ent             in5
  84.     %       ent_opt         in6
  85.     %       parameter       in7
  86.     %       type_ent        in8
  87.     %       filter          in9 
  88.     %       order           in10
  89.     %       ]
  90.     %--------------------------
  91.     if strcmp(lower(in8),'user')
  92.         in8 = ['user' '&' in7];
  93.         in7 = 0;
  94.     end
  95.     out1 = [];
  96.     out1 = wmemutil('add',out1,in3);
  97.     out1 = wmemutil('add',out1,in4);
  98.     out1 = wmemutil('add',out1,in5);
  99.     out1 = wmemutil('add',out1,in6);
  100.     out1 = wmemutil('add',out1,in7);
  101.     out1 = wmemutil('add',out1,in8);
  102.     out1 = wmemutil('add',out1,in9);
  103.     out1 = wmemutil('add',out1,in10);
  104.     out1 = wmemutil('add',out1,in2,1);
  105.     return;
  106. end
  107. ind_cfs       = 1;
  108. ind_sizes     = 2;
  109. ind_x_shape   = 3;
  110. ind_ent       = 4;
  111. ind_ento      = 5;
  112. ind_parameter = 6;
  113. ind_type_ent  = 7;
  114. ind_filter    = 8;
  115. ind_order     = 9;
  116. % in2 = Data Structure for all remaining options
  117. %------------------------------------------------
  118. order = wmemutil('get',in2,ind_order);
  119. switch opt
  120.     case 'order'
  121.         out1 = order;
  122.     case 'rcfs'
  123.         % in3  = tree structure  -- in4 = index in tree structure
  124.         % out1 = x    out2 = beg    out3 = len
  125.         if in4>wtreemgr('ntnode',in3)
  126.             errargt(mfilename,'invalid packet number','msg');
  127.             return;
  128.         end
  129.         tmp = wmemutil('get',in2,ind_cfs);
  130.         [out2,out3] = wdatamgr('beglen',order,in3,in4);
  131.         if order==4
  132.             out1    = zeros(in3(2,in4),in3(3,in4));
  133.             out1(:) = tmp(out2:out2+out3-1);
  134.         else
  135.             out1 = tmp(out2:out2+out3-1);
  136.         end
  137.     case 'rmcfs'
  138.         % in3  = tree structure  -- in4 = first-child (index in tree structure)
  139.         % if order = 2 : 
  140.         % out1 = a ; out2 = d ; out3 = beg ; out4 = len;
  141.         % if order = 4 : 
  142.         % out1 = a ; out2 = h ; out3 = v ; out4 = d ; out5 = beg ; out6 = len;
  143.         cfs = wmemutil('get',in2,ind_cfs);
  144.         if order == 2
  145.             [out3,out4] = wdatamgr('beglen',order,in3,in4);
  146.             out1 = cfs(out3:out3+out4-1);
  147.             out2 = cfs(out3+out4:out3+out4+out4-1);
  148.         elseif order == 4
  149.             r = in3(2,in4); c = in3(3,in4);
  150.             [out5,out6] = wdatamgr('beglen',order,in3,in4);
  151.             lim  = out5:out6:out5+order*out6;
  152.             out1 = zeros(r,c); out1(:) = cfs(lim(1):lim(2)-1);
  153.             out2 = zeros(r,c); out2(:) = cfs(lim(2):lim(3)-1);
  154.             out3 = zeros(r,c); out3(:) = cfs(lim(3):lim(4)-1);
  155.             out4 = zeros(r,c); out4(:) = cfs(lim(4):lim(5)-1);
  156.         end
  157.     case 'rallcfs'
  158.         out1 = wmemutil('get',in2,ind_cfs);
  159.     case 'read_cfs'
  160.         % in3 = tree structure
  161.         % in4 = terminal node (index num or depth/pos num)
  162.         % out1 = coefs
  163.         pack_exist = wtreemgr('istnode',in3,in4);
  164.         if pack_exist ~= 0
  165.             out1 = wdatamgr('rcfs',in2,in3,pack_exist);
  166.         else
  167.             errargt(mfilename,'invalid node value','msg');
  168.             error('*');
  169.         end
  170.     case 'read_ent'
  171.         out1 = wmemutil('get',in2,ind_ent);
  172.         if nargin==3
  173.             in3 = 1+depo2ind(order,in3);
  174.             out1 = out1(in3);
  175.         end
  176.     case 'read_ento'
  177.         out1 = wmemutil('get',in2,ind_ento);
  178.         if nargin==3
  179.             in3 = 1+depo2ind(order,in3);
  180.             out1 = out1(in3);
  181.         end
  182.     case 'read_tp_ent'
  183.         out1 = wmemutil('get',in2,ind_type_ent);
  184.         k = find(out1=='&');
  185.         if k>0
  186.             out2 = out1(k+1:length(out1));
  187.             out1 = out1(1:k-1);
  188.             if ~strcmp(out1,'user')
  189.                 errargt(mfilename,'invalid type of entropy','msg');
  190.                 error('*');  
  191.             end
  192.         else
  193.             out2 = wmemutil('get',in2,ind_parameter);
  194.         end
  195.     case 'read_wave'
  196.         out1 = wmemutil('get',in2,ind_filter);
  197.     case 'rsizes'
  198.         out1    = wmemutil('get',in2,ind_sizes);
  199.         x_shape = wmemutil('get',in2,ind_x_shape);
  200.         if strcmp(x_shape,'m')
  201.             out1 = reshape(out1,2,prod(size(out1))/2);
  202.         end
  203.     case 'write_cfs'
  204.         % in3 = tree structure
  205.         % in4 = terminal node (index num or depth/pos num)
  206.         % in5 = coefs
  207.         pack_exist = wtreemgr('istnode',in3,in4);
  208.         if pack_exist ~= 0
  209.             pack_exist = depo2ind(order,pack_exist);
  210.             [beg,len] = wdatamgr('beglen',order,in3,pack_exist);
  211.             if order == 4
  212.                 r = in3(2,pack_exist); c = in3(3,pack_exist);
  213.             else 
  214.                 r = 1;
  215.                 c = in3(2,pack_exist);
  216.             end
  217.             if find([r c]~=size(in5))
  218.                 errargt(mfilename,'invalid size for coefs','msg');
  219.                 error('*');
  220.             else
  221.                 out1 = wdatamgr('replace',in2,in5(:)',beg,beg+len-1);
  222.             end
  223.         else
  224.             errargt(mfilename,'invalid node value','msg');
  225.             error('*');
  226.         end
  227.     case 'wcfs'
  228.         % in3  = tree structure  -- in4 = index in tree structure -- in5 = cfs
  229.         % out1 = new data
  230.         [beg,len] = wdatamgr('beglen',order,in3,in4);
  231.         out1 = wdatamgr('replace',in2,in5,beg,beg+len-1);
  232.     case 'write_ent'
  233.         if nargin==3
  234.             out1 = wmemutil('set',in2,ind_ent,in3);
  235.         elseif nargin==4
  236.             old  = wmemutil('get',in2,ind_ent);
  237.             old(in4+1) = in3;
  238.             out1 = wmemutil('set',in2,ind_ent,old);
  239.         end
  240.     case 'write_ento'
  241.         if nargin==3
  242.             out1 = wmemutil('set',in2,ind_ento,in3);
  243.         elseif nargin==4
  244.             old  = wmemutil('get',in2,ind_ento);
  245.             old(in4+1) = in3;
  246.             out1 = wmemutil('set',in2,ind_ento,old);
  247.         end
  248.     case 'write_wave'
  249.         out1 = wmemutil('set',in2,ind_filter,in3);
  250.     case 'wsizes'
  251.         in3  = in3(:)';
  252.         out1 = wmemutil('set',in2,ind_sizes,in3);
  253.     case 'replace'
  254.         % in3 = insert        in4,in5 = indices of replaced first,last
  255.         if nargin==3
  256.             out1 = wmemutil('set',in2,ind_cfs,in3);
  257.         else
  258.             cfs  = wmemutil('get',in2,ind_cfs);
  259.             cfs  = [cfs(1:in4-1) in3 cfs(in5+1:length(cfs))];
  260.             out1 = wmemutil('set',in2,ind_cfs,cfs);
  261.         end
  262.     case 'change'
  263.         % in3 = new values        in4 = indices of replaced
  264.         if nargin==3
  265.             out1 = in3;
  266.         else
  267.             out1 = in2;
  268.             out1(in4) = in3;
  269.         end
  270.     case 'write_tp_ent'
  271.         if nargin==3 , in4 = 0; end
  272.         if strcmp(lower(in3),'user')
  273.             in3 = ['user' '&' in4];
  274.             in4 = 0;
  275.         end
  276.         out1 = wmemutil('set',in2,ind_type_ent,in3);
  277.         out1 = wmemutil('set',out1,ind_parameter,in4);
  278.     otherwise
  279.         errargt(mfilename,'unknown option','msg'); error('*');
  280. end