%% FUNCIÓN GRÁFICO BER
%<graficoBER>

%PARÁMETROS DE RETORNO:
%Ninguno

%PARÁMETROS DE INGRESO:
%parametros: Estructura con parámetros de simulación
%fOndas: Arreglo de strings con referencia de formas de onda requeridas
%pGraf: Estructura con parámetros gráficos

function graficoBER(parametros,fOndas,pGraf)

parametros.numTotSimb=256;%Actualización valor para obtener mayor precisión en valores bajos BER

for fOnda=fOndas %control de ciclo según las formas de ondas solicitadas en cada gráfico BER
    
    switch fOnda
        
        case "OFDM"
            disp('Implementación OFDM solicitada')
            
            %Verifica si ya existe el archivo con la respuesta del vector
            %OFDM. Sólo se crea en el primer llamado, y en los
            %demás se espera hacer uso del resultado ya obtenido y grabado
            opc=exist('vBER_OFDM.mat','file');%2(existe), %0(no existe)
            
            switch opc
                
                case 2 %archivo existente
                disp('Vector ya creado, sólo se cargará resultado')
                load('vBER_OFDM.mat');
                    
                case 0 %se debe generar el archivo de reuso
                disp('Vector en proceso de creación')
                
                %Los gráficos a recrear no están hechos a partir de un sólo
                %símbolo a transmitir, sino de un conjunto, cuyo resultado
                %se promedia antes de graficar. Se asumió el valor
                %almacenado en la estructura parametros.numTotSimb
                
                EbNoVec = (0:10)';      % Eb/No values (dB)
                berEst = zeros(size(EbNoVec));% Inicialización vector almacenamiento BER estimado
                
                for n = 1:length(EbNoVec)
                    [numErrs,numBits]=BER_OFDM(parametros, EbNoVec, n); %Llamado a la función para el cálculo BER en OFDM
                    
                    berEst(n) = numErrs/numBits;%BER estimado
                end
                
                %Asignación valores para almacenamiento en otras
                %simulaciones
                vOFDM_BER=berEst;
                                
                berTeorico = berawgn(EbNoVec,'psk',4,'nondiff');%Cálculo de coeficientes para BER teórico
                
                %En caso de que el fichero .mat no se genere, o se
                %genere en otra ruta no accesible, podría habilitarse
                %las siguients líneas:
                %************************************
%                 assignin('base','vOFDM_BER',vOFDM_BER);%Almacenamiento en el Workspace
%                 assignin('base','EbNoVec',EbNoVec);
%                 assignin('base','berTeorico',berTeorico);
                %************************************
                save('vBER_OFDM.mat','vOFDM_BER');%Almacenamiento vector BER para OFDM
                save('vBER_OFDM.mat','EbNoVec','-append');%Almacenamiento vector EbNoVec calculado en dB
                save('vBER_OFDM.mat','berTeorico','-append');%Almacenamiento vector berTeorico en dB
          
                otherwise
                    disp ('Opción no esperada')
                    
            end
            
            %Definición de atributos del gráfico
            figure('Name',pGraf.Titulo1,'NumberTitle','off')
            p=semilogy(EbNoVec,vOFDM_BER,'-bs');
            p.LineWidth=1.2;
            hold on
            semilogy(EbNoVec,berTeorico,'--k')
            grid
            legend('OFDM','BER teórico','Location','southwest') 
            xlabel('Eb/No (dB)')
            ylabel('BER')
            ylim(pGraf.yLim)
            
        case "FBMC"
            disp('Implementación FBMC solicitada')
            
            %Verifica si ya existe el archivo con la respuesta del vector
            %FBMC. Sólo se crea en el primer llamado, y en los
            %demás se espera hacer uso del resultado ya obtenido y grabado
            opc=exist('vBER_FBMC.mat','file');%2(existe), %0(no existe)
            
            switch opc
                
                case 2 %archivo existente
                disp('Vector ya creado, sólo se cargará resultado')
                load('vBER_FBMC.mat');
                    
                case 0 %se debe generar el archivo de reuso
                disp('Vector en proceso de creación')
                
                %Los gráficos a recrear no están hechos a partir de un sólo
                %símbolo a transmitir, sino de un conjunto, cuyo resultado
                %se promedia antes de graficar. Se asumió el valor
                %almacenado en la estructura parametros.numTotSimb

                s = rng(211); % establecimiento de semilla en el generador de números aleatorios
                EbNoVec = (0:10)'; % Eb/No values (dB)
                berEst = zeros(size(EbNoVec));% Inicialización vector almacenamiento BER estimado
                
                for n = 1:length(EbNoVec)
                    berN=BER_FBMC(parametros, EbNoVec, n); %Llamado a la función para el cálculo BER en OFDM
                     
                    berEst(n) = berN;%BER estimado para valor EbNo
                end
                
                vFBMC_BER=berEst;
                
                 %En caso de que el fichero .mat no se genere, o se
                %genere en otra ruta no accesible, podría habilitarse
                %las siguients líneas:
                %************************************
%                 assignin('base','vFBMC_BER',vFBMC_BER);%Almacenamiento en el Workspace
%                 assignin('base','EbNoVec',EbNoVec);
%                
                %************************************
                save('vBER_FBMC.mat','vFBMC_BER');%Almacenamiento vector BER para FBMC
                save('vBER_FBMC.mat','EbNoVec','-append');%Almacenamiento vector EbNoVec calculado en dB
               
 
                otherwise
                    disp ('Opción no esperada')
                    
            end
            
              q=semilogy(EbNoVec,vFBMC_BER,'-rs','DisplayName',fOnda);
              q.LineWidth=1.2;
            
        case "UFMC"
            disp('Implementación UFMC solicitada')
            
            %Verifica si ya existe el archivo con la respuesta del vector
            %UFMC. Sólo se crea en el primer llamado, y en los
            %demás se espera hacer uso del resultado ya obtenido y grabado
            opc=exist('vBER_UFMC.mat','file');%2(existe), %0(no existe)
            
            switch opc
                
                case 2 %archivo existente
                disp('Vector ya creado, sólo se cargará resultado')
                load('vBER_UFMC.mat');
                    
                case 0 %se debe generar el archivo de reuso
                disp('Vector en proceso de creación')
                
                %Los gráficos a recrear no están hechos a partir de un sólo
                %símbolo a transmitir, sino de un conjunto, cuyo resultado
                %se promedia antes de graficar. Se asumió el valor
                %almacenado en la estructura parametros.numTotSimb
                
                tamSub = round(parametros.numSub/parametros.numSubBandas);%Tamaño subbanda
                bGIzq= floor((parametros.tamFFT-parametros.numSub)/2);%Banda de guarda izquierda
               
                %Filtro Chebyshev
                filtroCheb=chebwin(parametros.longFiltro,parametros.SLL);%Generación coeficientes filtros en DT
                EbNoVec = (0:10)';      % Eb/No values (dB)
                berEst = zeros(size(EbNoVec));% Inicialización vector almacena
                
                for n = 1:length(EbNoVec)
                    [numErrs,numBits]=BER_UFMC(parametros, EbNoVec, n, tamSub, bGIzq, filtroCheb); %Llamado a la función para el cálculo BER en UFMC
                    
                    berEst(n) = numErrs/numBits;%BER estimado
                end
                
                %Asignación valores para almacenamiento en otras
                %simulaciones
                vUFMC_BER=berEst;
                             
                %En caso de que el fichero .mat no se genere, o se
                %genere en otra ruta no accesible, podría habilitarse
                %las siguients líneas:
                %************************************
%                 assignin('base','vUFMC_BER',vUFMC_BER);%Almacenamiento en el Workspace
%                 assignin('base','EbNoVec',EbNoVec);
                %************************************
                save('vBER_UFMC.mat','vUFMC_BER');%Almacenamiento vector BER para UFMC
                save('vBER_UFMC.mat','EbNoVec','-append');%Almacenamiento vector EbNoVec calculado en dB
                                     
                otherwise
                    disp ('Opción no esperada')
                    
            end
              r=semilogy(EbNoVec,vUFMC_BER,'-gs','DisplayName',fOnda);
              r.LineWidth=1.2;
            
        case "GFDM"
            disp('Implementación GFDM solicitada')
            
            %Verifica si ya existe el archivo con la respuesta del vector
            %GFDM a transmitir. Sólo se crea en el primer llamado, y en los
            %demás se espera hacer uso del resultado ya obtenido y grabado
            opc=exist('vBER_GFDM.mat','file');%2(existe), %0(no existe)
            
            switch opc
                
                case 2 %archivo existente
                disp('Vector ya creado, sólo se cargará resultado')
                load('vBER_GFDM.mat');
                    
                case 0 %se debe generar el archivo de reuso
                disp('Vector en proceso de creación')
                
                %Los gráficos a recrear no están hechos a partir de un sólo
                %símbolo a transmitir, sino de un conjunto cuyo resultado
                %se promedia antes de graficar. Se asumió una cantidad de
                %bits equivalentes a 32 bloques
                
                %****************Inicio implementación BER GFDM
                
                [berEst,EbNoVec]= BER_GFDM(parametros);%Llamado a la función transmisión para GFDM
                vGFDM_BER=berEst;
     
                %En caso de que el fichero .mat no se genere, o se
                %genere en otra ruta no accesible, podría habilitarse
                %las siguients líneas:
                %************************************
%                 assignin('base','vGFDM_BER',vGFDM_BER);%Almacenamiento en el Workspace
%                 assignin('base','EbNoVec',EbNoVec);
%                
                %************************************
                save('vBER_GFDM.mat','vGFDM_BER');%Almacenamiento vector BER para FBMC
                save('vBER_GFDM.mat','EbNoVec','-append');%Almacenamiento vector EbNoVec calculado en dB
                otherwise
                    disp ('Opción no esperada')
                    
            end
                s=semilogy(EbNoVec,vGFDM_BER,'-ms','DisplayName',fOnda);
                s.LineWidth=1.2;
     end

end

parametros.numTotSimb=32; %Retorno al valor definido por defecto en simulación

end

