function [x] = spm_hilbert(xr)
% Computes analytic signal
% FORMAT [x] = spm_hilbert(xr)
%
% Returns analytic signal x = xr + i*xi such that 
% xi is the Hilbert transform of real vector xr.
%__________________________________________________________________________
% Copyright (C) 2009 Wellcome Trust Centre for Neuroimaging
 
% Will Penny
% $Id: spm_hilbert.m 4024 2010-07-28 18:43:19Z guillaume $

if ~isreal(xr)
  xr = real(xr);
end

% Work along the first nonsingleton dimension
[xr,nshifts] = shiftdim(xr);

n = size(xr,1);
x = fft(xr,n,1); % n-point FFT over columns.
h  = zeros(n,~isempty(x)); % nx1 for nonempty. 0x0 for empty.
if n > 0 && 2*fix(n/2) == n
  % even and nonempty
  h([1 n/2+1]) = 1;
  h(2:n/2) = 2;
elseif n>0
  % odd and nonempty
  h(1) = 1;
  h(2:(n+1)/2) = 2;
end
x = ifft(x.*h(:,ones(1,size(x,2))));

% Convert back to the original shape.
x = shiftdim(x,-nshifts);
