% 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 seal 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 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 '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