% =================================================================
% FILTRO CORRELADOR PARA DETECTAR RETARDO DE UNA SENAL
%
% OBS: El directorio de trabajo debe contener el dato "wavelet"
% =================================================================

clear all; close all; close all;

% =================================================================
% Lectura de la ondicula
% =================================================================

wavelet=load('wavelet'); %  cargo la ondicula
Nw = length(wavelet);    %  tamano de la ondicula
Ns = 4 * Nw;             %  tamano de la senal

% =================================================================
% La senal, como la ondicula retrasada y normalizada
% =================================================================

signal(Ns) = 0; % la senal inicial sin ondicula

delay = 60;     % cantidad de muestras que retraso la ondicula

for i = 1:Nw
  signal( delay + i ) = wavelet(i); % agrego la ondicula en la senal
end
  
signal = signal / max(abs(wavelet)); % normalizo

% =================================================================
% Ruido     aleatorio    normalizado     a    [-noiselevel,noiselevel]
% =================================================================

noiselevel = 0.1;  %  amplitud del ruido
 
noise = noiselevel * randn(1,Ns);  % secuencia aleatoria

% =================================================================
% Sumo el ruido a la senal
% =================================================================

trace = signal + noise;

% =================================================================
% Croscorrelacion
% =================================================================

% Croscorrelacion entre la senal contaminada y la ondícula original
% para detectar el "arribo" (retardo) de la ondicula.

wavelet_reb = wavelet(Nw:-1:1);            % rebato la ondicula
corr        = conv(wavelet_reb,trace);     % longitud = wavelet + trace - 1

% quito efectos de borde (es una CORRELACION CRUZADA)
trace_corr  =  corr( Nw : Nw + Ns-1 );  % misma longitud que trace

% =================================================================
% Indice de la muestra donde se inicia la ondicula
% =================================================================

% Busco el maximo de la correlacion

maximo = max(trace_corr);
for i = 0:Ns-1
  if trace_corr(i+1) == maximo
    arribo = i;
  endif
end

printf("El nivel de ruido es: \n")
noiselevel
printf("El retardo de la ondicula es: \n")
delay
printf("El maximo de la correlacion esta en: \n")
arribo

% =================================================================
% GRAFICOS 
% =================================================================

% --------------------------------------------------------
% Grafico senal, ruido, traza(senal + ruido) y correlacion
% --------------------------------------------------------

figure(1); clf;

% Ondicula con retardo

subplot(2,2,1)
plot(0:Ns-1,signal,'r');
title('Senal')
axis([0 Ns-1 -1.2 +1.2])

% Ruido 

subplot(2,2,3)
plot(0:Ns-1,noise,'k');
title('Ruido')
axis([0 Ns-1 -1.2 +1.2])

% Ondicula con retardo mas ruido

subplot(2,2,2)
plot(0:Ns-1,trace,'b');
title('Senal + Ruido')
axis([0 Ns-1 -1.2 +1.2])

% Correlacion

subplot(2,2,4)
plot((0:Ns-1),trace_corr,'g'); % sin efectos de borde
%plot((0:length(trace_corr)-1),trace_corr,'r'); % con efectos de borde
title('Correlacion')
grid
axis([0 Ns-1 -1.2*max(abs(trace_corr)) +1.2*max(abs(trace_corr))])


% Lo que sucede si olvido quitar los efectos de borde 


figure(2);
Nc=length(corr);
hold on
plot((0:Ns-1),trace_corr,'g;sin borde;'); % sin efectos de borde :)
plot((0:Nc-1),corr,'r;con borde;');       % con efectos de borde :(
hold off
grid
title('Correlacion con efectos de borde')
axis([0 Ns-1 -1.2*max(abs(trace_corr)) +1.2*max(abs(trace_corr))])



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

% Guardo el grafico en un postscript

% print('filtro_correlador.eps','-depsc');
