%% FUNCIÓN BER UFMC
%<BER_UFMC>

%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:
%parametros: Estructura con parámetros de simulación
%EbNoVec: Vector con valores asumidos de la relación EbNo
%n: Consecutivo control ejecución de bucle
%tamSub: Tamaño de subbanda
%bGIzq: Banda de guarda izquierda
%filtroCheb: coeficientes filtro Chebychev

function [numErrs,numBits]=BER_UFMC(parametros, EbNoVec, n, tamSub, bGIzq, filtroCheb)

 DatIn = zeros(2*tamSub,parametros.numSubBandas);%Datos ingresados. Equivale a (bitsPorSubportadora*tamSubBanda,numSubBandas)
 numErrs=0;
 numBits=0;
 errorBitMax=400;
 maxNumBits=1e7;
 snrdB=EbNoVec(n);
 
 while numErrs < errorBitMax && numBits < maxNumBits
     txSig = complex(zeros(parametros.tamFFT+parametros.longFiltro-1, 1));%Señal a transmitir
     
     %*****************************TX*****************************
     for bandIdx=1:parametros.numSubBandas
                  
         % Generación Datos
         datos=generacionDatos(2*tamSub);
         DatIn (:,bandIdx) = datos; % registro de bits para comparación en gráficos BER
         
         % Modulación QPSK
         datosQPSK=modQPSK(datos);
         
         %Cálculo IFFT
         vIFFT=calcIFFT_UFMC(parametros,bGIzq,bandIdx,tamSub,datosQPSK);
         
         %Conformación de pulso
         bandFilro = filtroCheb.*exp( 1i*2*pi*(0:parametros.longFiltro-1)'/parametros.tamFFT* ...
         ((bandIdx-1/2)*tamSub+0.5+bGIzq+parametros.tamFFT/2) );
         vecConv= conv(bandFilro,vIFFT);%Vector convolución
         
         %Actualización símbolo transmitido
         txSig=txSig+vecConv; %Suma de la señal a transmitir
   
     end
      
     %*****************************RX*****************************
         % Paso de la señal a través de un canal AWGN
         rxSig = awgn(txSig, snrdB, 'measured');
         
         %Cálculo FFT y remoción banda de guarda
         simboloSal=calcFFT_UFMC(rxSig,parametros,txSig,bGIzq,tamSub);
         
         %Ecualizador de fuerza cero (zero-forcing equalizer)
         simboloSalEc=efc(filtroCheb,parametros,tamSub,simboloSal);
         
         % Demodulación QPSK 
         datosOut=demQPSK(simboloSalEc);
         
         %**********************CÁLCULO DE ERRORES********************
     
         % Cálculo de número de errores de bit
         nErrors = biterr(DatIn(:),datosOut);

         % Incremento de error
         numErrs = numErrs + nErrors;
      
         % Conteo de bits
         numBits = numBits + length(datosOut);
 
 end

end

