% OFDM_guardas
%
% PROCESADO DE SEÑAL Y COMUNICACIONES
% Tema 9
% Efecto del tiempo de guarda con y sin extensión cíclica en la constelación recibida
% Curso 2017-2018

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



%% Parámetros
N=16;   % Número de subportadoras (tamaño FFT)
Ns=100;   % Número de símbolos OFDM a generar
k=2;    % Tipo de modulación (k bits/simbolo): BPSK k=1; QPSK k=2; 16QAM k=4; 64QAM k=6 

Ng=4;   % Número de muestras del tiempo de guarda cíclica
% Ng=0;
% ext_ciclica=1;  %poner a 1 para extension ciclica
ext_ciclica=0;  %poner a 1 para extension ciclica

%%
hc=[1*exp(-j*0.5) 0 -1*exp(j*0.9) 0.4*exp(j*0.3)];
% hc=1;  %canal ideal

%% Transmisor
modulador=modem.qammod('M',2^k,'InputType', 'Bit'); % Mapeador de símbolos
X=modulate(modulador,randi([0 1],N*k,Ns));  % Símbolos

x=ifft(X,N);  % muestras temporales de la señal OFDM. Cada columna corresponde a un símbolo OFDM 
xg=[ext_ciclica*x(end-Ng+1:end,:);x]; % Añadimos la guarda
xt=xg(:);    % Vector con las muestras de la señal OFDM

%% Canal
rt=filter(hc,1,xt);


%% Receptor
y=reshape(rt,N+Ng,Ns);
y=y(Ng+1:end,:);    % Eliminación de guardas
Y=fft(y,N);     


%% Respuesta del canal

[Hc,f]=freqz(hc,1,32*N,N,'whole');
[Hck,fk]=freqz(hc,1,N,N,'whole');

%% Constelación de cada subportadora
for portadora=1:N;
    subplot(221);plot(f,abs(Hc),'b',fk(portadora),abs(Hck(portadora)),'ro');grid on;xlabel('Subportadora');ylabel('Amplitud');title('Respuesta en frecuencia del canal')
    subplot(223);plot(f,180/pi*angle(Hc),'b',fk(portadora),180/pi*angle(Hck(portadora)),'ro');grid on;xlabel('Subportadora');ylabel('Fase (º)')
    subplot(122);
    h=plot(real(Y(portadora,:)),imag(Y(portadora,:)),'or','MarkerSize',8);
    escala=2*sqrt(2^k);axis(escala*[-1 1 -1 1]);axis square;grid
    title(sprintf('Constelacion subportadora %i. Ng=%i, extension ciclica %i',portadora-1, Ng, ext_ciclica));
    pause
end


