% 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