image thumbnail
from Non-Redundant Shift-Invariant Complex Wavelet Transform by Reshad Hosseini
2 m-file functions for applying complex wavelet and inverse complex wavelet transforms.

[yout,Sizes]=CWT_downcoef(x,levels,dim)
function [yout,Sizes]=CWT_downcoef(x,levels,dim)
%
%  [yout,Sizes]=CWT_downcoef(x,levels,dim)
%
%  This function applies the proposed Complex Wavelet Transform on the
%  signal that can be 1D, 2D or 3D.
%
%  Inputs:
%    x: The input signal
%    levels: The total nmber of levels in the wavelet tree
%    dim: The dimensionality of the input data 
%
%  Outputs:
%    yout: The output signal (All signals in all subbands and all levels 
%         are reshaped into an 1D array and attached to each other)
%    Sizes :  Structure with following Fields
%          original: The size of the input signal
%          subbands: The size of the transformed signal in each level
%          sum_subbands : The number of coefficient in each subband for a
%                   certain level
%          dim: The dimensionality of the input signal
%          level: The number of levels in the tree
%          tot_length: The total length of the input signal 
%
%  (c) 2008 Reshad Hosseini
%  Further details about the algorithm can be found in
%  Hosseini :  "Almost Perfect Reconstruction Filter Bank for Non-redundant 
%              ,Approximately Shift-Invariant, Complex Wavelet Transforms"
%

if nargin<3
    dim=ndims(x);
end
num1=['filter1x';'filter2x';'filter3x'];
num2=['filter1y';'filter2y';'filter3y'];
num3=['filter1z';'filter2z';'filter3z'];

yout=[];

if dim==1
    size_array(1,:)=length(x);
else
    size_array(1,:)=size(x);
end
Sizes.original=size_array(1,:);
for k=1:levels
    flag=1;
    if k==1
        load filter2
        filt_len=size(filters,1);
        x=extention(x,filt_len,dim);
        filter1x=real(filters(:,1));
        filter2x=real(filters(:,2));
        filter3x=imag(filters(:,3));
        if dim>1
            filter1y=filter1x';
            filter2y=filter2x';
            filter3y=filter3x';
        end
        if dim>2
            filter1z(1,1,:)=filter1x;
            filter2z(1,1,:)=filter2x;
            filter3z(1,1,:)=filter3x;
        end

    else        
        if k==2
            clear filter1z filter2z filter3z
            load filter1
            filter1x=real(filters(:,1));
            filter2x=real(filters(:,2));
            filter3x=imag(filters(:,3));
            if dim>1
                filter1y=filter1x';
                filter2y=filter2x';
                filter3y=filter3x';
            end
            if dim>2
                filter1z(1,1,:)=filter1x;
                filter2z(1,1,:)=filter2x;
                filter3z(1,1,:)=filter3x;
            end
        end
        filt_len=size(filters,1);
        x=extention(y{1},filt_len,dim);
        clear y
    end
    if k==1
        size_array(1,:)=ceil((size_array(1,:)+filt_len-1)/3);
        if dim==3
            siz(1)=size_array(1,1)*size_array(1,2)*size_array(1,3);
        elseif dim==1
            siz(1)=size_array(1,1);
        elseif dim==2
            siz(1)=size_array(1,1)*size_array(1,2);
        end
    else
        size_array(k,:)=ceil((size_array(k-1,:)+filt_len-1)/3);     
        if dim==3
            siz(k)=size_array(k,1)*size_array(k,2)*size_array(k,3);  
        elseif dim==2
            siz(k)=size_array(k,1)*size_array(k,2); 
        elseif dim==1
            siz(k)=size_array(k,1);
        end
    end
    for k1=1:3 
        middle=eval(sprintf('conv3valid(x,%s,size_array(k,:),1,%i)',num1(k1,:),dim));
        if dim>1
            for k2=1:3
                middle2=eval(sprintf('conv3valid( middle,%s,size_array(k,:),2,%i)',num2(k2,:),dim));
                if dim>2
                    for k3=1:3
                        middle3=eval(sprintf('conv3valid( middle2,%s,size_array(k,:),3,%i)',num3(k3,:),dim));
                        y{flag}=middle3;
                        flag=flag+1;
                    end
                    clear middle3;
                else
                    y{flag}=middle2;
                    flag=flag+1;
                end
            end
            clear middle2;
        else
            y{flag}=middle;
%             if k1==1
%                 figure,plot(middle)
%                 pause
%             end
            flag=flag+1;
        end
        clear middle;
    end

    clear x;
    if dim==3
        siz_end=siz(k);
        yout=[yout reshape(y{14}-y{18}-y{24}-y{26},1,siz_end)];
        yout=[yout reshape(y{23}+y{15}+y{17}-y{27},1,siz_end)];
        yout=[yout reshape(y{14}+y{18}+y{24}-y{26},1,siz_end)];
        yout=[yout reshape(y{23}-y{15}+y{17}+y{27},1,siz_end)];
        yout=[yout reshape(y{14}+y{18}-y{24}+y{26},1,siz_end)];
        yout=[yout reshape(y{23}+y{15}-y{17}+y{27},1,siz_end)];
        yout=[yout reshape(y{14}-y{18}+y{24}+y{26},1,siz_end)];
        yout=[yout reshape(y{23}-y{15}-y{17}-y{27},1,siz_end)];

        yout=[yout reshape(y{13}-y{25},1,siz_end)];
        yout=[yout reshape(y{16}+y{22},1,siz_end)];
        yout=[yout reshape(y{13}+y{25},1,siz_end)];
        yout=[yout reshape(y{22}-y{16},1,siz_end)];

        yout=[yout reshape(y{11}-y{21},1,siz_end)];
        yout=[yout reshape(y{12}+y{20},1,siz_end)];
        yout=[yout reshape(y{11}+y{21},1,siz_end)];
        yout=[yout reshape(y{20}-y{12},1,siz_end)];

        yout=[yout reshape(y{5}-y{9},1,siz_end)];
        yout=[yout reshape(y{6}+y{8},1,siz_end)];
        yout=[yout reshape(y{5}+y{9},1,siz_end)];
        yout=[yout reshape(y{8}-y{6},1,siz_end)];
        yout=[yout reshape(y{10},1,siz_end)];
        yout=[yout reshape(y{19},1,siz_end)];
        yout=[yout reshape(y{7},1,siz_end)];
        yout=[yout reshape(y{4},1,siz_end)];
        yout=[yout reshape(y{3},1,siz_end)];
        yout=[yout reshape(y{2},1,siz_end)];
        if k==levels
            yout=[yout reshape(y{1},1,siz_end)];
        end
    elseif dim==2
        siz_end=siz(k);  
        yout=[yout reshape(y{5}-y{9},1,siz_end)];
        yout=[yout reshape(y{6}+y{8},1,siz_end)];
        yout=[yout reshape(y{5}+y{9},1,siz_end)];
        yout=[yout reshape(y{8}-y{6},1,siz_end)];
        yout=[yout reshape(y{7},1,siz_end)];
        yout=[yout reshape(y{4},1,siz_end)];
        yout=[yout reshape(y{3},1,siz_end)];
        yout=[yout reshape(y{2},1,siz_end)];
        if k==levels
            yout=[yout reshape(y{1},1,siz_end)];
        end
    elseif dim==1
        siz_end=siz(k);
        yout=[yout reshape(y{3},1,siz_end)];
        yout=[yout reshape(y{2},1,siz_end)];
        if k==levels
            yout=[yout reshape(y{1},1,siz_end)];
        end
    end

end
Sizes.subbands=size_array;
Sizes.sum_subbands=siz;
Sizes.dim=dim;
Sizes.level=levels;
Sizes.tot_length=length(yout);
return;
%end main function


function y=extention(x,filter_len,dim)
dwtEXTM='sym';
sizeEXT = filter_len-1;
y=extend(x,dim,sizeEXT,1);
%y = wextend('addcol',dwtEXTM,x,sizeEXT);
if dim>1
    y=extend(y,dim,sizeEXT,2);
    %y = wextend('addrow',dwtEXTM,y,sizeEXT);
    if dim>2
        y=extend(y,dim,sizeEXT,3);
    end
end
return; %end function


function out=conv3valid(in,filter,size_array,dim,dimension)
filter_len=length(filter);
if dimension~=1
    ROI(:,2)=size(in);
else
    ROI(:,2)=length(in);
end
ROI(:,1)=1;
ROI(dim,1)=1+floor((filter_len-1)/2);
ROI(dim,2)=ROI(dim,2)-floor(filter_len/2);
if dimension==1
    mi=downsample3(conv3(in',filter,ROI),dim);
    out=mi';
else
    out=downsample3(conv3(in,filter,ROI),dim);
end
return;%end function

function t=extend(x,dim,size_ext,method)
siz=size(x);
if method==1 %'addcol'
    if dim==1 & siz(2)==1
        siz(2)=siz(1);
        siz(1)=1;
    end
    if size_ext<=siz(2)
        started=1;
        ended=size_ext;
    else
        started=size_ext-siz(2)+1;
        ended=siz(2);
    end
    if dim==1
        t=zeros(siz(1),siz(2)+size_ext+size_ext);
        t(started:ended+started-1)=x(ended:-1:1);
        t(size_ext+1:size_ext+siz(2))=x;
        t(size_ext+1+siz(2):size_ext+ended+siz(2))=x(siz(2):-1:siz(2)-ended+1);
    elseif dim==2
        t=zeros(siz(1),siz(2)+size_ext+size_ext);
        t(:,started:ended+started-1)=x(:,ended:-1:1);
        t(:,size_ext+1:size_ext+siz(2))=x;
        t(:,size_ext+1+siz(2):size_ext+ended+siz(2))=x(:,siz(2):-1:siz(2)-ended+1);
    elseif dim==3
        t=zeros(siz(1),siz(2)+size_ext+size_ext,siz(3));
        t(:,started:ended+started-1,:)=x(:,ended:-1:1,:);
        t(:,size_ext+1:size_ext+siz(2),:)=x;
        t(:,size_ext+1+siz(2):size_ext+ended+siz(2),:)=x(:,siz(2):-1:siz(2)-ended+1,:);
    end
elseif method==2 %'addrow'

    if size_ext<=siz(1)
        started=1;
        ended=size_ext;
    else
        started=size_ext-siz(1)+1;
        ended=siz(1);
    end
    if dim==2
        t=zeros(siz(1)+size_ext+size_ext,siz(2));
        t(started:ended+started-1,:)=x(ended:-1:1,:);
        t(size_ext+1:size_ext+siz(1),:)=x;
        t(size_ext+1+siz(1):size_ext+ended+siz(1),:)=x(siz(1):-1:siz(1)-ended+1,:);
    elseif dim==3
        t=zeros(siz(1)+size_ext+size_ext,siz(2),siz(3));
        t(started:ended+started-1,:,:)=x(ended:-1:1,:,:);
        t(size_ext+1:size_ext+siz(1),:,:)=x;
        t(size_ext+1+siz(1):size_ext+ended+siz(1),:,:)=x(siz(1):-1:siz(1)-ended+1,:,:);
    end
elseif method==3 %'addz'
    if dim==3
        t=zeros(siz(1),siz(2),siz(3)+size_ext+size_ext);
        if size_ext<=siz(3)
            started=1;
            ended=size_ext;
        else
            started=size_ext-siz(3)+1;
            ended=siz(3);
            t(:,:,1:started-1)=x(:,:,siz(3)-started+1:siz(3)-1);
            t(:,:,size_ext+ended+siz(3)+1:size_ext+size_ext+siz(3))=x(:,:,1:started-1);
        end
        t(:,:,started:ended+started-1)=x(:,:,ended:-1:1);
        t(:,:,size_ext+1:size_ext+siz(3))=x;
        t(:,:,size_ext+1+siz(3):size_ext+ended+siz(3))=x(:,:,siz(3):-1:siz(3)-ended+1);

    end
end
return; %end function

function y=downsample3(x,dim)
[m,n,p]=size(x);
if dim==1
    y=x(1:3:m,:,:);
elseif dim==2
    y=x(:,1:3:n,:);
elseif dim==3
    y=x(:,:,1:3:p);
end
return;%end function

Contact us at files@mathworks.com