%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Algoritmus rychle Fourierovy transformace (zpetne) %
% zalozeny na jejim maticovem zapisu                 %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function x=myifft(X);

% Jestlize je x radkovy vektor, bude preveden na sloupcovy
[n1,n2]=size(X);
if n2>1; X=rot90(X,-1); OK=1; 
else OK=0;
end;

N=length(X);
n=log2(N);  % n...pocet urovni

% Vytvoreni permutacniho vektoru pt
pt=(1:N)';  
i_odd=(1:N/2)*2-1;  % i_odd..liche indexy
i_even=(1:N/2)*2;   % i_even.. sude indexy
for i=1:n-1
   m=2^(i-1);
   K=N/(2*m);
   pt_odd=reshape(pt(i_odd),K,m);  % preusporadani prvku
   pt_even=reshape(pt(i_even),K,m);
   pt=reshape([pt_odd;pt_even],N,1);
end;

% Prenasobovani dilcimi maticemi
x=X;   
for i=n:-1:1
   K=2^i; m=N/K;               % m je pocet bloku B na diagonale, K je rad bloku B
   w=exp(2i*pi/K);
   D=diag(w.^(0:-1:-(K/2-1))); % Diagonalni matice s prvky w
   I=eye(K/2);                 % Jednotkova matice
   B=[[I,D];[I,-D]];           % Blok B
   V=diags(B,m);               % Matice sestavena z m bloku B
   x=V'*x;
end;
x=x(pt);
x=(1/N)*x;

if OK; x=rot90(x); end;
