% funcion principal para el calculo de la fingerprint function F=fingerprint(audio) Fs=8000; %frecuencia de muestreo de la seal de audio N=2960; %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); % Dos opciones para solventar el problema de no ser el numero de muestras % en la seal multiplo de N: %1 opcion: Rellenar con ceros el audio para que sea multiplo del numero de muestras %por frame %%sup=ceil(length(audio)/N); %%relleno=sup*N-length(audio); %%audio=[audio;zeros(relleno,1)]; %2 opcion: Quedarnos con el numero entero de muestras de la seal 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