function [C, L] = dtcwt(x, J, H)

% Implementacija dual-tree kompleksne wavelet transformacije
%
% argumenti:
% 
%  x          - ulazni signal
%  J          - razina razlaganja
%  H          - matrica filtara:
%  ==                                                   ==
%  | anal. NP filtar na prvoj razini gornjeg sloga       |
%  | anal. VP filtar na prvoj razini gornjeg sloga       |
%  | anal. NP filtar na prvoj razini donjeg sloga        |
%  | anal. VP filtar na prvoj razini donjeg sloga        |
%  | anal. NP filtar na ostalim razinama gornjeg sloga   |
%  | anal. VP filtar na ostalim razinama gornjeg sloga   |
%  | anal. NP filtar na ostalim razinama donjeg sloga    |
%  | anal. VP filtar na ostalim razinama donjeg sloga    |
%  ==                                                   ==
%
%  Ocekuje se da ce filtri biti istih duzina
%
%  Izlaz je konstruiran identicno izlazu funkcije WAVEDEC

if J < 1
    disp('Razina razlaganja mora biti >= 1');
    return;
end

j = sqrt(-1);

% prva razina
[CAh, CDh] = dwt(x, H(1, :), H(2, :));
[CAg, CDg] = dwt(x, H(3, :), H(4, :));

% ako se trazi samo prva razina razlaganja, stvar je rijesena

if J == 1
	C = [ (CAh + j*CAg) (CDh + j*CDg) ];
	L = [ max(length(CAh), length(CAg)) max(length(CDh), length(CDg)) length(x)];
	return;
end

% ako je potrebno razlozi CAh i CAg J-1 puta sa novim filtrima
[Ch, Lh] = wavedec(CAh, J-1, H(5, :), H(6, :));
[Cg, Lg] = wavedec(CAg, J-1, H(7, :), H(8, :));

C = [ (Ch + j*Cg) (CDh + j*CDg)];
L = [ Lg(1:end-1) max(length(CDh), length(CDg)) length(x)];


