function s=icwtg(A,q); 

%               A=icwtg(A,q); 
%
%Cette fonction inverse la transformée en ondelettes continue 
%          (a,b) ---> (1/sqrt (a)) * cwt_psi [S] (a,b) 
%lorsque l'ondelette est la dérivée à l'ordre q de l'atome gaussien. La
%matrice d'entrée A est une matrice à (p-1)*m lignes et 2^n colonnes,
%correspondant à la transformée en ondelettes continue d'un signal
%analogique S de longueur 2^p, le nombre de voix par octave étant m, ou à
%une modification de cette matrice (via par exemple l'interpolation ligne
%par ligne des valeurs prises aux maxima locaux, l'extrapolation des
%moyennes aux petites échelles après mise à zéro des niveaux manifestement
%bruités, etc.). ATTENTION! Cette opération d'inversion ne fonctionne
%numériquement que sur les signaux de moyenne nulle (la formule d'inversion
%de la transformée en ondelettes continue n'étant valide que sur l'espace
%des signaux d'énergie finie).  

[nn,mm]=size(A');
s=zeros(1,nn);
n_octaves=floor(log2(nn))-1;
n_voix=fix(mm/n_octaves); 
cwt_hat = fft(A');
r=mod(q,2);
xi   = [ (0: (nn/2)) (((-nn/2)+1):-1) ] .* (2*pi); 
	
n_echelles=mm;
k_echelle=1;
echelle=4;
B= zeros(nn,n_echelles);

for j = 1:n_octaves,
	    for l = 0:n_voix-1,
	           t=n_voix*(j-1)+l+1;
		   q_echelle = echelle.* (2^(l/n_voix));
		   omega  = (xi ./ q_echelle)' ;
                   psi_hat=(omega.^q).* exp(-(omega.^2) ./2);
		   w_hat = psi_hat .* (cwt_hat(:,t)); 
		   w    = ifft(w_hat);
                   if (r==0) 

                      u=real(w);
                   else

                      u=-imag(w);
                   end
                B(1:nn,k_echelle)=u;
		   k_echelle = k_echelle+1;
	    end
	    echelle  = echelle *2;
end 
s=sum(conj(B'));
s=2*s/gamma(q);
s=log(2)*s/n_voix;
s=s';