No BSD License  

Highlights from
PDTDFB toolbox

from PDTDFB toolbox by Truong Nguyen
PDTDFB toolbox for computing the shiftable complex directional pyramid decomposition

pdtdfbdec_f(im, nlevs, F2, alpha, res)
function y2 = pdtdfbdec_f(im, nlevs, F2, alpha, res)
% PDTDFBDEC_F   Pyramidal Dual Tree Directional Filter Bank Decomposition
% using FFT at the multresolution FB and the first two level of dual DFB
% tree
%
%	y2 = pdtdfbdec_f(im, nlevs, F2, alpha, res)
%
% Input:
%   x:      Input image
%   nlevs:  vector of numbers of directional filter bank decomposition levels
%           at each pyramidal level (from coarse to fine scale).
%           0 : Laplacian pyramid level
%           1 : Wavelet decomposition
%           n : 2^n directional PDTDFB decomposition
%   F2:     [optional] Precomputed F window 
%   alpha:  [optional] Parameter for F2 window, incase F2 is not pre-computed
%   res :   [optional] Boolean value, specify weather existing residual
%           band
%
% Output:
%   y:      a cell vector of length length(nlevs) + 1, where except y{1} is
%           the lowpass subband, each cell corresponds to one pyramidal
%           level and is a cell vector that contains bandpass directional
%           subbands from the DFB at that level.
%
% See also:	PDTDFBREC_F, PDTDFBDEC
%
% Note : PDTDFB data structure y{resolution}{1}{1-2^n} : primal branch
%                              y{resolution}{2}{1-2^n} : dual branch

% running time for 1024 image size [3]: 
%                                  [5]:  sec
%                             [4 7 7 5]  : sec
%

if ~exist('res','var')
    res = 0 ; % default implementation 
end

Sz = size(im);
L = length(nlevs);
x = [0 0; 1 1; 0 1; 1 0];

if ~exist('alpha','var')
    alpha = 0.3;
end

if ~exist('F2','var')
    F2 = pdtdfb_win(Sz, alpha, L);
    disp('Precalculated window function will run much faster')
end

% residual band
imf = fft2(im);

if res
    % residual band
    imf2 = imf.*F2{L+1};
    y2{L+2} = ifft2(imf2);
end

for in = L+1:-1:2
    
    F = F2{in-1};
    
    n = nlevs(in-1);
    
    s = (1/2^(L+1-in))*Sz;
    [sy, sx] = meshgrid(0:1/s(2):(1-1/s(2)),0:1/s(1):(1-1/s(1)));
    sx = 2*pi*sx;    
    sy = 2*pi*sy;

    % low pass band
    imf2 = imf.*F{1};
    imf3 = periodize(imf2,s/2);
    im = 0.25*ifft2(imf3);
    
    imf2 = imf.*F{2};
    imf3 = periodize(imf2,s/2);
    im1 = 0.25*ifft2(imf3);
    y2{in}{1}{1} = real(im1);
    y2{in}{2}{1} = imag(im1);

    imf2 = exp(j*(sx+sy)).*imf.*F{3};
    imf3 = periodize(imf2,s/2);
    im1 = 0.25*ifft2(imf3);
    y2{in}{1}{2} = real(im1);
    y2{in}{2}{2} = imag(im1);

    imf2 = exp(j*(sy)).*imf.*F{4};
    imf3 = periodize(imf2,s/2);
    im1 = 0.25*ifft2(imf3);
    y2{in}{1}{3} = real(im1);
    y2{in}{2}{3} = imag(im1);

    imf2 = exp(j*(sx)).*imf.*F{5};
    imf3 = periodize(imf2,s/2);
    im1 = 0.25*ifft2(imf3);
    y2{in}{1}{4} = real(im1);
    y2{in}{2}{4} = imag(im1);
    
    % transform to FFT domain for next level processing
    imf = fft2(im);

    % --------------------------------------------------------------------
    if (n>2)
    % Ladder filter
    fname = 'pkva';
    if isstr(fname)
        f = ldfilter(fname);
    end
    y = y2{in}{1};
    % Now expand the rest of the tree
    % primal branch
    for l = 3:n
        % Allocate space for the new subband outputs
        y_old = y;
        y = cell(1, 2^l);

        % The first half channels use R1 and R2
        for k = 1:2^(l-2)
            i = mod(k-1, 2) + 1;
            [y{2*k}, y{2*k-1}] = fbdec_l(y_old{k}, f, 'p', i, 'per');
        end

        % The second half channels use R3 and R4
        for k = 2^(l-2)+1:2^(l-1)
            i = mod(k-1, 2) + 3;
            [y{2*k}, y{2*k-1}] = fbdec_l(y_old{k}, f, 'p', i, 'per');
        end

        % circlular shift to make the subband has minimum delay
        for inl = 1:4:2^(l-1)
            y{inl} = circshift(y{inl}, [0 1]);
        end
        for inl = 2^(l-1)+1:4:2^(l)
            y{inl} = circshift(y{inl}, [1 0]);
        end

        for l2 = l:-1:4
            for inl = 1:2:2^(l-2);
                csh = cshift(l2,abs(2^(l-2)-inl) );
                y{inl} = circshift(y{inl}, [0 csh]);
            end
            for inl = 2^(l-2)+1:2:2^(l-1);
                csh = cshift(l2,abs(2^(l-2)-inl) );
                y{inl} = circshift(y{inl}, [0 -csh]);
            end
            for inl = 2^(l-1)+1:2:3*2^(l-2);
                csh = cshift(l2,abs(3*2^(l-2)-inl));
                y{inl} = circshift(y{inl}, [csh 0]);
            end
            for inl = 3*2^(l-2)+1:2:2^(l);
                csh = cshift(l2,abs(3*2^(l-2)-inl));
                y{inl} = circshift(y{inl}, [-csh 0]);
            end
        end
    end
    
    % Backsampling
    y = backsamp(y);
    % Flip the order of the second half channels
    y(2^(n-1)+1:end) = fliplr(y(2^(n-1)+1:end));
    y2{in}{1} = y;

    % dual branch
    y = y2{in}{2};
    for l = 3:n
        % Allocate space for the new subband outputs
        y_old = y;
        y = cell(1, 2^l);

        % The first half channels use R1 and R2
        for k = 1:2^(l-2)
            i = mod(k-1, 2) + 1;
            [y{2*k}, y{2*k-1}] = fbdec_l(y_old{k}, f, 'p', i, 'per');
        end

        % The second half channels use R3 and R4
        for k = 2^(l-2)+1:2^(l-1)
            i = mod(k-1, 2) + 3;
            [y{2*k}, y{2*k-1}] = fbdec_l(y_old{k}, f, 'p', i, 'per');
        end

        % circlular shift to make the subband has minimum delay
        for inl = 1:4:2^(l-1)
            y{inl} = circshift(y{inl}, [0 1]);
        end
        for inl = 2^(l-1)+1:4:2^(l)
            y{inl} = circshift(y{inl}, [1 0]);
        end

        for l2 = l:-1:4
            for inl = 1:2:2^(l-2);
                csh = cshift(l2,abs(2^(l-2)-inl) );
                y{inl} = circshift(y{inl}, [0 csh]);
            end
            for inl = 2^(l-2)+1:2:2^(l-1);
                csh = cshift(l2,abs(2^(l-2)-inl) );
                y{inl} = circshift(y{inl}, [0 -csh]);
            end
            for inl = 2^(l-1)+1:2:3*2^(l-2);
                csh = cshift(l2,abs(3*2^(l-2)-inl));
                y{inl} = circshift(y{inl}, [csh 0]);
            end
            for inl = 3*2^(l-2)+1:2:2^(l);
                csh = cshift(l2,abs(3*2^(l-2)-inl));
                y{inl} = circshift(y{inl}, [-csh 0]);
            end
        end
    end
    
    % Backsampling
    y = backsamp(y);
    % Flip the order of the second half channels
    y(2^(n-1)+1:end) = fliplr(y(2^(n-1)+1:end));
    y2{in}{2} = y;
    
    end

end

y2{1} = im;

%---------------------------------
function csh = cshift(l2, re)
if l2 == 4
    csh = 1;
else
    % if rem < 4
    %    csh = 0;
    % else
    %    csh = 2;
    % end
    if l2 == 5
        tmp = floor(re/4);
        csh = 2^(l2-4)*tmp;
    else
        csh = 0;
    end
end


Contact us at files@mathworks.com