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

波变换

开发平台:

Matlab

  1. function [Ts,Ds,x] = wpjoin(Ts,Ds,node)
  2. %WPJOIN Recompose wavelet packet.
  3. %   WPJOIN updates the tree and data structures after the
  4. %   recomposition of a node.
  5. %
  6. %   [T,D] = WPJOIN(T,D,N) returns the modified tree
  7. %   structure T and the modified data structure D, (see
  8. %   MAKETREE) corresponding to a recomposition of the node N.
  9. %   [T,D,X] = WPJOIN(T,D,N) also returns the coefficients
  10. %   of the node.
  11. %
  12. %   [T,D] = WPJOIN(T,D) is equivalent to
  13. %   [T,D] = WPJOIN(T,D,0).
  14. %   
  15. %   [T,D,X] = WPJOIN(T,D) is equivalent to
  16. %   [T,D,X] = WPJOIN(T,D,0).
  17. %
  18. %   See also MAKETREE, WPDEC, WPDEC2, WPSPLT.
  19. %   M. Misiti, Y. Misiti, G. Oppenheim, J.M. Poggi 12-Mar-96.
  20. %   Last Revision: 04-May-1999.
  21. %   Copyright 1995-2002 The MathWorks, Inc.
  22. % $Revision: 1.11 $
  23. % Check arguments.
  24. if errargn(mfilename,nargin,[2:3],nargout,[1:3]), error('*'); end
  25. if nargin == 2, node = 0; end
  26. order    = wtreemgr('order',Ts);
  27. depth    = wtreemgr('depth',Ts);
  28. node     = depo2ind(order,node);
  29. num_pack = wtreemgr('istnode',Ts,node);
  30. % For a terminal node
  31. %%%%%%%%%%%%%%%%%%%%%
  32. if num_pack ~= 0
  33.     x = wdatamgr('rcfs',Ds,Ts,num_pack);
  34.     return
  35. end
  36. tab       = wtreemgr('table',Ts,0);
  37. [row,col] = find(tab==node);
  38. icol = find(col>2);
  39. rec = tab(row(icol),2:max(col(icol)));
  40. rec = rec(:);
  41. rec = rec(find(rec>node));
  42. if length(rec>1);
  43.     rec = sort(rec);
  44.     K   = [1;find(diff(rec)~=0)+1];
  45.     rec = rec(K);
  46. end
  47. rec    = wrev([node;rec])';
  48. lrec   = length(rec);
  49. ord    = [1:order];
  50. i_fils = order*(rec(ones(1,order),:))'+ ord(ones(1,lrec),:);
  51. for k = 1:lrec
  52.     for j = 1:order
  53.         [r,c] = find(tab==i_fils(k,j));
  54.         i_fils(k,j) = min(r);   % indices
  55.     end
  56. end
  57. i_size = ind2depo(order,rec')+1;
  58. % Recomposition
  59. %%%%%%%%%%%%%%%
  60. filter = wdatamgr('read_wave',Ds);
  61. [Lo_R,Hi_R] = wfilters(filter,'r');
  62. sizes  = wdatamgr('rsizes',Ds);
  63. for k = 1:length(rec)
  64.     left_child = i_fils(k,1);
  65.     if order == 2
  66.         % [a,d,beg,len] = wdatamgr('rmcfs',Ds,Ts,left_child);
  67.         %--------------------------------------------------------
  68.         beg = sum(Ts(2,1:left_child-1))+1;
  69.         len = Ts(2,left_child);
  70.         beg = beg+3;        % shift for dim & type of structure
  71.         a   = Ds(beg:beg+len-1);
  72.         d   = Ds(beg+len:beg+len+len-1);
  73.         sx  = sizes(i_size(k));
  74.         x   = idwt(a,d,Lo_R,Hi_R,sx);
  75.     else
  76.         % [a,h,v,d,beg,len] = wdatamgr('rmcfs',Ds,Ts,left_child);
  77.         %-------------------------------------------------------------
  78.         % attention prod([])=1
  79.         if left_child ~= 1
  80.             beg = sum(prod(Ts(2:3,1:left_child-1)))+1;
  81.         else
  82.             beg = 1;
  83.         end
  84.         len = prod(Ts(2:3,left_child));
  85.         beg = beg+3;        % shift for dim & type of structure
  86.         r   = Ts(2,left_child);
  87.         c   = Ts(3,left_child);
  88.         lim = beg:len:beg+order*len;
  89.         a   = zeros(r,c); a(:) = Ds(lim(1):lim(2)-1);
  90.         h   = zeros(r,c); h(:) = Ds(lim(2):lim(3)-1);
  91.         v   = zeros(r,c); v(:) = Ds(lim(3):lim(4)-1);
  92.         d   = zeros(r,c); d(:) = Ds(lim(4):lim(5)-1);
  93.         sx  = sizes(:,i_size(k));
  94.         x   = idwt2(a,h,v,d,Lo_R,Hi_R,sx);
  95.     end
  96.     % Ds = wdatamgr('replace',Ds,x(:)',beg,beg+order*len-1);
  97.     %-----------------------------------------------------------
  98.     first = beg;
  99.     last  = beg+order*len-1;
  100.     Ds    = [Ds(1:first-1) x(:)' Ds(last+1:length(Ds))];
  101.     Ds(2) = Ds(2)-order*len+prod(sx);
  102.     % insert_st = [rec(k) zeros(1,order-1);sx zeros(order/2,order-1)];
  103.     % Ts = wtreemgr('change',Ts,insert_st,i_fils(k,:));
  104.     %-----------------------------------------------------------------
  105.     Ts(:,i_fils(k,:)) = [rec(k) zeros(1,order-1);sx zeros(order/2,order-1)];
  106. end
  107. %
  108. % Modification of Tree and Data Structures.
  109. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  110. Ts = wtreemgr('restore',Ts);
  111. new_depth = wtreemgr('depth',Ts);
  112. if new_depth < depth
  113.     nbs = size(sizes,2)-(depth-new_depth);
  114.     Ds  = wdatamgr('wsizes',Ds,sizes(:,1:nbs));
  115.     nbn = (order^(new_depth+1)-1)/(order-1);
  116.     ent = wdatamgr('read_ent',Ds,[0:nbn-1]');
  117.     Ds  = wdatamgr('write_ent',Ds,ent);
  118.     ent = wdatamgr('read_ento',Ds,[0:nbn-1]');
  119.     Ds  = wdatamgr('write_ento',Ds,ent);
  120. end