www.pudn.com > nsct_toolbox.rar > nsdfbdec.m, change:2005-01-20,size:5046b


function y = nsdfbdec( x, dfilter, clevels ) 
% NSDFBDEC   Nonsubsampled directional filter bank decomposition. 
%   NSDFBDEC Decompose the image X by a nonsubsampled directional filter bank 
%   with a binary-tree structure. It outputs the final branches, totally 2^clevels. 
%   There is no subsampling and hence the operation is shift-invariant. 
%   
%       nsdfbdec( x, dfilter, [clevels] ) 
% 
% INPUT: 
%   x: 
%       an array, input image. 
%	dfilter:	 
%		a string, directional filter name. 
%       a cell of matrices, including two directional filters and eight 
%       parallelogram filters. 
%   clevels: 
%       a non-negative integer, number of decomposition levels. 
% 
% OUTPUT: 
%	y: 
%       a cell vector, output subbands.  
% 
% See also:     DFILTERS, PARAFILTERS, NSSFBDEC. 
 
% 
% History:  
%   08/06/2004  Created by Jianping Zhou. 
 
% Input check 
if ~exist('clevels', 'var') 
    clevels = 0 ; 
    y{1} = x; 
    return; 
end 
if (clevels ~= round(clevels)) | (clevels < 0) 
    error('Number of decomposition levels must be a non-negative integer'); 
end 
if clevels == 0 
    % No decomposition, simply copy input to output 
    y{1} = x;     
    return; 
end 
if ~ischar( dfilter ) 
    if iscell( dfilter ) 
        if length( dfilter ) ~= 4 
            error('You shall provide a cell of two 2D directional filters and two groups of 2D parallelogram filters!'); 
        end 
    else 
        error('You shall provide the name of directional filter or all filters!'); 
    end 
end 
 
 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
% Get fan filters, parallelogram filters, and basic sampling matrices 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
% Get the diamond filters, if necessary 
if ischar( dfilter ) 
     
    % Get the directional filters for the critically sampled DFB. 
    [h1, h2] = dfilters(dfilter, 'd'); 
    % A scale is required for the nonsubsampled case. 
    h1 = h1./sqrt(2) ; 
    h2 = h2./sqrt(2) ; 
     
    % Generate the first-level fan filters by modulations. 
    k1 = modulate2(h1, 'c'); 
    k2 = modulate2(h2, 'c');  
     
    % Obtain the parallelogram filters from the diamond filters 
    [f1, f2] = parafilters( h1, h2 ) ; 
 
else 
    % Copy the fan filters directly. 
    k1 = dfilter{1} ; 
    k2 = dfilter{2} ; 
     
    % Copy the parallelogram filters directly. 
    f1 = dfilter{3} ; 
    f2 = dfilter{4} ;     
end  
 
% Quincunx sampling matrices 
q1 = [1, -1; 1, 1]; 
 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
% First-level Decompositions 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
if clevels == 1  
    % No upsampling for filters at the first-level. 
    [y{1}, y{2}] = nssfbdec( x, k1, k2 ) ;         
     
else %Others     
 
     
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
% Second-level Decompositions 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
    % No upsampling at filters for the first-level. 
    [x1, x2] = nssfbdec( x, k1, k2 ) ; 
 
    % Convolution with upsampled filters 
    [y{1}, y{2}] = nssfbdec( x1, k1, k2, q1 ) ; 
    [y{3}, y{4}] = nssfbdec( x2, k1, k2, q1 ) ; 
     
     
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
% Third and higher levels Decompositions 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
             
    % Third and higher levels decompositions 
    for l = 3:clevels 
        % Allocate space for the new subband outputs 
        y_old = y;     
        y = cell(1, 2^l); 
	 
        % The first half channels: 
        for k = 1:2^(l-2) 
             
            % Compute the upsampling matrix by the formula (3.18) of Minh N. Do's  
            % thesis. The upsampling matrix for the channel k in a l-levels DFB is 
            % M_k^{(l-1)} (refer to (3.18), pp. 53, Minh N. Do's thesis) 
             
            % Compute s_{(l-1)}(k): 
            slk = 2*floor( (k-1) /2 ) - 2^(l-3) + 1 ; 
            % Compute the sampling matrix: 
            mkl = 2*[ 2^(l-3), 0; 0, 1 ]*[1, 0; -slk, 1];  
            i = mod(k-1, 2) + 1; 
            % Decompose by the two-channel filter bank: 
            [y{2*k-1}, y{2*k}] = nssfbdec( y_old{k}, f1{i}, f2{i}, mkl ); 
        end	 
	 
        % The second half channels: 
        for k = 2^(l-2)+1 : 2^(l-1) 
             
            % Compute the upsampling matrix by the extension of the formula (3.18)  
            % of Minh N. Do's thesis to the second half channels. 
            % thesis. The upsampling matrix for the channel k in a l-levels DFB is 
            % M_k^{(l-1)} (refer to notes by Jianping Zhou) 
         
            % Compute s_{(l-1)}(k): 
            slk = 2 * floor( ( k-2^(l-2)-1 ) / 2 ) - 2^(l-3) + 1 ; 
            % Compute the sampling matrix: 
            mkl = 2*[ 1, 0; 0, 2^(l-3) ]*[1, -slk; 0, 1];  
            i = mod(k-1, 2) + 3; 
            % Decompose by the two-channel filter bank: 
            [y{2*k-1}, y{2*k}] = nssfbdec( y_old{k}, f1{i}, f2{i}, mkl ); 
        end 
    end 
end