%% ====================================================
%% TRANSFORMADA DE HILBERT
%% ====================================================

clear all; close all;

% =====================================================
% Genero una ondícula de Ricker
% =====================================================

leng = 108; % Longitud (ms).
dt   = 1;   % Intervalo de muestreo (ms).
f0   = 30;  % Frecuencia (Hz).

rw = ricker(leng,dt,f0) ;
N  = length(rw);
M  = (N - 1)/2;

% =====================================================
% Transformada discreta de Fourier de la senal
% =====================================================

RW = fft(rw) ;

% =====================================================
% Transformada de Hilbert (en frecuencia)
% =====================================================

dw = 2*pi/N ;
for k = 1:N
  wk = dw*(k-1) ;
  if wk == 0
    HW(k) = 0 ;            % w = 0
  elseif wk <= pi
    HW(k) = RW(k)*(+1i) ;  % w > 0
  else   
    HW(k) = RW(k)*(-1i) ;  % w < 0 (frecuencias negativas)
  endif
end

% Otra forma más simple.
% Observar que podría haber calculado la T. de Hilbert así:
% HW(1) = 0 ;                    % w = 0
% HW(2:M+1) = RW(2:M+1)*(+1i) ;  % w > 0
% HW(M+2:N) = RW(M+2:N)*(-1i) ;  % w < 0

% =====================================================
% Transformada de Hilbert (en tiempo)
% =====================================================

hw = real(ifft(HW)) ;

% =====================================================
% Graficos
% =====================================================

figure(1);
hold on
plot((-M:M)*dt,rw,';Ondicula de Ricker;b-');
plot((-M:M)*dt,hw,';Transformada de Hilbert;g-','linewidth',2);
hold off;
axis([-M*dt,M*dt,-1.1,1.1]);

% =====================================================
% Salida
% =====================================================

% Guardo el gráfico en un postscript
print('hilbert_ricker.eps','-depsc');
