function Dxf =  DF_1Da(x,f)

% Derivada com a Transformada de Fourier via FFT
%
% considerando o par (f(x),F(k)) definido por 
%
% F(k) = \int f(x)*exp(-i*2*pi*k*x) dx
% f(x) = \int F(k)*exp( i*2*pi*k*x) dk

% Adiciona um ponto artificial (b+dx) no final do grid do dominio fisico (x) 

N  = length(x);     % Atencao: na malha original, temos N-1 intervalos, assim
a  = x(1);          % dx = x(2)-x(1) = (x(N)-x(1))/(N-1)  
dx = x(2) - x(1);   % na malha nova, temos N intervalos, e o "novo" dx seria 
b  = x(N)+dx;       % DX = (x(N)+dx - x(1))/N = N*dx/N = dx  (nao muda!) 
  
% Grid do dominio da frequencia (kappa)

k = (-N/2+1):(N/2); 
kappa = (k - 1)/(b-a);

% Transformada via FFT

F = dx*fft(f);   % resultado no dominio [0,N] = [0,2*kp]
F = fftshift(F); % redistribui o dominio da freq. para [-kp,kp]
F = F.*exp(-I*2*pi*a*kappa); % corrige com o termo da extremidade 'a' de [a,b]

% Calcula derivada no dominio da frequencia

dxF = I*(2*pi)*kappa.*F;

% Transformada inversa

dxF = exp(I*2*pi*a*kappa).*dxF; % desfaz a correcao da extremidade
dxF = ifftshift(dxF);           % desfaz a distribuicao para [-kp,kp]
Dxf = (1/dx)*ifft(dxF);
Dxf = real(Dxf);

% Graficos (se nao houver argumentos de saida)

if(nargout==0)

  close all
  figure

  df = (f(3:end)-f(1:end-2))/(2*dx);  % calcula df por difs finitas
  df(end+2)   = df(end);              % (para comparar)
  df(2:end-1) = df(1:end-2);
  
  subplot(1,2,1)
    plot(x,df)
    title('Derivada via difs finitas');
    v=axis;
    %axis([a,b,min(df),max(df)])
    grid
  subplot(1,2,2)
    plot(x,Dxf)
    %axis([a,b,min(df),max(df)])
    title('Derivada via FFT');
    axis(v)
    grid
  
    Dxf = [];

end

