2009-06-10 23 views
7

Me pregunto si alguien sabe de un método rápido (es decir, O (N log (N))) para calcular la función de diferencia cuadrada promedio (ASDF) o la función de diferencia de magnitud promedio (AMDF) para un señal periódica, o incluso es posible.Fast Average Square Difference Función

Sé que se puede usar la FFT para calcular la correlación cruzada periódica. Por ejemplo, en el código de Matlab,

for i=1:N 
xc(i)=sum(x1*circshift(x2,i-1)); 
end 

es equivalente a la mucho más rápido

xc=ifft(fft(x1).*conj(fft(x2)); 

¿Hay un parecido algoritmo "rápida" para

for i=1:N 
ASDF(i)=sum((x1-circshift(x2,i-1)).^2)/N; 
end 

o

for i=1:N 
AMDF(i)=sum(abs(x1-circshift(x2,i-1)))/N; 
end 

?

Respuesta

6

pueden ampliar su definición de ASDF de la siguiente manera:

for i = 1:N 
    asdf(i) = (sum(x1.^2) - 2*sum(x1*circshift(x2,i-1)) + sum(x2.^2))/N; 
end 

que simplifica a

asdf = (-2*ifft(fft(x1).*conj(fft(x2))) + sum(x1.^2) + sum(x2.^2))/N; 
+1

impresionante. Perfecto. Su código se ejecuta 550 veces más rápido en Matlab para N = 1024. Gracias – tkw954