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