    function Dmf = fodxm(f,m)

% Dmf = fodxm(f,m) computes the m-th derivative of the function
% f(x) using the Fourier differentiation process.   The function 
% is assumed to be 2pi-periodic and the input data values f should 
% correspond to samples of the function at N equispaced points on [0, 2pi).
% The Fast Fourier Transform is used.
% 
%  Input:
%  f:      Vector of samples of f(x) at x = 0, 2pi/N, 4pi/N, ... , (N-1)2pi/N
%  m:      Derivative required (non-negative integer)
%
%  Output:
%  Dmf:     m-th derivative of f
%
%  S.C. Reddy, J.A.C. Weideman 2000.

     f = f(:);                       % Make sure f is a column vector
     N = length(f);

     N1 =  floor((N-1)/2);           % Set up wavenumbers           
     N2 = (-N/2)*(rem(m,2)==0)*ones(rem(N,2)==0);
   wave = [(0:N1)  N2 (-N1:-1)]';

Dmf = ifft(((i*wave).^m).*fft(f));   % Transform to Fourier space, take deriv,
                                     % and return to physical space.

if max(abs(imag(f))) == 0; Dmf = real(Dmf); end  % Real data in, real derivative out
