Paso 1: El algoritmo
Crédito:
No sé quién inventó el algoritmo, pero de lo que google me dice que un estadístico británico por el nombre de George Udny Yule había publicado un documento de finales del siglo XIX en referencia al algoritmo de autocorrelación parcial. Además hay un montón de artículos publicados por el IEEE a partir de las mejoras citando de principios del siglo XX el método para utilizan en la electrónica.
AMDF - aquí está el flaco:
AMDF (N) = 1/N * Sum (i = 0 -> N) de (| x(i) - x(i+N) |)
AMDF (función de diferencia de la magnitud de autocorrelación) es básicamente líneas superpuestas de seguimiento en una determinada ventana de muestras. Esto es básicamente lo que ocurre:
1.) los datos se reúnen para formar una ventana de N * 2 muestras por todo.
2.) corte la ventana en la mitad.
3.) la primera mitad sobre la parte superior de la segunda mitad del recubrimiento.
4.) toma el valor absoluto de la diferencia en el área entre las dos formas de onda y resumirlo.
5.) dividir la suma por el número de muestras.
6.) Repita los pasos 2 a 6 para un barrido completo de todos los retrasos N que va a ocurrir o estar presente en una forma de onda.
7.) si existe un tono cuasi-armónico, la AMDF salida un número bajo en o cerca de 0 en alguna demora N.
8.) dividir la frecuencia de muestreo por su demora N y usted tiene la frecuencia más probable de la cuasi-armónico del tono.
Un grande sin embargo! La AMDF no funciona en más de un tono a la vez. Usted no será capaz de diferenciar entre paradas dobles, múltiples notas rasgueados, etc..
Otros algoritmos:
En cuanto a mi investigación me ha llevado, hay un par de otros pitch algoritmos de detección por ahí. Obviamente más, pero no busco demasiado extensamente. No cubrirlas pero les mencionaré Escuchar para su investigación adicional si lo desea.
Por supuesto, el original método de autocorrelación es ahi la base de la AMDF. La ventaja de la AMDF sobre autocorrelación básica es que la AMDF tiene un montón de sustracciones y adiciones con una división (que puede ser codificada en una multiplicación). Para el Arduino Uno que es arquitectura de 8 bits nativos y no tiene hardware división o multiplicación, esto es una más absoluta.
Otro algoritmo de detección de pitch es el algoritmo de Yin. Este algoritmo cuenta con un muy bajo porcentaje de error con cada paso del algoritmo detallando su efectividad por lo que se puede implementar tanto o tan poco como usted desea. De testimonios que he leído no es muy de cómputo intensiva que es grande! Así que sí... Por qué no consiguió porque el algoritmo de Yin al parecer tiene una patente sobre su uso. Además, si usted busca alrededor, alguien ha ya compilado el código fuente para usted en C por lo que puede jugar con él. Hay un artículo publicado en el algoritmo de Yin, cosas muy interesantes.
Aquí está el código fuente de Yin, si quieres echar un vistazo!: http://mroy.chez-alice.fr/yin/index.html
Aquí está el artículo publicado en el algoritmo: http://recherche.ircam.fr/equipes/pcm/cheveign/pss/2002_JASA_YIN.pdf