% Comunicaciones Digitales
% Práctica 1
% Ejemplo transmisor y receptor discreto equivalente en Canal Rayleigh
% Curso 2023-2024

%   Copyright (c) 2024 G.T.A.S. (Grupo Tratamiento Avanzado de Señal)
%                 DICOM Universidad de Cantabria
%	Fecha   : Marzo 2024.
%	Version : 2.0


%% Parámetros del Transmisor

M = 4;      % Número de símbolos en la constelación M-QAM: p.e. M=16 en 16-QAM

%% Parámetros de la simulación Montecarlo

N_simbolos = 10000;     % Longitud de la secuencia de símbolos a transmitir
EbNo_promedio = 10;     % Valor de Eb/No promedio en dB's
N_tramas = 20;          % Número de simulaciones (tramas) para cada valor de Eb/No_promedio

%% Transmisor

bits = randi([0 1],N_simbolos*log2(M),1);   % Generación de bits aleatorios
a = qammod(bits,M,'InputType', 'bit');      % Secuencia de símbolos de una modulación M-QAM

%% Receptor

SNR_promedio = 10*log10(log2(M)*10.^(EbNo_promedio/10));    % SNR=log2(M)*Eb/No
Pot_simbolos = 10*log10(mean(abs(a).^2));                   % Potencia media de los símbolos (en dBW) 

for k = 1:N_tramas                            % Cada una de las N_tramas se verá afectada por un canal diferente
    hce = (randn(1)+1i*randn(1))/sqrt(2);   % Realización canal Rayleigh (Ganancia promedio unitaria)
    y = a*hce;                              % Símbolos tras el canal (sin ruido)
    r = awgn(y,SNR_promedio,Pot_simbolos);  % Símbolos recibidos (tras canal y ruido AWGN)
    z = r/hce;                              % Observables tras igualador
    bits_recibidos = qamdemod(z,M,'OutputType', 'bit');
    figure(1)
    subplot(131);plot(a,'o');axis square; axis(4*(log2(M)-1)*[-1 1 -1 1]);title('Constelación transmitida');
    subplot(132);plot(r,'.');axis square; axis(4*(log2(M)-1)*[-1 1 -1 1]);title(sprintf('Símbolos recibidos (|h_c_e|=%.2f, angle(h_c_e)=%3.0fº)',abs(hce),angle(hce)*180/pi));
    subplot(133);plot(z,'.');axis square; axis(4*(log2(M)-1)*[-1 1 -1 1]);title('Obsevables (tras igualador)');
    disp('Pulse una tecla');pause
end
