% Tx_OFDM
%
% COMUNICACIONES DIGITALES
% Tema 4
% Implementación básica de Transmisor-Receptor OFDM: IFFT, FFT, guarda cíclica,...
% Curso 2013-2014

%   Copyright (c) 2013 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=5;   % Número de símbolos OFDM a generar
Tg=4;   % Número de muestras del tiempo de guarda cíclica
k=2;    % Tipo de modulación (k bits/simbolo): BPSK k=1; QPSK k=2; 16QAM k=4; 64QAM k=6 

L=10;   % Factor de sobremuestreo


%% TRANSMISOR
% Bits de información
bits=randi([0 1],N*k,Ns);   % bits a transmitir. Cada columna corresponde a un símbolo OFDM

% Mapeador de símbolos
modulador=modem.qammod('M',2^k,'InputType', 'Bit');
s=modulate(modulador,bits);  % Símbolos

% IFFT
x=L*ifft(s,N*L);  % muestras temporales de la señal OFDM. Cada columna corresponde a un símbolo OFDM 

% Guardas
xg=[x(end-Tg*L+1:end,:);x]; % Guarda cíclica
%xg=[zeros(Tg*L,Ns);x];   % Guarda sin señal

% Señal transmitida 
xt=xg(:);    % Vector con las muestras de la señal OFDM

% plots TX
figure(1)
subplot(311);plot(real(xt));xlabel('n');set(gca,'XTick',(0:Ns)*L*(N+Tg));legend('Señal I');grid
subplot(312);plot(imag(xt),'r');set(gca,'XTick',(0:Ns)*L*(N+Tg));xlabel('n');legend('Señal Q');grid
subplot(313);plot(abs(xt),'r');set(gca,'XTick',(0:Ns)*L*(N+Tg));xlabel('n');legend('Envolvente');grid

%% RECEPTOR

% diezmado si es preciso
yt=xt(1:L:end);

% reorganización en forma matricial. Cada columna corresponde a un símbolo OFDM
y=reshape(yt,N+Tg,Ns);

% Eliminación de Guardas
y=y(Tg+1:end,:);

% FFT
Y=fft(y,N);

% Detección y demapeo de símbolos
demodulador=modem.qamdemod('M', 2^k,'OutputType','Bit'); 
b=demodulate(demodulador,Y);

% Plots RX
figure(2);
plot(Y(:),'.','MarkerSize',16);
escala=sqrt(2^k);axis(escala*[-1 1 -1 1]);axis square


