function y = pdfbdec(x, pfilt, dfilt, nlevs)
% PDFBDEC   Dekompozice pomoci pyramidalni smerove banky filtru
%
%	y = pdfbdec(x, pfilt, dfilt, nlevs)
%
% Vstup:
%   x:      vstupni obraz
%   pfilt:  typ pyramidalniho filtru
%   dfilt:  typ smeroveho filtru
%   nlevs:  vektor poctu smerových bank filtracnich úrovní pri rozkladu pri každé pyramidové úrovni (od hrubého po jemné stupnice) 
%           Je-li počet úrovní 0, provádí se kriticky na vzorku 2-D
%           waveletova dekompozice. 
%
% Vystup:
%   y:    bunka vektoru o delce (nlevs)+1 s vyjímkou kdy y{1} je dolni
%   propust dilciho pasma, kazda bunka odpovida jedne pyramidove urovni a
%   obsahuje vektor pasmoveho smeroveho subpasma z DFB na teto urovni
%
% indexova konvence:
%   Predpokladejme ze nlevs = [l_J,...,l_2, l_1], a l_j >= 2.
%   Pak pro j = 1,...,J a k = 1,...,2^l_j 
%       y{J+2-j}{k}(n_1, n_2)
%   jsou contourlet koeficienty v meritku 2^j, smer k a pozice 
%       (n_1 * 2^(j+l_j-2), n_2 * 2^j) for k <= 2^(l_j-1), 
%       (n_1 * 2^j, n_2 * 2^(j+l_j-2)) for k > 2^(l_j-1).
%   Jak k zvysuje od 1 to 2^l_j, otaci po smeru hodinovych rucicek pro uhel
%   135 stupnu s jednotnym prirustkem v cotan od -1 do 1 pro
%   k <= 2^(l_j-1), a pak jednotny ubytek na upaleni od 1 do -1 pro
%   k > 2^(l_j-1).
%
% See also:	PFILTERS, DFILTERS, PDFBREC

if length(nlevs) == 0
    y = {x};
    
else
    % ziskani pyramidovych filtru
    [h, g] = pfilters(pfilt);
    
    if nlevs(end) ~= 0
        % Laplaceova decompozice
        [xlo, xhi] = lpdec(x, h, g);
    
        % DFB na filtrovanem obrazu
        switch dfilt        % rozhodnuti na jakem zalezi filtru
            case {'pkva6', 'pkva8', 'pkva12', 'pkva'}   
                % pouziva zebrikovou strukturu
                xhi_dir = dfbdec_l(xhi, dfilt, nlevs(end));
            
            otherwise       
                % obecny pripad
                xhi_dir = dfbdec(xhi, dfilt, nlevs(end));                
        end
        
    else        
        % specialni pripad: nlevs(end) == 0
        % provedeni jedne urnovni 2D kritickych vzorku vlnove banky filtru
        [xlo, xLH, xHL, xHH] = wfb2dec(x, h, g);
        xhi_dir = {xLH, xHL, xHH};
    end
    
    % Rekurzivni volani na nizkem pasmu
    ylo = pdfbdec(xlo, pfilt, dfilt, nlevs(1:end-1));

    % Add bandpass directional subbands to the final output
    y = {ylo{:}, xhi_dir};
end