signal processing - Detectando la frecuencia fundamental
signal-processing music (10)
¿Has probado el artículo de Wikipedia sobre la detección de tono ? Contiene algunas referencias que pueden ser interesantes para usted.
Además, aquí hay una lista de aplicaciones y bibliotecas DSP , donde puede buscar. 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.
Existe este festival de tecnología 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?
Básicamente necesitas 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.
lo que inmediatamente me viene a la mente:
- filtrar frecuencias muy bajas (batería, línea de bajo),
- filtrar altas frecuencias (armónicos)
- FFT,
- buscar picos en la salida de FFT para la melodía
No estoy seguro, si eso funciona para sonidos muy polifónicos, tal vez buscando en Google "FFT, análisis, melodía, etc." devolverá más información sobre posibles problemas.
Saludos
Esto es exactamente lo que estoy haciendo aquí como mi último proyecto del año :) excepto una cosa que mi proyecto es sobre el seguimiento del tono de la voz del canto humano (y no tengo el robot para tocar la melodía)
La forma más rápida que puedo pensar es utilizar la biblioteca BASS . 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 de FFT en bruto no serán suficientes para determinar la frecuencia fundamental. Se necesita un 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.
Teoría del espectro de productos armónicos
Si la señal de entrada es una nota musical, entonces su espectro debe consistir en una serie de picos, que corresponden a la frecuencia fundamental con componentes armónicos en múltiplos enteros de la frecuencia fundamental. Por lo tanto, cuando comprimimos el espectro varias veces (reducción de resolución) y lo comparamos con el espectro original, podemos ver que los picos armónicos más fuertes se alinean. 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 se multiplican juntos, el resultado formará un pico claro en la frecuencia fundamental.
Método
Primero, dividimos la señal de entrada en segmentos aplicando una ventana de Hanning, donde el tamaño de la ventana y el tamaño del salto se dan como una entrada. Para cada ventana, utilizamos la Transformada de Fourier de Corto Tiempo 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 la frecuencia, aplicamos la técnica Harmonic Product Spectrum a cada ventana.
El HPS implica dos pasos: disminución de resolución y multiplicación. Para reducir la resolución, comprimimos el espectro dos veces en cada ventana mediante remuestreo: la primera vez, comprimimos el espectro original por dos y la segunda vez por tres. Una vez que esto se completa, multiplicamos los tres espectros juntos y encontramos la frecuencia que corresponde al pico (valor máximo). Esta frecuencia particular representa la frecuencia fundamental de esa ventana particular.
Limitaciones del método HPS
Algunas buenas características de este método incluyen: es computacionalmente económico, razonablemente resistente al ruido aditivo y multiplicativo, y ajustable a diferentes tipos de entradas. Por ejemplo, podríamos cambiar el número de espectros comprimidos para usar, y podríamos reemplazar la multiplicación espectral por una adición espectral. Sin embargo, dado que la percepción del tono humano es básicamente logarítmica, esto significa que los tonos bajos pueden rastrearse con menos precisión que los tonos altos.
Otro grave déficit del método HPS es que su resolución es tan buena como la longitud de la FFT utilizada para calcular el espectro. Si realizamos una FFT corta y rápida, estamos limitados en la cantidad de frecuencias discretas que podemos considerar. Para obtener una resolución más alta en nuestra salida (y por lo tanto, ver menos grano en nuestra salida de tono), necesitamos tomar una FFT más larga que requiere más tiempo.
Solo un comentario: el armónico fundamental bien puede faltar en un sonido (armónico), esto no cambia el tono percibido. Como caso límite, si toma una onda cuadrada (por ejemplo, una nota C #) y suprime por completo el primer armónico, la nota percibida sigue siendo 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 tono con técnicas de dominio de frecuencia, debe tener en cuenta todos los armónicos (máximos locales en la magnitud de la transformada de Fourier) y extraer algún tipo de "máximo divisor común" 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.
Autocorrelación - http://en.wikipedia.org/wiki/Autocorrelación
Cero cruce - http://en.wikipedia.org/wiki/Zero_crossing (este método se utiliza en afinadores de guitarra baratos)
Para extraer la frecuencia fundamental de la melodía de la música polifónica, puedes probar el plugin MELODIA: http://mtg.upf.edu/technologies/melodia
Extraer los F0 de todos los instrumentos en una canción (seguimiento multi-F0) o transcribirlos en notas es una tarea aún más difícil. Tanto la extracción de la melodía como la transcripción de la música siguen siendo problemas de investigación abiertos, por lo que independientemente del algoritmo / herramienta que utilice, no espere obtener resultados perfectos para ninguno de los dos.
Si intentas 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 falta de fundamentos 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.
Pruebe el seguimiento de tono YAAPT , que detecta la frecuencia fundamental en los dominios de tiempo y frecuencia. Puede descargar el código fuente de Matlab desde el enlace y buscar picos en la salida FFT usando la parte del proceso espectral.
Paquete de Python http://bjbschmitt.github.io/AMFM_decompy/pYAAPT.html#
Solo una idea, pero ¿necesita procesar una transmisión de audio digital como entrada?
Si no, considere usar una representación simbólica de música (como MIDI). Los tonos de las notas se establecerán explícitamente, y puede sintetizar sonidos (y movimientos) correspondientes al tono, el ritmo y muchos otros parámetros musicales con suma facilidad.
Si necesita analizar un flujo de audio digital (mp3, wav, entrada en vivo, etc.) tenga en cuenta que, si bien la detección de tono de sonidos monofónicos simples es bastante avanzada, la detección de tono polifónico es un problema no resuelto. En este caso, puede que mi respuesta a esta pregunta sea útil.