% funcion principal para el calculo de los fingerprints donde los
% parametros de entrada de la funcion son,precisamente, las caracteristicas
% con que queremos calcular los fingerprints

% PARAMETROS DE ENTRADA:
% N           %numero de muestras por frame
% overlap     %factor de overlap
% num_band    %numero de bandas en que dividimos cada frame
% f_inferior  %frecuencia inferior para la division en bandas
% f_superior  %frecuencia superior para la division en bandas

% Fecha de creacion: 8 de Enero de 2007

function F=fingerprint(audio,N,overlap,num_band,f_inferior,f_superior)

Fs=8000;        %frecuencia de muestreo de la señal de audio
desplaz=floor(N-N*overlap); %desplazamiento de la ventana para cumplir con el factor de overlap

ventana=hanning(N);

% Nos quedamos con el numero entero de muestras de la señal mas alto posible
% que sea multiplo de 'desplaz'
numero_fingers=floor((length(audio)-N)/desplaz); %numero de huellas sin contar la primera
audio=audio(1:(N+numero_fingers*desplaz));

Eperanterior=zeros(num_band,1);    %energia de las bandas del frame anterior
m=1;                               %indices para guardar los bits de los fingerprints

%Calculo del vector para la division en 'num_band' bandas separadas
%logaritmicamente entre la frecuencia inferior y la frecuencia superior
%escogidas para la division en bandas
indice=logspace(log10(f_inferior),log10(f_superior),num_band+1);
indice=round(indice*N/Fs);

for k=0:desplaz:length(audio)-N
    frame=audio(k+1:k+N,1);
    frame=ventana.*frame;
    FRAME=abs(fft(frame));
    
    bandaSup=FRAME(indice(num_band):indice(num_band+1),1);
    for k=num_band:-1:2
        banda=FRAME(indice(k-1):indice(k),1);
        
        Eactual=calc_energia(banda);
        Esuperior=calc_energia(bandaSup);
        
        F(m,k-1)=bit_derivation(Eactual,Esuperior,Eperanterior(k-1,1),Eperanterior(k,1));
        
        
        %actualizamos variables
        bandaSup=banda;
        Eperanterior(k,1)=Esuperior;
        if k==2                             %obligatorio para evitar coger un valor equivocado al llamar a "bit_derivation"
            Eperanterior(k-1,1)=Eactual;
        end
    end
    m=m+1;
end

