function y = fft31(x,u,ip,op)
% y = fft31(x,u,ip,op)
% y  : the 31 point DFT of x 
% u  : a vector of precomputed multiplicative constants
% ip : input permutation
% op : ouput permutation

y = zeros(31,1);
x = x(ip);                                        % input permutation
x(2:31) = KRED([2,3,5],[1,1,1],3,x(2:31));        % reduction operations
y(1) = x(1)+x(2);                                 % DC term calculation
% -------------------- block : 1 -------------------------------------------------
y(2) = x(2)*u(1);                       
% -------------------- block : 2 -------------------------------------------------
y(3) = x(3)*u(2);                       
% -------------------- block : 3 -------------------------------------------------
v = ID2I(1,1,x(4:5));              % v = (I(1) kron D2 kron I(1)) * x(4:5)
v = v.*u(3:5);                          
y(4:5) = ID2tI(1,1,v);             % y(4:5) = (I(1) kron D2' kron I(1)) * v
% -------------------- block : 6 = 2 * 3 -----------------------------------------
v = ID2I(1,1,x(6:7));              % v = (I(1) kron D2 kron I(1)) * x(6:7)
v = v.*u(6:8);                          
y(6:7) = ID2tI(1,1,v);             % y(6:7) = (I(1) kron D2' kron I(1)) * v
% -------------------- block : 5 -------------------------------------------------
v = ID2I(1,2,x(8:11));             % v = (I(1) kron D2 kron I(2)) * x(8:11)
v = ID2I(3,1,v);                   % v = (I(3) kron D2 kron I(1)) * v
v = v.*u(9:17);                         
v = ID2tI(1,3,v);                  % v = (I(1) kron D2' kron I(3)) * v
y(8:11) = ID2tI(2,1,v);            % y(8:11) = (I(2) kron D2' kron I(1)) * v
% -------------------- block : 10 = 2 * 5 ----------------------------------------
v = ID2I(1,2,x(12:15));            % v = (I(1) kron D2 kron I(2)) * x(12:15)
v = ID2I(3,1,v);                   % v = (I(3) kron D2 kron I(1)) * v
v = v.*u(18:26);                        
v = ID2tI(1,3,v);                  % v = (I(1) kron D2' kron I(3)) * v
y(12:15) = ID2tI(2,1,v);           % y(12:15) = (I(2) kron D2' kron I(1)) * v
% -------------------- block : 15 = 3 * 5 ----------------------------------------
v = ID2I(1,4,x(16:23));            % v = (I(1) kron D2 kron I(4)) * x(16:23)
v = ID2I(3,2,v);                   % v = (I(3) kron D2 kron I(2)) * v
v = ID2I(9,1,v);                   % v = (I(9) kron D2 kron I(1)) * v
v = v.*u(27:53);                        
v = ID2tI(1,9,v);                  % v = (I(1) kron D2' kron I(9)) * v
v = ID2tI(2,3,v);                  % v = (I(2) kron D2' kron I(3)) * v
y(16:23) = ID2tI(4,1,v);           % y(16:23) = (I(4) kron D2' kron I(1)) * v
% -------------------- block : 30 = 2 * 3 * 5 ------------------------------------
v = ID2I(1,4,x(24:31));            % v = (I(1) kron D2 kron I(4)) * x(24:31)
v = ID2I(3,2,v);                   % v = (I(3) kron D2 kron I(2)) * v
v = ID2I(9,1,v);                   % v = (I(9) kron D2 kron I(1)) * v
v = v.*u(54:80);                        
v = ID2tI(1,9,v);                  % v = (I(1) kron D2' kron I(9)) * v
v = ID2tI(2,3,v);                  % v = (I(2) kron D2' kron I(3)) * v
y(24:31) = ID2tI(4,1,v);           % y(24:31) = (I(4) kron D2' kron I(1)) * v
% --------------------------------------------------------------------------------
y(2) = y(1)+y(2);                                 % DC term calculation
y(2:31) = tKRED([2,3,5],[1,1,1],3,y(2:31));       % transpose reduction operations
y = y(op);                                        % output permutation

% For complex data - 
% Total Number of Real Multiplications : 160
% Total Number of Real Additions: 776

