% ==================================================================
% FILTRO PASO  BAJO TRUNCADO POR  VENTANA RECTANGULAR VS.  FILTRO PASO
% BAJO TRUNCADO POR VENTANA DE HAMMING.
% ==================================================================

clear all; close;

% --------------------------------------------------------------
% Parametros del filtro
% --------------------------------------------------------------

N  =    31; % Numero de muestras  del filtro (impar)
wc =  pi/2; % Frecuencia de corte

% --------------------------------------------------------------
% Parametros derivados
% --------------------------------------------------------------

M  = (N-1)/2; % "mitad" del número de muestras del filtro
dw = 2*pi/N;  % intervalo de frecuencia

% --------------------------------------------------------------
% Definición del filtro (en tiempo) y ventana de Hamming
% --------------------------------------------------------------

% h   : filtro en tiempo (sinc)
% hamm: ventana de Hamming

for n = -M:M
  if n ~= 0
    h(n+M+1) = sin(wc*n)/(pi*n);
  else
    h(M+1) = wc/pi;
  end
  hamm(n+M+1) = 0.54 - 0.46*cos(2*pi*(n+M)/(N-1)); % 1 <= n+M+1 <= 2M + 1 = N
end

% --------------------------------------------------------------
% Trunco el sinc mediante la ventana de Hamming
% --------------------------------------------------------------

h_w = h .* hamm;  

% --------------------------------------------------------------
% Zero padding
% --------------------------------------------------------------

N2  = 1024;    % Muestras para zero padding (potencia de 2 para fft)
dw2 = 2*pi/N2; % Intervalo de frecuencia con zero padding, dw2 << dw

% Zero padding y espectro de amplitud de h

h2     = h;
h2(N2) = 0;
H2     = abs(fft(h2));

% Zero padding y espectro de amplitud de h_w

h_w2     = h_w;
h_w2(N2) = 0;
H_W2     = abs(fft(h_w2));

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

% --------------------------------------------------------------
% En tiempo
% --------------------------------------------------------------

figure(1); clf;

subplot(3,1,1)
hold on
stem((-M:M),h,'r');
%plot((-M:M),h,';Filtro truncado por ventana rectangular;ro');
hold off
title('Filtro rectangular pasabajos con ventana');
axis([-M,M,-0.15,max(h)]);
ylabel('h_n')    
subplot(3,1,2)
%plot((-M:M),hamm,';Ventana de Hamming;go');
plot((-M:M),hamm,'go');
axis([-M,M,-0.15,1.1]);
ylabel('w_n')    
subplot(3,1,3)
hold on
stem((-M:M),h_w,'b');
%plot((-M:M),h_w,';Filtro truncado por ventana rectangular;bo');
hold off

axis([-M,M,-0.15,max(h)]);

xlabel('n')  
ylabel('h_n x w_n')    


% --------------------------------------------------------------
% Comparación sinc vs Hamming en tiempo y frecuencia
% --------------------------------------------------------------

figure(2); clf;


% Espectros de amplitud 

w2 = (0:N2-1)*dw2; %

% Ticks para los gráficos
xt      = 0:pi/2:2*pi;
xtlabel = ["0";"{/Symbol p}/2";"{/Symbol p}";"3/2{/Symbol p}";"2{/Symbol p}"];

% Espectro lineal
subplot(2,1,1)
hold on
plot(w2,H2,'r;Rectangular;')
plot(w2,H_W2,'b;Hamming;');
hold off
set(gca,"xtick",xt,"xticklabel",xtlabel);
axis([0,pi,-0.2,1.2]);
xlabel('{/Symbol w}')  
ylabel('|H({/Symbol w})|')    


% Espectro de decibeles: 1 dB = 20 log_10(.)
subplot(2,1,2)
hold on
plot(w2,20*log10(H2),'r')
plot(w2,20*log10(H_W2),'b');
hold off
set(gca,"xtick",xt,"xticklabel",xtlabel);
axis([0,pi,-80,5]);
xlabel('{/Symbol w}')  
ylabel('|H({/Symbol w})|, dB')    



% --------------------------------------------------------------
% Salida
% --------------------------------------------------------------

print('pasabajos_hamm.eps','-depsc')

