%% FUNCIÓN BER OFDM
%<BER_OFDM>

%PARÁMETROS DE RETORNO:
%numErrs: Número de errores en estimación curva BER para OFDM
%numBits: Número total de bits usados en simulación curva BER

%PARÁMETROS DE INGRESO:
%EbNoVec: Vector con valores asumidos de la relación EbNo
%parametros: Estructura con parámetros de simulación
%n: Consecutivo control ejecución de bucle

function [numErrs,numBits]=BER_OFDM(parametros, EbNoVec, n)

%Inicialización de valores de simulación
errorBitMax=200;
maxNumBits=1e7;
numErrs = 0;
numBits = 0;


 while numErrs < errorBitMax && numBits < maxNumBits
     
     %*****************************TX*****************************
     %Generación Datos
     datosIn=generacionDatos(2*parametros.numSub);
     
     %Modulación QPSK
     datosQPSK=modQPSK(datosIn);
     
     %Modulación OFDM- incluye IFFT + inserción PC
     % Cálculo IFFT
     [vIFFT,bGIzq,bGDer]=calcIFFT(datosQPSK,parametros);
     
     % Inserción PC
     vTxOFDM=[vIFFT(end-parametros.pc(2)+1:end);vIFFT];
     snrdB = EbNoVec(n) + 10*log10(2)+10*log10(parametros.numSub/parametros.tamFFT);
     
     %*****************************RX*****************************
     % Paso de la señal a través de un canal AWGN
     rxSig = awgn(vTxOFDM,snrdB,'measured');
     
     % Demodulación OFDM- incluye remoción de PC + FFT
     %Remoción prefijo cíclico
     qpskRx_pc=rxSig(parametros.pc(2)+1:end);

     %Cálculo FFT
     qpskRx_FFT=fftshift(fft(qpskRx_pc));

     %Remoción bandas de guarda
     qpskRx_BG=qpskRx_FFT(bGIzq+1:end-bGDer);
     
     % Demodulación QPSK 
     datosOut=demQPSK(qpskRx_BG);
     
     %**********************CÁLCULO DE ERRORES********************
     
     % Cálculo de número de errores de bit
     nErrors = biterr(datosIn,datosOut);
        
     % Incremento de error
     numErrs = numErrs + nErrors;
      
     % Conteo de bits
     numBits = numBits + (2*parametros.numSub);
     
 end


end

