%% =========================================================================
%% FRECUENCIAS DE LA TRASNFORMADA DISCRETA DE FOURIER Y ZERO PADDING
%% (tomado del libro de John H. Karl, page 139)
%%
%% La funci�n continua sin(w0*t) s�lo debiese tener componentes no nulas en 
%% frecuencia en w0 y en -w0. Pero si la se�al es discreta y 
%% finita, esto s�lo ocurre si las muestras en frecuencia est�n 
%% efectivamente equiespaciadas en dw como ocurre al calcular la TDF.
%%
%% Al hacer zero padding para tener un mejor muestreo de la respuesta en 
%% y del especto de amplitud se revela el efecto de haber truncado la se�al 
%% en tiempo por una funci�n caj�n. En frecuencia, este efecto equivale a 
%% convolucionar el espectro de la se�al original on un seno cardinal.
%% =========================================================================

clear; 
clf;

N  = 32;          % n�mero de muestras
dt = 1;           % intervalo de muestreo (s)
T  = (N-1)*dt;    % largo de la ventana de observaci�n (s)
dw = 2*pi/(N*dt); % paso en frecuencia angular (rad/s)

w0 = 3*dw; % sin zero padding esta frecuencia angular cae justo en 
           % una de las frecuencias de la TDF.
           % El sinc que aparece por tomar la ventana de largo T tiene sus 
           % ceros alineados con las  frecuencias de la TDF, salvo en la
           % frecuencia w0 = n*dw, donde toma el valor m�ximo.

% Probar con esto descomentando          
% w0 = 3.5*dw; 
           
           

% Sin zero padding

t = 0:dt:T;    % vector tiempo
x = sin(w0*t); % se�al de entrada
X = fft(x);    % TDF de la entrada

% Con N ceros adelante y atrás para revelar el sinc "escondido"

xpad  = [zeros(1, N) x zeros(1, N)]; % nueva se�al de entrada
tpad  = (-N:2*N-1)*dt;               % nuevo vector tiempo
Xpad  = fft(xpad);                   % TDF de la nueva entrada
Npad  = length(xpad);
dw2   = 2*pi/(Npad*dt);

% =========================================================================
% GRAFICOS sin zero padding
%
% El muestreo en frecuencua genera periodicidad en tiempo. Por lo tanto,
% la se�al fuera de la ventana se repetir� peri�dicamente generando una
% sinusoide continua.
%
% El espectro de amplitud |TDF(x_t)| parece ser extremadamente preciso. 
% Esto ocurre porque el sinc asociado a la ventana de largo T,
% que contiene la senal x_t, tiene sus ceros exactamente
% en los puntos de la TDF, salvo donde toma el valor maximo.
% Esto es equivale a que x_t se trate de una senal peri�dica infinita.
% =========================================================================

figure(1); clf;

% x_t (en tiempo)

subplot(2,1,1)
plot(t, x, '*-b')
title('Sin zero padding')
axis([-N*dt 2*N*dt -1.3 1.3])
set (gca, 'xtick', [0 T]) 
set (gca, 'xticklabel', {'0', 'T'}) 
xlabel('t'); 
ylabel('x_t'); 

% X_k = TDF{x_t} (en frecuencia)

C = max(abs(X))
subplot(2,1,2)
stem([0:N-1]*dw, abs(X)/C, 'r')
axis([0 (N-1)*dw -0.2 1.5])
xlabel('\Omega');
ylabel('|X_k|');

% =========================================================================
% GRAFICOS con zero padding
%
% En tiempo al hacer zero padding consideramos que la se�al vale 0 fuera 
% de la ventana de observaci�n T.
%
% En frencuencia se revela el sinc asociado a la ventana de largo T.
% =========================================================================

figure(2); clf;

% xpad_t (en tiempo)

subplot(2,1,1)
plot(tpad, xpad, '*-b')
title('Con zero padding')
axis([-N*dt 2*N*dt -1.3 1.3])
set (gca, 'xtick', [0 T]) 
set (gca, 'xticklabel', {'0', 'T'}) 
xlabel('t'); 
ylabel('x^{pad}_t'); 

% Xk = TDF{x_t} (en frecuencia)

subplot(2,1,2)
plot([0:Npad-1]*dw2, abs(Xpad)/C, 'g'); hold on
stem([0:N-1]*dw, abs(X)/C, 'r') 
axis([0 (N-1)*dw -0.2 1.5])
xlabel('\Omega');
ylabel('|X^{pad}_k|'); hold off

% =================================== X ===================================

