%    archivo:fingerprint_princ.m
%   
%    Función que, dado un archivo de audio calcula su huella.
%


function F=fingerprint(audio)

Fs=44100/8;        %frecuencia de muestreo de la señal de audio
N=2048;         %numero de muestras por frame
overlap=31/32;  %factor de overlap
desplaz=floor(N-N*overlap); %desplazamiento de la ventana para cumplir con el factor de overlap
num_band=33;    %numero de bandas en que dividimos cada frame
f_inferior=300; %frecuencia inferior para la division en bandas
f_superior=2000; %frecuencia superior para la division en bandas

ventana=hanning(N);



%Para solventar el problema de que el numero de muestras no es múltiplo de N, 
%nos quedarnos 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 33 bandas separadas
%logaritmicamente entre 300 Hz y 2000 Hz
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