2009-01-12 17 views
18

Hay este festival tecnológico en IIT-Bombay, India, donde están teniendo un evento llamado "Artbots" donde se supone que diseñamos artbots con habilidades artísticas. Tuve una idea sobre un robot musical que toma una canción como entrada, detecta las notas en la canción y la reproduce en un piano. Necesito algún método que me ayude a calcular los tonos de las notas de la canción. ¿Alguna idea/sugerencia sobre cómo hacerlo?Detectando la frecuencia fundamental

Respuesta

1

¿Has probado Wikipedia's article on pitch detection? Contiene algunas referencias que pueden ser interesantes para usted.

Además, aquí hay un list of DSP applications and libraries, donde puede hurgar. La lista solo menciona paquetes de software de Linux, pero muchos de ellos son multiplataforma, y ​​hay una gran cantidad de código fuente que puede ver.

Solo FYI, la detección del tono de las notas en una grabación monofónica está al alcance de la mayoría de las personas conocedoras de DSP. Detectar los tonos de todas las notas, incluidos los acordes y otras cosas, es mucho más difícil.

0

Básicamente necesita un analizador de espectro. Es posible que pueda realizar una FFT en una grabación de una entrada analógica, pero mucho depende de la resolución de la grabación.

0

lo que viene inmediatamente a la mente:

  • filtrar las frecuencias muy bajas (batería, bajo-line),
  • filtrar las frecuencias altas (armónicos)
  • FFT,
  • look para picos en la salida de la FFT para la melodía

no estoy seguro, si eso funciona para sonidos muy polifónicos - tal vez buscando en google para "FFT, analysi s, melodía, etc. " devolverá más información sobre posibles problemas.

respecto

13

Esto es exactamente lo que estoy haciendo aquí como mi proyecto :) último año, excepto una cosa que mi proyecto es sobre el seguimiento del tono de la voz cantante humana (y no tengo que el robot tocar la canción)

La manera más rápida que puedo pensar es utilizar BASS library. Contiene una función lista para usar que puede proporcionarle datos de FFT desde el dispositivo de grabación predeterminado. Eche un vistazo al ejemplo del código "livespec" que viene con BASS.

Por cierto, los datos brutos de FFT no serán suficientes para determinar la frecuencia fundamental. Necesita algoritmo como Harmonic Product Spectrum para obtener el F0.

Otra consideración es la fuente de audio. Si vas a hacer FFT y aplicar Harmonic Product Spectrum en él. Deberá asegurarse de que la entrada solo tenga una fuente de audio. Si contiene múltiples fuentes, como en las canciones modernas, habrá muchas frecuencias para considerar.

armónica del espectro del producto Teoría

Si la señal de entrada es una nota musical, entonces su espectro debe consistir en una serie de los picos, correspondientes a frecuencia fundamental con armónicos componentes en múltiplos enteros de la frecuencia fundamental . Por lo tanto, cuando comprime el espectro un número de veces (disminución de muestreo), y lo comparamos con el espectro original, podemos ver que el armónico más fuerte alcanza la línea arriba. El primer pico en el espectro original coincide con el segundo pico en el espectro comprimido por un factor de dos, que coincide con el tercer pico en el espectro comprimido por un factor de tres. Por lo tanto, cuando los diversos espectros son multiplicados juntos, el resultado será pico claro en la frecuencia fundamental .

Método

En primer lugar, se divide la señal de entrada en segmentos mediante la aplicación de una ventana de Hanning, donde el tamaño de ventana y tamaño de salto son dada como una entrada. Para cada ventana, , utilizamos la Transformada Fourier de corta duración para convertir la señal de entrada del dominio de tiempo al dominio de frecuencia . Una vez que la entrada está en el dominio de frecuencia , aplicamos la técnica de espectro de producto armónico al en cada ventana.

El HPS implica dos pasos: disminución de muestreo y multiplicación. Para disminuir la resolución, comprimimos el espectro dos veces en cada ventana por remuestreo: primera vez, que comprimir el espectro original por dos y la segunda vez, por tres. Una vez que este es completado, multiplicamos los tres espectros juntos y encontramos la frecuencia que corresponde al pico (valor máximo). Esta frecuencia particular de representa la frecuencia fundamental de esa ventana en particular.

Limitaciones del método SPH

Algunas características interesantes de este método incluyen: es computacionalmente barato, razonablemente resistente a aditivo y multiplicativo ruido, y ajustable a diferentes tipos de entradas . Por ejemplo, podríamos cambiar el número de espectros comprimidos a uso, y podríamos reemplazar la multiplicación espectral con una adición espectral de . Sin embargo, dado que la percepción del tono humano es básicamente logarítmica, esto significa que los tonos bajos pueden ser rastreados con menos precisión que los tonos altos .

Otro grave déficit del método SPH es que su resolución es sólo tan buena como la longitud de la FFT utilizado para calcular el espectro. Si nos ejecutar una FFT de corto y rápido, estamos limitada en el número de frecuencias discretas podemos considerar. Con el fin para obtener una resolución más alta en nuestra producción (y por lo tanto ver menos grado de aspereza en nuestra salida de tono), que que tomar una FFT de largo que requiere más tiempo.

de: http://cnx.org/content/m11714/latest/

+3

¿Cómo se maneja esto con la inarmonía de los instrumentos reales? Los armónicos son cada vez más agudos de los múltiplos ideales cuanto más alto se vaya. – endolith

4

Sólo un comentario: El armónico fundamental puede también faltar de un sonido (armónica), esto no cambia el tono percibido. Como un caso límite, si se toma una onda cuadrada (por ejemplo, una nota de C#) y suprimir por completo el primer armónico, la nota que se percibe es todavía C#, en la misma octava. En cierto modo, nuestro cerebro puede compensar la ausencia de algunos armónicos, incluso el primero, cuando adivina una nota. Por lo tanto, para detectar un lanzamiento con las técnicas de dominio de la frecuencia que debe tomar en cuenta todos los los armónicos (máximos locales en la magnitud de la transformada de Fourier) y extracto de una especie de "máximo común divisor" de sus frecuencias. La detección de tono no es un problema trivial en absoluto ...

DAFX tiene alrededor de 30 páginas dedicadas a la detección de tono, con ejemplos y código de Matlab.

1

Es sólo una idea - pero se necesitan para procesar un flujo de audio digital como entrada?

Si no es así, considere el uso de una representación simbólica de la música (como MIDI). Los tonos de las notas a continuación, se declaran explícitamente, y se puede sintetizar sonidos y movimientos() correspondientes al tono, el ritmo y muchos otros parámetros musicales muy fácilmente.

Si necesita analizar una secuencia de audio digital (mp3, wav, entrada en vivo, etc.) tenga en cuenta que aunque la detección de tono de sonidos monofónicos simples es bastante avanzada, la detección de tono polifónico es un problema sin resolver. En este caso, puede encontrar mi respuesta al this question útil.

1

para extraer la frecuencia fundamental de la melodía de la música polifónica puede probar con el MELODIA plug-in: http://mtg.upf.edu/technologies/melodia

La extracción de la década de F0 de todos los instrumentos en una canción (multi-F0 seguimiento) o transcribirlos en notas es una tarea aún más difícil. La extracción de la melodía y la transcripción de la música siguen siendo problemas de investigación abiertos, por lo que independientemente del algoritmo/herramienta que se utiliza no espere para obtener un resultado perfecto para cualquiera.

1

Si está tratando de detectar las notas de una grabación polifónica (notas múltiples al mismo tiempo) buena suerte. Ese es un problema muy complicado. No conozco ninguna forma de escuchar, por ejemplo, una grabación de un cuarteto de cuerda y tener un algoritmo que separe las cuatro voces. (¿Quizá Wavelets?) Si solo se trata de una nota a la vez, existen varios algoritmos de seguimiento de tono, muchos de ellos mencionados en otros comentarios.

El algoritmo que desee utilizar dependerá del tipo de música que esté escuchando. Si quieres que la gente cante, hay muchos buenos algoritmos diseñados específicamente para voz. (Ahí es donde se encuentra la mayor parte de la investigación). Si intenta recoger instrumentos específicos, tendrá que ser un poco más creativo. Los algoritmos de voz pueden ser simples porque el rango de la voz de canto humano generalmente está limitado a alrededor de 100-2000 Hz. (El rango de habla es mucho más estrecho). Las frecuencias fundamentales en un piano, sin embargo, van desde aproximadamente 27 Hz. a 4200 Hz., por lo que se trata de un rango más amplio generalmente ignorado por los algoritmos de detección de tono de voz.

La forma de onda de la mayoría de los instrumentos va a ser bastante compleja, con muchos armónicos, por lo que un enfoque simple como contar ceros o simplemente tomar la autocorrelación no funcionará. Si supiera aproximadamente qué rango de frecuencia estaba buscando, podría pasar el filtro de paso bajo y luego contar cero. Sin embargo, creo que sería mejor con un algoritmo más complejo como el Espectro de Producto Armónico mencionado por otro usuario, o YAAPT ("Otro Algoritmo para el Seguimiento de tono"), o algo similar.

Un último problema: algunos instrumentos, el piano en particular, tendrán el problema de perder elementos básicos e inarmonía. Los algoritmos faltantes pueden ser manejados por los algoritmos de seguimiento de tono ... de hecho tienen que serlo ya que los fundamentales a menudo se cortan en la transmisión electrónica ... aunque es probable que aún reciba algunos errores de octava. La inarmonía sin embargo, le dará problemas si alguien toca una nota en las octavas inferiores del piano. Los algoritmos de seguimiento de tono normal no están diseñados para lidiar con la inarmonía porque la voz humana no es significativamente inarmónica.

Cuestiones relacionadas