Estoy tratando de implementar un juego de canto que analizará la entrada de micrófono sin procesar y le dirá al jugador lo bueno que está cantando. Eso debe hacerse en tiempo real.
Me he encontrado con muchos hilos haciendo la misma pregunta, pero todavía no he terminado, probablemente debido a mi falta de experiencia en el campo y mi escaso conocimiento matemático. He implementado un algoritmo basado en el artículo del cambio de tono del sitio web DSPDimension: http://www.dspdimension.com/admin/pitch-shifting-using-the-ft/
Extraigo la verdadera frecuencia y magnitud tal como explica el artículo, pero no sé encontrar la frecuencia fundamental con esto. Intenté obtener el contenedor con la mayor magnitud, pero eso solo me da los resultados correctos para señales de tono más altas, no importa qué factor de sobremuestreo use, aún obtengo datos incorrectos para señales de baja frecuencia. ¿Este enfoque es completamente incorrecto o estoy en el camino correcto pero me falta algo?
Gracias por adelantado,
EDITAR: Olvidé mencionar que solo estoy interesado en la clase de lanzamiento, por lo que está bien si falta el fundamental, pero tengo un tono fuerte en la muestra.
EDIT2: Gracias a todos, acabo de terminar una versión del algoritmo que funciona de maravilla. El problema de la estimación de tono bajo se debió a mi prueba de entrada. Cuando canté la nota, coincidía correctamente. Además, estoy considerando todos los armónicos ahora, no solo el pico más alto.
fuente
Respuestas:
Eso es porque los armónicos son más grandes que los fundamentales. Trace su espectro y lo verá. Un mejor método para encontrar el verdadero fundamental es la autocorrelación. Entonces estás "deslizando" la forma de onda más allá de sí misma y encontrando retrasos en los que la forma de onda se alinea consigo misma.
http://www.phon.ucl.ac.uk/courses/spsci/matlab/lect10.html
¿Realmente quieres que canten la nota exacta, o está bien si cantan una octava arriba o abajo dependiendo de su registro de voz?
fuente
Sí, usar un estimador de frecuencia pico para el tono es incorrecto. El tono es un fenómeno psicoacústico, por lo que la detección o estimación del tono es diferente de la estimación de frecuencia. Se han dado muchos métodos de estimación de tono en respuestas anteriores a preguntas similares aquí. Hay más de 1 para elegir.
Aquí hay uno: /programming/4227420/matlab-missing-fundamental-from-an-fft/4231322#4231322 , y otro: Consejos para mejorar la detección de tono
AGREGADO # 1: Preguntas similares a esta se hacen con tanta frecuencia que escribí una publicación de blog más larga sobre el tema: http://www.musingpaw.com/2012/04/musical-pitch-is-not-just-fft- frecuencia.html
fuente