%
% Funzione che fornisce un filtraggio in frequenza operando direttamente sulla trasformata
%

clc
close all
clear


%% GENERAZIONE DEL SEGNALE
t = 0.01:0.01:50;
ss = length(t);
s = sin(2*pi*t/5);
figure 
plot(t,s)
title('Segnale Originario')
xlabel('Tempo [s]')
grid on

%% CALCOLO E RAPPRESENTAZIONE DELLA TRASFORMATA
sfft = fft(s);
f = ( 1:length(t) )/max(t);
figure, 
plot(f , abs(sfft)/ss )
grid on
title('Trasformata di Fourier del segnale Originario')
xlabel('[Hz]')


%% AGGIUNTA DI RUMORE
s = s + 0.3*sin(2*pi*t/0.25) + 0.2*sin(2*pi*t/0.1) + 0.2*rand(size(t));
figure
plot(t,s)
title('Segnale Corrotto da Rumore')
xlabel('Tempo [s]')
grid on


%% CALCOLO E RAPPRESENTAZIONE DELLA TRASFORMATA

sfft = fft(s);
figure
plot(f , abs(sfft)/ss )
grid on
title('Trasformata di Fourier del Segnale Corrotto da Rumore')
xlabel('[Hz]')


%% COSTRUZIONE DEL FILTRO IN FREQUENZA
% Si costruisce la parte corrispondente alle frequenze positive:

filtro = exp(-0.5*f(1 : ceil(length(f)/2) +1).^2); % Notare che è un vettore reale

% Si agginge la parte corrispondente alle frequenze negative (in coda e invertita)
% facendo attenzione al fatto che il primo campione deve corrispondere alla
% continua mentre l'ultimo alla prima componente negativa (ovvero la componente
% continua non si ripete nello spettro; a tale proposito si analizzi attentamente la
% figura della Trasformata di Fourier del segnale):

filtroNeg = fliplr(filtro);
filtroNeg = filtroNeg(2:end-1);
filtro = [filtro filtroNeg];
sfft_F = sfft.*filtro;


figure
plot(f,filtro, f,abs(sfft)/ss, f,abs(sfft_F)/ss)
xlabel('[Hz]')
grid on
legend('Caratteristica in frequenza del filtro' , 'Trasformata del segnale Originario', 'Trasformata del segnale Filtrato')


s_F = ifft(sfft_F);

figure
plot(t,s, 'b', t,s_F ,'r')
grid on,
xlabel('Tempo [s]')
legend('Segnale Corrotto da Rumore' , 'Segnale Filtrato')


figure
plot(imag(s_F))
title('Residui immaginari nella antitrasformata')

figure
plot(t,sin(2*pi*t/5), 'b', t,s_F ,'r')
title('Confronto con segnale originario ancora non corrotto da rumore')
grid on
xlabel('Tempo [s]')
legend('Segnale Originario non corrotto da rumore' , 'Segnale Filtrato')