Code covered by the BSD License  

Highlights from
Toolbox Wavelets

image thumbnail
from Toolbox Wavelets by Gabriel Peyre
Wavelet transform and coding functions, including other more exotic transforms (laplacian, steerable

perform_waveatoms_transform(x,dir, options)
function y = perform_waveatoms_transform(x,dir, options)

% perform_waveatoms_transform - interface to WaveAtom transform
%
%   y = perform_waveatoms_transform(x,dir, options);
%
%   The waveatom toolbox can be downloaded from
%       http://www.waveatom.org/
%
%   Copyright (c) 2007 Gabriel Peyre

options.null = 0;
issym = getoptions(options, 'issym', 0);
force_real = getoptions(options, 'force_real', 1);

if dir==1
    d = nb_dims(x);
else
    if iscell(x)
        d = nb_dims(x{1});
    else
        d = nb_dims(x);
    end
end

pat = 'p'; tp = 'ortho';
if d==1
    if dir==1
        if issym
            y = fatom1sym(x,pat,[1 1]);
        else
            y = fwa1(x,pat,tp);
        end
    else
        if issym
            y = iatom1sym(x,pat,[1 1]);
        else
            y = iwa1(x,pat,tp);
        end
    end
else
    if dir==1
        if issym
            y = fwa2sym(x,pat,[1 1]);
        else
            y = fwa2(x,pat,tp);
        end
    else
        if issym
            y = iwa2sym(x,pat,[1 1]);
        else
            y = iwa2(x,pat,tp);
        end
    end
end

if force_real && dir==-1
    y = real(y);
end


function c = fwa2(x,pat,tp)
% fwa2 - 2D forward wave atom transform
% -----------------
% INPUT
% --
% x is a real N-by-N matrix. N is a power of 2.
% --
% pat specifies the type of frequency partition which satsifies
% parabolic scaling relationship. pat can either be 'p' or 'q'.
% --
% tp is the type of tranform.
% 	'ortho': orthobasis
% 	'directional': real-valued frame with single oscillation direction
% 	'complex': complex-valued frame
% -----------------
% OUTPUT
% --
% c is a cell array which contains the wave atom coefficients. If
% tp=='ortho', then c{j}{m1,m2}(n1,n2) is the coefficient at scale j,
% frequency index (m1,m2) and spatial index (n1,n2). If
% tp=='directional', then c{j,d}{m1,m2}(n1,n2) with d=1,2 are the
% coefficients at scale j, frequency index (m1,m2) and spatial index
% (n1,n2). If tp=='complex', then c{j,d}{m1,m2)(n1,n2) with d=1,2,3,4
% are the coefficients at scale j, frequency index (m1,m2) and spatial
% index (n1,n2).
% -----------------
% Written by Lexing Ying and Laurent Demanet, 2007

if( ismember(tp, {'ortho','directional','complex'})==0 | ismember(pat, {'p','q','u'})==0 )    error('wrong');  end

if(strcmp(tp, 'ortho')==1)
    %---------------------------------------------------------
    N = size(x,1);
    H = N/2;
    lst = freq_pat(H,pat);
    %------------------
    f = fft2(x) / sqrt(prod(size(x)));
    A = N;
    c = cell(length(lst),1);
    %------------------
    for s=1:length(lst)
        nw = length(lst{s});
        c{s} = cell(nw,nw);
        for I=0:nw-1
            for J=0:nw-1
                if(lst{s}(I+1)==0 & lst{s}(J+1)==0)
                    c{s}{I+1,J+1} = [];
                else
                    B = 2^(s-1);
                    D = 2*B;
                    Ict = I*B;      Jct = J*B; %starting position in freq
                    if(mod(I,2)==0)
                        Ifm = Ict-2/3*B;        Ito = Ict+4/3*B;
                    else
                        Ifm = Ict-1/3*B;        Ito = Ict+5/3*B;
                    end
                    if(mod(J,2)==0)
                        Jfm = Jct-2/3*B;        Jto = Jct+4/3*B;
                    else
                        Jfm = Jct-1/3*B;        Jto = Jct+5/3*B;
                    end
                    res = zeros(D,D);
                    for id=0:1
                        if(id==0)
                            Idx = [ceil(Ifm):floor(Ito)];      Icf = kf_rt(Idx/B*pi, I);
                        else
                            Idx = [ceil(-Ito):floor(-Ifm)];      Icf = kf_lf(Idx/B*pi, I);
                        end
                        for jd=0:1
                            if(jd==0)
                                Jdx = [ceil(Jfm):floor(Jto)];      Jcf = kf_rt(Jdx/B*pi, J);
                            else
                                Jdx = [ceil(-Jto):floor(-Jfm)];      Jcf = kf_lf(Jdx/B*pi, J);
                            end
                            res(mod(Idx,D)+1,mod(Jdx,D)+1) = res(mod(Idx,D)+1,mod(Jdx,D)+1) + conj( Icf.'*Jcf ) .* f(mod(Idx,A)+1,mod(Jdx,A)+1);
                        end
                    end
                    c{s}{I+1,J+1} = ifft2(res) * sqrt(prod(size(res)));
                end
            end
        end
    end

elseif(strcmp(tp, 'directional')==1)
    %---------------------------------------------------------
    N = size(x,1);
    H = N/2;
    lst = freq_pat(H,pat);
    %------------------
    f = fft2(x) / sqrt(prod(size(x)));
    A = N;
    c1 = cell(length(lst),1);
    c2 = cell(length(lst),1);
    %------------------
    for s=1:length(lst)
        nw = length(lst{s});
        c1{s} = cell(nw,nw);
        c2{s} = cell(nw,nw);
        for I=0:nw-1
            for J=0:nw-1
                if(lst{s}(I+1)==0 & lst{s}(J+1)==0)
                    c1{s}{I+1,J+1} = [];
                    c2{s}{I+1,J+1} = [];
                else
                    B = 2^(s-1);
                    D = 2*B;
                    res = zeros(D,D);
                    Ict = I*B;      Jct = J*B; %starting position in freq
                    if(mod(I,2)==0)
                        Ifm = Ict-2/3*B;        Ito = Ict+4/3*B;
                    else
                        Ifm = Ict-1/3*B;        Ito = Ict+5/3*B;
                    end
                    if(mod(J,2)==0)
                        Jfm = Jct-2/3*B;        Jto = Jct+4/3*B;
                    else
                        Jfm = Jct-1/3*B;        Jto = Jct+5/3*B;
                    end

                    res = zeros(D,D);
                    Idx = [ceil(Ifm):floor(Ito)];      Icf = kf_rt(Idx/B*pi, I);
                    Jdx = [ceil(Jfm):floor(Jto)];      Jcf = kf_rt(Jdx/B*pi, J);
                    res(mod(Idx,D)+1,mod(Jdx,D)+1) = res(mod(Idx,D)+1,mod(Jdx,D)+1) + conj( Icf.'*Jcf ) .* f(mod(Idx,A)+1,mod(Jdx,A)+1);
                    Idx = [ceil(-Ito):floor(-Ifm)];      Icf = kf_lf(Idx/B*pi, I);
                    Jdx = [ceil(-Jto):floor(-Jfm)];      Jcf = kf_lf(Jdx/B*pi, J);
                    res(mod(Idx,D)+1,mod(Jdx,D)+1) = res(mod(Idx,D)+1,mod(Jdx,D)+1) + conj( Icf.'*Jcf ) .* f(mod(Idx,A)+1,mod(Jdx,A)+1);
                    c1{s}{I+1,J+1} = ifft2(res) * sqrt(prod(size(res)));

                    res = zeros(D,D);
                    Idx = [ceil(Ifm):floor(Ito)];      Icf = kf_rt(Idx/B*pi, I);
                    Jdx = [ceil(-Jto):floor(-Jfm)];      Jcf = kf_lf(Jdx/B*pi, J);
                    res(mod(Idx,D)+1,mod(Jdx,D)+1) = res(mod(Idx,D)+1,mod(Jdx,D)+1) + conj( Icf.'*Jcf ) .* f(mod(Idx,A)+1,mod(Jdx,A)+1);
                    Idx = [ceil(-Ito):floor(-Ifm)];      Icf = kf_lf(Idx/B*pi, I);
                    Jdx = [ceil(Jfm):floor(Jto)];      Jcf = kf_rt(Jdx/B*pi, J);
                    res(mod(Idx,D)+1,mod(Jdx,D)+1) = res(mod(Idx,D)+1,mod(Jdx,D)+1) + conj( Icf.'*Jcf ) .* f(mod(Idx,A)+1,mod(Jdx,A)+1);
                    c2{s}{I+1,J+1} = ifft2(res) * sqrt(prod(size(res)));
                end
            end
        end
    end
    c = [c1 c2];

elseif(strcmp(tp, 'complex')==1)
    %---------------------------------------------------------
    N = size(x,1);
    H = N/2;
    lst = freq_pat(H,pat);
    %------------------
    f = fft2(x) / sqrt(prod(size(x)));
    A = N;
    c1 = cell(length(lst),1);
    c2 = cell(length(lst),1);
    c3 = cell(length(lst),1);
    c4 = cell(length(lst),1);
    %------------------
    for s=1:length(lst)
        nw = length(lst{s});
        c1{s} = cell(nw,nw);
        c2{s} = cell(nw,nw);
        c3{s} = cell(nw,nw);
        c4{s} = cell(nw,nw);
        for I=0:nw-1
            for J=0:nw-1
                if(lst{s}(I+1)==0 & lst{s}(J+1)==0)
                    c1{s}{I+1,J+1} = [];
                    c2{s}{I+1,J+1} = [];
                    c3{s}{I+1,J+1} = [];
                    c4{s}{I+1,J+1} = [];
                else
                    B = 2^(s-1);
                    D = 2*B;
                    res = zeros(D,D);
                    Ict = I*B;      Jct = J*B; %starting position in freq
                    if(mod(I,2)==0)
                        Ifm = Ict-2/3*B;        Ito = Ict+4/3*B;
                    else
                        Ifm = Ict-1/3*B;        Ito = Ict+5/3*B;
                    end
                    if(mod(J,2)==0)
                        Jfm = Jct-2/3*B;        Jto = Jct+4/3*B;
                    else
                        Jfm = Jct-1/3*B;        Jto = Jct+5/3*B;
                    end

                    res = zeros(D,D);
                    Idx = [ceil(Ifm):floor(Ito)];      Icf = kf_rt(Idx/B*pi, I);
                    Jdx = [ceil(Jfm):floor(Jto)];      Jcf = kf_rt(Jdx/B*pi, J);
                    res(mod(Idx,D)+1,mod(Jdx,D)+1) = res(mod(Idx,D)+1,mod(Jdx,D)+1) + conj( Icf.'*Jcf ) .* f(mod(Idx,A)+1,mod(Jdx,A)+1);
                    c1{s}{I+1,J+1} = ifft2(res) * sqrt(prod(size(res)));

                    res = zeros(D,D);
                    Idx = [ceil(-Ito):floor(-Ifm)];      Icf = kf_lf(Idx/B*pi, I);
                    Jdx = [ceil(-Jto):floor(-Jfm)];      Jcf = kf_lf(Jdx/B*pi, J);
                    res(mod(Idx,D)+1,mod(Jdx,D)+1) = res(mod(Idx,D)+1,mod(Jdx,D)+1) + conj( Icf.'*Jcf ) .* f(mod(Idx,A)+1,mod(Jdx,A)+1);
                    c2{s}{I+1,J+1} = ifft2(res) * sqrt(prod(size(res)));

                    res = zeros(D,D);
                    Idx = [ceil(Ifm):floor(Ito)];      Icf = kf_rt(Idx/B*pi, I);
                    Jdx = [ceil(-Jto):floor(-Jfm)];      Jcf = kf_lf(Jdx/B*pi, J);
                    res(mod(Idx,D)+1,mod(Jdx,D)+1) = res(mod(Idx,D)+1,mod(Jdx,D)+1) + conj( Icf.'*Jcf ) .* f(mod(Idx,A)+1,mod(Jdx,A)+1);
                    c3{s}{I+1,J+1} = ifft2(res) * sqrt(prod(size(res)));

                    res = zeros(D,D);
                    Idx = [ceil(-Ito):floor(-Ifm)];      Icf = kf_lf(Idx/B*pi, I);
                    Jdx = [ceil(Jfm):floor(Jto)];      Jcf = kf_rt(Jdx/B*pi, J);
                    res(mod(Idx,D)+1,mod(Jdx,D)+1) = res(mod(Idx,D)+1,mod(Jdx,D)+1) + conj( Icf.'*Jcf ) .* f(mod(Idx,A)+1,mod(Jdx,A)+1);
                    c4{s}{I+1,J+1} = ifft2(res) * sqrt(prod(size(res)));
                end
            end
        end
    end
    c = [c1 c2 c3 c4];
end


function x = iwa2(c,pat,tp)
% iwa2 - 2D inverse wave atom transform
% -----------------
% INPUT
% --
% c is a cell array which contains the wave atom coefficients. If
% tp=='ortho', then c{j}{m1,m2}(n1,n2) is the coefficient at scale j,
% frequency index (m1,m2) and spatial index (n1,n2). If
% tp=='directional', then c{j,d}{m1,m2}(n1,n2) with d=1,2 are the
% coefficients at scale j, frequency index (m1,m2) and spatial index
% (n1,n2). If tp=='complex', then c{j,d}{m1,m2)(n1,n2) with d=1,2,3,4
% are the coefficients at scale j, frequency index (m1,m2) and spatial
% index (n1,n2).
% --
% pat specifies the type of frequency partition which satsifies
% parabolic scaling relationship. pat can either be 'p' or 'q'.
% --
% tp is the type of tranform.
% 	'ortho': orthobasis
% 	'directional': real-valued frame with single oscillation direction
% 	'complex': complex-valued frame
% -----------------
% OUTPUT
% --
% x is a real N-by-N matrix. N is a power of 2.
% -----------------
% Written by Lexing Ying and Laurent Demanet, 2007

if( ismember(tp, {'ortho','directional','complex'})==0 | ismember(pat, {'p','q','u'})==0 )    error('wrong');  end

if(strcmp(tp, 'ortho')==1)
    %---------------------------------------------------------
    T = 0;
    for s=1:length(c)
        nw = length(c{s});
        for I=1:nw
            for J=1:nw
                T = T + prod(size(c{s}{I,J}));
            end
        end
    end
    N = sqrt(T);
    H = N/2;
    lst = freq_pat(H,pat);
    A = N;
    f = zeros(A,A);
    %------------------
    for s=1:length(lst)
        nw = length(lst{s});
        for I=0:nw-1
            for J=0:nw-1
                if(~isempty(c{s}{I+1,J+1}))
                    B = 2^(s-1);
                    D = 2*B;
                    Ict = I*B;      Jct = J*B; %starting position in freq
                    if(mod(I,2)==0)
                        Ifm = Ict-2/3*B;        Ito = Ict+4/3*B;
                    else
                        Ifm = Ict-1/3*B;        Ito = Ict+5/3*B;
                    end
                    if(mod(J,2)==0)
                        Jfm = Jct-2/3*B;        Jto = Jct+4/3*B;
                    else
                        Jfm = Jct-1/3*B;        Jto = Jct+5/3*B;
                    end
                    res = fft2(c{s}{I+1,J+1}) / sqrt(prod(size(c{s}{I+1,J+1}))); %res = zeros(D,D);
                    for id=0:1
                        if(id==0)
                            Idx = [ceil(Ifm):floor(Ito)];      Icf = kf_rt(Idx/B*pi, I);
                        else
                            Idx = [ceil(-Ito):floor(-Ifm)];      Icf = kf_lf(Idx/B*pi, I);
                        end
                        for jd=0:1
                            if(jd==0)
                                Jdx = [ceil(Jfm):floor(Jto)];      Jcf = kf_rt(Jdx/B*pi, J);
                            else
                                Jdx = [ceil(-Jto):floor(-Jfm)];      Jcf = kf_lf(Jdx/B*pi, J);
                            end
                            f(mod(Idx,A)+1,mod(Jdx,A)+1) = f(mod(Idx,A)+1,mod(Jdx,A)+1) + ( Icf.'*Jcf ) .* res(mod(Idx,D)+1,mod(Jdx,D)+1);
                        end
                    end
                end
            end
        end
    end
    %------------------
    x = ifft2(f) * sqrt(prod(size(f)));

elseif(strcmp(tp, 'directional')==1)
    %---------------------------------------------------------
    c1 = c(:,1);
    c2 = c(:,2);

    T = 0;
    for s=1:length(c1)
        nw = length(c1{s});
        for I=1:nw
            for J=1:nw
                T = T + prod(size(c1{s}{I,J}));
            end
        end
    end
    N = sqrt(T);
    H = N/2;
    lst = freq_pat(H,pat);
    A = N;
    f = zeros(A,A);
    %------------------
    for s=1:length(lst)
        nw = length(lst{s});
        for I=0:nw-1
            for J=0:nw-1
                if(~isempty(c1{s}{I+1,J+1}))
                    B = 2^(s-1);
                    D = 2*B;
                    Ict = I*B;      Jct = J*B; %starting position in freq
                    if(mod(I,2)==0)
                        Ifm = Ict-2/3*B;        Ito = Ict+4/3*B;
                    else
                        Ifm = Ict-1/3*B;        Ito = Ict+5/3*B;
                    end
                    if(mod(J,2)==0)
                        Jfm = Jct-2/3*B;        Jto = Jct+4/3*B;
                    else
                        Jfm = Jct-1/3*B;        Jto = Jct+5/3*B;
                    end

                    res = fft2(c1{s}{I+1,J+1}) / sqrt(prod(size(c1{s}{I+1,J+1}))); %res = zeros(D,D);
                    Idx = [ceil(Ifm):floor(Ito)];      Icf = kf_rt(Idx/B*pi, I);
                    Jdx = [ceil(Jfm):floor(Jto)];      Jcf = kf_rt(Jdx/B*pi, J);
                    f(mod(Idx,A)+1,mod(Jdx,A)+1) = f(mod(Idx,A)+1,mod(Jdx,A)+1) + ( Icf.'*Jcf ) .* res(mod(Idx,D)+1,mod(Jdx,D)+1);
                    Idx = [ceil(-Ito):floor(-Ifm)];      Icf = kf_lf(Idx/B*pi, I);
                    Jdx = [ceil(-Jto):floor(-Jfm)];      Jcf = kf_lf(Jdx/B*pi, J);
                    f(mod(Idx,A)+1,mod(Jdx,A)+1) = f(mod(Idx,A)+1,mod(Jdx,A)+1) + ( Icf.'*Jcf ) .* res(mod(Idx,D)+1,mod(Jdx,D)+1);

                    res = fft2(c2{s}{I+1,J+1}) / sqrt(prod(size(c2{s}{I+1,J+1}))); %res = zeros(D,D);
                    Idx = [ceil(Ifm):floor(Ito)];      Icf = kf_rt(Idx/B*pi, I);
                    Jdx = [ceil(-Jto):floor(-Jfm)];      Jcf = kf_lf(Jdx/B*pi, J);
                    f(mod(Idx,A)+1,mod(Jdx,A)+1) = f(mod(Idx,A)+1,mod(Jdx,A)+1) + ( Icf.'*Jcf ) .* res(mod(Idx,D)+1,mod(Jdx,D)+1);
                    Idx = [ceil(-Ito):floor(-Ifm)];      Icf = kf_lf(Idx/B*pi, I);
                    Jdx = [ceil(Jfm):floor(Jto)];      Jcf = kf_rt(Jdx/B*pi, J);
                    f(mod(Idx,A)+1,mod(Jdx,A)+1) = f(mod(Idx,A)+1,mod(Jdx,A)+1) + ( Icf.'*Jcf ) .* res(mod(Idx,D)+1,mod(Jdx,D)+1);
                end
            end
        end
    end
    x = ifft2(f) * sqrt(prod(size(f)));

elseif(strcmp(tp, 'complex')==1)
    %---------------------------------------------------------
    c1 = c(:,1);
    c2 = c(:,2);
    c3 = c(:,3);
    c4 = c(:,4);

    T = 0;
    for s=1:length(c1)
        nw = length(c1{s});
        for I=1:nw
            for J=1:nw
                T = T + prod(size(c1{s}{I,J}));
            end
        end
    end
    N = sqrt(T);
    H = N/2;
    lst = freq_pat(H,pat);
    A = N;
    f = zeros(A,A);
    %------------------
    for s=1:length(lst)
        nw = length(lst{s});
        for I=0:nw-1
            for J=0:nw-1
                if(~isempty(c1{s}{I+1,J+1}))
                    B = 2^(s-1);
                    D = 2*B;
                    Ict = I*B;      Jct = J*B; %starting position in freq
                    if(mod(I,2)==0)
                        Ifm = Ict-2/3*B;        Ito = Ict+4/3*B;
                    else
                        Ifm = Ict-1/3*B;        Ito = Ict+5/3*B;
                    end
                    if(mod(J,2)==0)
                        Jfm = Jct-2/3*B;        Jto = Jct+4/3*B;
                    else
                        Jfm = Jct-1/3*B;        Jto = Jct+5/3*B;
                    end

                    res = fft2(c1{s}{I+1,J+1}) / sqrt(prod(size(c1{s}{I+1,J+1}))); %res = zeros(D,D);
                    Idx = [ceil(Ifm):floor(Ito)];      Icf = kf_rt(Idx/B*pi, I);
                    Jdx = [ceil(Jfm):floor(Jto)];      Jcf = kf_rt(Jdx/B*pi, J);
                    f(mod(Idx,A)+1,mod(Jdx,A)+1) = f(mod(Idx,A)+1,mod(Jdx,A)+1) + ( Icf.'*Jcf ) .* res(mod(Idx,D)+1,mod(Jdx,D)+1);

                    res = fft2(c2{s}{I+1,J+1}) / sqrt(prod(size(c2{s}{I+1,J+1}))); %res = zeros(D,D);
                    Idx = [ceil(-Ito):floor(-Ifm)];      Icf = kf_lf(Idx/B*pi, I);
                    Jdx = [ceil(-Jto):floor(-Jfm)];      Jcf = kf_lf(Jdx/B*pi, J);
                    f(mod(Idx,A)+1,mod(Jdx,A)+1) = f(mod(Idx,A)+1,mod(Jdx,A)+1) + ( Icf.'*Jcf ) .* res(mod(Idx,D)+1,mod(Jdx,D)+1);

                    res = fft2(c3{s}{I+1,J+1}) / sqrt(prod(size(c3{s}{I+1,J+1}))); %res = zeros(D,D);
                    Idx = [ceil(Ifm):floor(Ito)];      Icf = kf_rt(Idx/B*pi, I);
                    Jdx = [ceil(-Jto):floor(-Jfm)];      Jcf = kf_lf(Jdx/B*pi, J);
                    f(mod(Idx,A)+1,mod(Jdx,A)+1) = f(mod(Idx,A)+1,mod(Jdx,A)+1) + ( Icf.'*Jcf ) .* res(mod(Idx,D)+1,mod(Jdx,D)+1);

                    res = fft2(c4{s}{I+1,J+1}) / sqrt(prod(size(c4{s}{I+1,J+1}))); %res = zeros(D,D);
                    Idx = [ceil(-Ito):floor(-Ifm)];      Icf = kf_lf(Idx/B*pi, I);
                    Jdx = [ceil(Jfm):floor(Jto)];      Jcf = kf_rt(Jdx/B*pi, J);
                    f(mod(Idx,A)+1,mod(Jdx,A)+1) = f(mod(Idx,A)+1,mod(Jdx,A)+1) + ( Icf.'*Jcf ) .* res(mod(Idx,D)+1,mod(Jdx,D)+1);
                end
            end
        end
    end
    x = ifft2(f) * sqrt(prod(size(f)));
end


function lst = freq_pat(H,pat)
% freq_pat.m - generate frequency partition
%
% input:
%   H:    half length of the frequency span, H needs to be greater than 16
%   pat:  type of frequency partition which satsifies parabolic scaling relationship
%         equal to 'p' or 'q'
%
% output:
%   lst:  data representing the partition of frequency
%
% Written by Lexing Ying and Laurent Demanet, 2006

if(H<16)    error('H needs to be at least 16');  end

if(    pat=='p') %parabolic scaling by lexing
    len = ceil(log2(H)/2)+1;
    lst = cell(len,1);
    lst{1} = [1 1];    lst{2} = [0 1];    lst{3} = [0 1 1 1];
    cnt = 16;
    idx = 3;    rad = 4;
    while(cnt<H)
        old = cnt;
        lst{idx} = [lst{idx} 1 1];
        cnt = cnt + 2*rad;
        idx = idx+1;
        rad = 2*rad;
        trg = min(4*old,H);
        lst{idx} = [zeros(1,cnt/rad), ones(1,(trg-cnt)/rad)];
        cnt = trg;
    end
elseif(pat=='q') %parabolic scaling by laurent
    len = floor(log2(H)/2)+1;
    lst = cell(len,1);
    lst{1} = [1 1];    lst{2} = [0 1 1 1];
    cnt = 8;
    idx = 2;      rad = 2;
    while(cnt<H)
        old = cnt;
        lst{idx} = [lst{idx} 1 1];
        cnt = cnt + 2*rad;
        idx = idx+1;
        rad = 2*rad;
        trg = min(4*old,H);
        lst{idx} = [zeros(1,cnt/rad), ones(1,(trg-cnt)/rad)];
        cnt = trg;
    end
elseif(pat=='u')
    len = ceil(log2(H)/2)+1; %uniform partitioning
    lst = cell(len,1);
    B = 2^(len-1);
    lst{end} = ones(1,H/B);
else
    error('wrong pat');
end

function r = kf_rt(w,n)
% kf_rt.m - right bump
%
% Written by Lexing Ying and Laurent Demanet, 2006

r = zeros(size(w));
an = pi/2*(n+1/2);
en = (-1)^n;
en1 = (-1)^(n+1);

r = exp(-i*w/2) .* ( exp(i*an)*g(en*(w-pi*(n+1/2))) );

function r = g(w)
% g.m - 'g' function Villemoes's construction
%
% Written by Lexing Ying and Laurent Demanet, 2006
r = zeros(size(w));
gd = w<5*pi/6 & w>-7*pi/6;
r(gd) = abs(sf(w(gd)-3*pi/2));

%----------------------------------------------------------------------
function r = sf(w)
r = zeros(size(w));

aw = abs(w);
r(aw<=2*pi/3) = 0;

gd = aw>=2*pi/3 & aw<=4*pi/3;
r(gd) = 1/sqrt(2) * hf(w(gd)/2+pi);

gd = aw>=4*pi/3 & aw<=8*pi/3;
r(gd) = 1/sqrt(2) * hf(w(gd)/4);

r(aw>8*pi/2) = 0;

function r = hf(w)
w = mod(w+pi,2*pi) - pi;
r = zeros(size(w));
w = abs(w);

r = sqrt(2) * cos(pi/2 * beta(3*w/pi-1));
r(w<=pi/3) = sqrt(2);
r(w>=2*pi/3) = 0;

function r = beta(x)
r = x.^4 .*(35-84*x + 70*x.^2 -20*x.^3);

function r = kf_lf(w,n)
% kf_lf.m - left bump
%
% Written by Lexing Ying and Laurent Demanet, 2006

r = zeros(size(w));
an = pi/2*(n+1/2);
en = (-1)^n;
en1 = (-1)^(n+1);

r = exp(-i*w/2) .* ( exp(-i*an)*g(en1*(w+pi*(n+1/2))) );

function res = fwa2sym(x,pat,tp)
% fwa2sym - 2D forward wave atom transform (symmetric version)
% -----------------
% INPUT
% --
% x is a real N-by-N matrix. N is a power of 2.
% --
% pat specifies the type of frequency partition which satsifies
% parabolic scaling relationship. pat can either be 'p' or 'q'.
% --
% tp is the type of tranform.
% 	'ortho': orthobasis
% 	'directional': real-valued frame with single oscillation direction
% 	'complex': complex-valued frame
% -----------------
% OUTPUT
% --
% res is an array containing all the wave atom coefficients. If
% tp=='ortho', then res is of size N-by-N. If tp=='
% If tp=='directional', then res is of size N-by-N-by-2. If tp=='complex',
% then res is of size N-by-N-by-4.
% -----------------
% Written by Lexing Ying and Laurent Demanet, 2007

if( ismember(tp, {'ortho','directional','complex'})==0 | ismember(pat, {'p','q','u'})==0 )    error('wrong');  end

call = fwa2(x,pat,tp);
N = size(x,1);
res = zeros(N,N,size(call,2));

for i=1:size(call,2)
    c = call(:,i);
    y = zeros(N,N);
    for s=1:length(c)
        D = 2^s;
        nw = length(c{s});
        for I=0:nw-1
            for J=0:nw-1
                if(~isempty(c{s}{I+1,J+1}))
                    y( I*D+[1:D], J*D+[1:D] ) = c{s}{I+1,J+1};
                end
            end
        end
    end
    res(:,:,i) = y;
end




function x = iwa2sym(res,pat,tp)
% iwa2sym - 2D inverse wave atom transform (symmetric version)
% -----------------
% INPUT
% --
% res is an array containing all the wave atom coefficients. If
% tp=='ortho', then res is of size N-by-N. If tp=='
% If tp=='directional', then res is of size N-by-N-by-2. If tp=='complex',
% then res is of size N-by-N-by-4.
% --
% pat specifies the type of frequency partition which satsifies
% parabolic scaling relationship. pat can either be 'p' or 'q'.
% --
% tp is the type of tranform.
% 	'ortho': orthobasis
% 	'directional': real-valued frame with single oscillation direction
% 	'complex': complex-valued frame
% -----------------
% OUTPUT
% --
% x is a real N-by-N matrix. N is a power of 2.
% -----------------
% Written by Lexing Ying and Laurent Demanet, 2007


if( ismember(tp, {'ortho','directional','complex'})==0 | ismember(pat, {'p','q','u'})==0 )    error('wrong');  end

N = size(res,1);
H = N/2;
lst = freq_pat(H,pat);
red = size(res,3);

call = cell(length(lst),red);
for i=1:red
    y = res(:,:,i);
    c = cell(length(lst),1);
    for s=1:length(lst)
        B = 2^(s-1);    D = 2*B;
        nw = length(lst{s});
        c{s} = cell(nw,nw);
        for I=0:nw-1
            for J=0:nw-1
                if(lst{s}(I+1)==0 & lst{s}(J+1)==0)
                    c{s}{I+1,J+1} = [];
                else
                    c{s}{I+1,J+1} = y( I*D+[1:D], J*D+[1:D] );
                end
            end
        end
    end
    call(:,i) = c;
end
x = iwa2(call,pat,tp);



Contact us at files@mathworks.com