% DEMO_OFDM_TIEMPO_FREC
%
% COMUNICACIONES DIGITALES
% Tema 4
% Ejemplo de la relación tiempo-frecuencia en OFDM.
% Muestra el efecto del sobremuestreo
% Presenta la reconstrucción de la señal contínua a partir de las muestras discretas
% Curso 2022-2023


%   Copyright (c) 2021 G.T.A.S. (Grupo Tratamiento Avanzado de Señal)
%                 DICOM Universidad de Cantabria

%===========================================================================
% Historia de Modificaciones:
% ----------------------
%	o	Creada y Comprobada bajo MATLAB R2019a 19/03/2020
%   o   Modificado zeropadding frecuencial 30/04/2021
%   o   Aumentado grosor señales continuas 03/04/2023
%===========================================================================


%% Parámetros a modificar por el alumno

s = [ +1-1i ; +1-1i ; -1+1i ; -1-1i];   % Vector con el símbolo complejo de cada subportadora (longitud potencia de 2) p.e. s = [ +1-1i ; +1-1i ; -1+1i ; -1-1i];
% s = [ +1-1i ; 0 ; 0 ; 0];
% s = [ 0 ; +1-1i ; 0; 0];
% s = [ 0 ; 0 ; -1+1i ; 0];
% s = [ 0 ; 0 ; 0 ; -1-1i];
% s = [ +1-1i ; +1+1i ; -1+1i ; +1-1i ; -1+1i ; +1-1i ; +1+1i ; -1+1i];

L = 5;  % Factor de sobremuestreo
% L = 10;

%% Generación de la secuencia en el dominioi del tiempo
N = length(s);  % Número de subportadoras (y tamaño de IFFT)
n = (0:N-1);    % Vector de índices temporales y frecuenciales

x = ifft(s,N);  

%% Gráficas de las secuencias en la frecuencia y en el tiempo
ejes = [0 N [-1.5 1.5]*max([abs(real(s)); abs(imag(s))])];
clf
subplot(431);h=stem(n,real(s),'r');axis(ejes);xlabel('subportadora (frecuencia)');ylabel('real(s)');title('Dominio de la frecuencia')
subplot(434);stem(n,imag(s),'r');axis(ejes);xlabel('subportadora (frecuencia)');ylabel('imag(s)')
subplot(432);stem(n,real(x),'b');axis(ejes);xlabel('muestra (tiempo)');ylabel('real(x)');title('Dominio del tiempo (discreto)')
subplot(435);stem(n,imag(x),'b');axis(ejes);xlabel('muestra (tiempo)');ylabel('imag(x)')

%% Generación de la señal temporal muy sobremuestreadas para "simular" su versión contínua en el tiempo
L2 = 100;                       % Factor de sobremuestreo muy elevado
x_continua = L2*ifft([s(1:N/2);zeros(N*L2-N,1);s(N/2+1:end)],L2*N);   % Señal en el dominio del tiempo muy sobremuestreada 
t = (0:N*L2-1)/L2;  % Vector de "tiempo contínuo"
subplot(433);stem(n,real(x),'b');xlabel('muestra (tiempo)');ylabel('real(x)');hold on;plot(t,real(x_continua),'b','LineWidth',2);hold off;title('Dominio del tiempo (continuo)');axis(ejes)
subplot(436);stem(n,imag(x),'b');xlabel('muestra (tiempo)');ylabel('imag(x)');hold on;plot(t,imag(x_continua),'b','LineWidth',2);hold off;axis(ejes)
% pause

%% Generación de la secuencia en el dominio del tiempo sobremuestreada por un factor L
xL = L*ifft([s(1:N/2);zeros(N*L-N,1);s(N/2+1:end)],L*N);     % Señal en el dominio del tiempo interpolada por un factor L
nL = (0:L*N-1)/L;       % Vector de índices temporales con sobremuestreo L
subplot(438);stem(nL,real(xL),'b');hold on;stem(n,real(x),'b','filled');hold off;xlabel('muestra (tiempo)');ylabel('real(x)');axis(ejes)
subplot(4,3,11);stem(nL,imag(xL),'b');hold on;stem(n,imag(x),'b','filled');hold off;xlabel('muestra (tiempo)');ylabel('imag(x)');axis(ejes)
subplot(4,3,9);stem(nL,real(xL),'b');xlabel('muestra (tiempo)');ylabel('real(x)');hold on;stem(n,real(x),'b','filled');plot(t,real(x_continua),'b','LineWidth',2);hold off;axis(ejes)
subplot(4,3,12);stem(nL,imag(xL),'b');xlabel('muestra (tiempo)');ylabel('imag(x)');hold on;stem(n,imag(x),'b','filled');plot(t,imag(x_continua),'b','LineWidth',2);hold off;axis(ejes)


