www.pudn.com > 666bandelets_toolbox.zip > reorder_coefs.m


function y = reorder_coefs(x, Jmin ,dir) 
 
% reorder_coefs - reorder the wavelet coefficients. 
% 
%   y = reorder_coefs(x,Jmin ,dir); 
% 
%   Reorder the 1D or 2D wavelet coef either 
%   from 'in place' to 'ordered by scale' (if 'dir==1') 
%   or from 'ordered by scale' to 'in place' (if 'dir==-1'). 
% 
%   IMPORTANT: for the moment, works only on power of two data length. 
% 
%   Copyright (c) 2005 Gabriel Peyré 
 
if nargin<2 
    error('Not enough arguments'); 
end 
if nargin==2 
    dir = +1; 
end 
 
 
% number of dimension 
ndim = length(size(x)); 
if ndim==2 && ( size(x,2)==1 || size(x,1)==1 ) 
    ndim=1; 
end 
 
if ndim==1 
    x = x(:); 
end 
n = size(x,1); 
 
Jmax = log2(n)-1; 
 
if ndim==1 
    if( dir==1 ) 
        % from inplace to mallat 
        y = []; 
        for j=0:Jmax-Jmin 
            % select 
            sel = 1:2^j:n;  % select the coarse coef from previous step 
            xs = x(sel); 
            % split 
            nn = length(xs); 
            s = xs( 1:2:nn );  % coarse 
            d = xs( 2:2:nn );  % details 
            y = [d;y]; 
        end 
        y = [s;y]; 
    else 
        % from Mallat to inplace 
        s = x; 
        y = x; 
        for j=0:Jmax-Jmin 
            y(1:2^(j+1):end) = s(1:end/2);  % coarse 
            y(1+2^j:2^(j+1):end) = s(end/2+1:end);  % coarse 
            s = s(1:end/2); 
        end 
    end 
else 
    if( dir==1 ) 
        % from inplace to mallat 
        s = x; 
        y = x; 
        for j=0:Jmax-Jmin 
            y(1:end/2^(j+1),1:end/2^(j+1)) = s(1:2:end, 1:2:end);  % coarse/coarse 
            y(1:end/2^(j+1),end/2^(j+1)+1:end/2^j) = s(1:2:end, 2:2:end);  % coarse/fine 
            y(end/2^(j+1)+1:end/2^j,1:end/2^(j+1)) = s(2:2:end, 1:2:end);  % fine/coarse 
            y(end/2^(j+1)+1:end/2^j,end/2^(j+1)+1:end/2^j) = s(2:2:end, 2:2:end);  % fine/fine 
            s = s(1:2:end, 1:2:end); 
        end 
    else 
        % from Mallat to inplace 
        s = x; 
        y = x; 
        for j=0:Jmax-Jmin 
            y(1:2^(j+1):end, 1:2^(j+1):end) = s(1:end/2, 1:end/2);  % coarse/coarse 
            y(1:2^(j+1):end, 1+2^j:2^(j+1):end) = s(1:end/2, end/2+1:end);  % coarse/fine 
            y(1+2^j:2^(j+1):end, 1:2^(j+1):end) = s(end/2+1:end, 1:end/2);  % fine/coarse 
            y(1+2^j:2^(j+1):end, 1+2^j:2^(j+1):end) = s(end/2+1:end, end/2+1:end);  % fine/fine 
            s = s(1:end/2, 1:end/2); 
        end 
    end 
end