function C = fdct_usfft(X,is_real,nscales)
% Rychla diskretni Fourierova transformace pres FFT
%
% Vstup
%   x           N az N rada pixelu (N dyadicky) 
%
% Volitelne vstupy
%   is_real    Typ transformace
%                   0: komplexne oceneny curvelet
%                   1: realne oceneny curvelet
%              [defaultne nastavena 0]
%
%   nscales    pocet vah vcetne nejhrubsi waveletove urovne [vychozi log2(N) - 3]
%   
% Vystup
%   C           pole curvelet koeficientu
%               C{j}{l}(k1,k2) je koeficient o
%                   - vaze j: cele cislo od nejhrubsiho po nejjemnějsi
%                   meritko
%                   - orientace l: znacky orientace od leveho horniho rohu,
%                   zvyseni ve smeru hodinovychu rucicek
%                   - pozice k1,k2: obe cisla cela, velikost se meni s j
%                     a l.
%
%               kdyz is_real = 1, symetricke znacky kolem puvodu jsou
%               sparovany jako realne  koeficienty odpovidajici cosinu nebo
%               sinu curveletu
%
% dale ifdct_usfft.m, afdct_usfft.m
%
% od Emmanuel Candes, 2003--2004


  [m,n] = size(X);
  J = log2(n);
  
  if nargin < 3
    nscales = log2(n) - 3; 
  end
  
  if nargin < 2,
    is_real = 0;
  end
    
  L = J - nscales + 1; % Hrube meritko
  scale = (L-1):(J-1);
  deep = floor(scale/2) + 1; 
  
  S = SeparateScales(X,L);
  
  C = cell(1,nscales);
  C{1} = cell(1,1);
  C{1}{1} =  CoarseCurveCoeff(S{1});
  for s = 2:nscales - 1
    C{s} = DetailCurveCoeff(S{s},deep(s),is_real); 
  end
  C{nscales} = cell(1,1);
  C{nscales}{1} = FineCurveCoeff(S{nscales});
  
  if is_real
    C = fdct_usfft_c2r(C);
  end
