function ASf =  As(x,f)

% Sinal analitico via FFT
% versao com o dominio estendido
%
% 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

I = i; % unidade imaginaria

% 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!) 
  
% Extensao do grid

x_esq = x - (b-a);     % extensao 'a esquerda do grid
x_dir = x + (b-a);     % extensao 'a direita do grid

x_ext = [x_esq,x,x_dir];

% Extensao da funcao f em x_dir e x_esq

D = 2;
X = x_esq - x(1);
A = f(1);
B = (f(2)-f(1))/dx - A*D;
C = (f(3)-2*f(2)+f(1))/dx^2 - 2*B*D - A*D^2;

f_esq = (A + B*X + 0.5*C*X.^2).*exp(D*X);

D = -2;
X = x_dir - x(N);
A = f(N);
B = (f(N)-f(N-1))/dx - A*D;
C = (f(N)-2*f(N-1)+f(N-2))/dx^2 - 2*B*D - A*D^2;

f_dir = (A + B*X + 0.5*C*X.^2).*exp(D*X);

f_ext = [f_esq,f,f_dir];

% Calcula a transformada do sinal analitico

F = fft(f_ext);
F(ceil(3*N/2)+1:end) = 0;
F(1) = F(1)/2;

% Transformada inversa

Asf = ifft(2*F);
Asf = Asf(N+1:2*N); % Corta a resposta no intervalo [a,b]

% Grafico da transf. de Hilbert (se nao houver argumentos de saida)

if(nargout==0)
  figure
  plot(x,imag(Asf))
end