Pregunta

Estoy intentando detectar el tono en tiempo real del canto de un usuario, pero tengo muchos problemas.He probado muchos métodos, incluido FFT (Problema de FFT (devuelve resultados aleatorios)) y autocorrelación (La detección de tono por autocorrelación devuelve resultados aleatorios con la entrada de micrófono), pero parece que no puedo encontrar ningún método que dé un buen resultado.¿Alguien puede sugerir un método para el seguimiento de lanzamientos en tiempo real o cómo mejorar un método que ya tengo?Parece que no puedo encontrar ningún buen método C/C++ para la detección de tono en tiempo real.

Gracias,

Niall.

Editar:Solo para tener en cuenta, he verificado que los datos de entrada del micrófono sean correctos y que cuando se usa una onda sinusoidal los resultados son más o menos el tono correcto.

Editar:Lo siento, es tarde, pero en este momento, estoy visualizando la recopilación automática sacando los valores de la matriz de resultados y cada índice, y trazando el índice en el eje X y el valor en el eje Y (ambos están divididos por 100000 o algo, y estoy usando OpenGL), conectar los datos a un host VST y usar complementos VST no es una opción para mí.Por el momento, solo parecen puntos aleatorios.¿Lo estoy haciendo correctamente o podría indicarme algún código para hacerlo o ayudarme a comprender cómo visualizar los datos de audio sin procesar y los datos de autocorrelación?

¿Fue útil?

Solución

Dando un paso atrás ... Para conseguir este funcionamiento debe encontrar una manera de trazar los pasos intermedios de este proceso. Lo que estamos tratando de hacer no es particularmente difícil, pero es propenso a errores y más incómoda. Recorte, ventanas, mal cableado, aliasing, compensaciones de CC, la lectura de los canales equivocados, el eje de frecuencia FFT extraños, desajustes de impedancia, errores de tamaño de marco ... quien sabe. Pero si se puede representar gráficamente los datos en bruto, y luego trazar la FFT, todo se aclarará.

Otros consejos

He encontrado varias implementaciones de código abierto de tono en tiempo real de seguimiento

Hay también algo de lanzamiento rastreadores por ahí que no podrían ser diseñado para tiempo real, sino que puede ser utilizable de esa manera por lo que sé, y también podría ser útil como una referencia para comparar su perseguidor en tiempo real a:

Sé que esta respuesta no hará felices a todos, pero ahí va.

Esto es difícil, muy difícil.En primer lugar, lea todos los tutoriales que pueda encontrar sobre FFT, autocorrelación y wavelets.Aunque todavía estoy luchando con DSP, obtuve algunas ideas de lo siguiente.

https://www.coursera.org/course/audio El curso no se está ejecutando en este momento pero los videos aún están disponibles.

http://miracle.otago.ac.nz/tartini/papers/Philip_McLeod_PhD.pdf Tesis sobre el desarrollo de un algoritmo de reconocimiento de tono.

http://dsp.stackexchange.com un sitio completo dedicado al procesamiento de señales digitales.

Si, como yo, no hiciste suficientes cálculos para seguir completamente los tutoriales, no te rindas, ya que algunos de los diagramas y ejemplos aún me ayudaron a comprender lo que estaba pasando.

Lo siguiente son los datos de prueba y las pruebas.Escriba usted mismo una biblioteca que genere archivos de prueba para usarlos al verificar sus algoritmos.

1) Un generador de onda sinusoidal pura súper simple.Entonces, digamos que está pensando en escribir YAT (Otro sintonizador más), luego use su generador sinusoidal para crear una serie de archivos alrededor de 440 Hz, digamos de 420 a 460 Hz, en distintos incrementos y vea qué tan sensible y preciso es su código.¿Puede resolverse dentro de 5 Hz, 1 Hz o incluso más fino?

2) Luego actualice su generador de onda sinusoidal para que agregue una serie de armónicos más débiles a la señal.

3) Las siguientes son las variaciones de armónicos del mundo real.Entonces, mientras que en la mayoría de los instrumentos de cuerda verás una serie de armónicos como múltiplos simples de la frecuencia fundamental F0, en instrumentos como clarinetes y flautas, debido a la forma en que se comporta el aire en la cámara, los armónicos pares faltarán o serán muy débiles.Y en algunos instrumentos falta F0, pero se puede determinar a partir de la distribución de los otros armónicos.Siendo F0 lo que el oído humano percibe como tono.

4) Agregue algo de distorsión deliberada cambiando las frecuencias máximas armónicas hacia arriba y hacia abajo de manera irregular

El punto es que si estás creando archivos con resultados conocidos, entonces es más fácil verificar que lo que estás creando realmente funciona, dejando de lado los errores, por supuesto.

También existen varias "bibliotecas" que contienen muestras de sonido.https://freesound.org de la serie Coursera mencionada anteriormente.http://theremin.music.uiowa.edu/MIS.html

A continuación, tenga en cuenta que su micrófono no es perfecto y, a menos que haya gastado miles de dólares, tendrá un rango de respuesta de frecuencia bastante variable.En particular, si está trabajando con notas bajas y luego con micrófonos más baratos, lea los integrados en su PC o teléfono, tienen una caída significativa a partir de alrededor de 80-100 Hz.Para unos externos razonablemente buenos, puedes bajar a 30-40 Hz.Ve a buscar los datos en tu micrófono.

También puedes comprobar lo que sucede reproduciendo el tono a través de los altavoces y luego grabando con tu micrófono favorito.Pero, por supuesto, ahora estamos hablando de 2 conjuntos de curvas de respuesta de frecuencia.

En lo que respecta al rendimiento, existen varias bibliotecas disponibles gratuitamente, aunque tenga en cuenta los distintos modelos de licencia.

Sobre todo, no te rindas después de los primeros intentos.Toda la suerte.

He tenido un problema similar con entrada de micrófono en un proyecto que hice hace unos años -. Resultó ser debido a un desplazamiento de CC

Asegúrese de que elimina cualquier sesgo antes de intentar FFT o cualquier otro método que está utilizando.

También es posible que se está ejecutando en problemas de espacio para la cabeza o de recorte.

Los gráficos son la mejor manera de diagnosticar la mayoría de los problemas con el audio.

Aquí está el código fuente C++ de un algoritmo inusual de dos etapas que ideé y que puede hacer Tiempo real Detección de tono activada polifónico Archivos MP3 mientras se reproducen en Windows.Esta aplicación gratuita (Reproductor PitchScope, disponible en la web) se utiliza frecuentemente para detectar las notas de un solo de guitarra o saxofón en una grabación MP3.El algoritmo está diseñado para detectar el tono más dominante (una nota musical) en un momento dado dentro de un archivo de música MP3.Los inicios de las notas se infieren con precisión mediante un cambio significativo en el tono más dominante (una nota musical) en cualquier momento dado durante la grabación de MP3.

Cuando se presiona una sola tecla en un piano, lo que escuchamos no es sólo una frecuencia de vibración sonora, sino una compuesto de múltiples vibraciones sonoras que ocurren en diferentes frecuencias relacionadas matemáticamente.Los elementos de este compuesto de vibraciones a diferentes frecuencias se denominan Armónicos o parciales.Por ejemplo, si presionamos la tecla Do central en el piano, las frecuencias individuales de los armónicos del compuesto comenzarán en 261,6 Hz como frecuencia fundamental, 523 Hz sería el segundo armónico, 785 Hz sería el tercer armónico, 1046 Hz sería ser el 4to Armónico, etc.Los últimos armónicos son múltiplos enteros de la frecuencia fundamental, 261,6 Hz (ej:2 x 261,6 = 523, 3 x 261,6 = 785, 4 x 261,6 = 1046).Enlazada en la parte inferior, hay una instantánea de la situación real. Armónicos que ocurren durante una grabación polifónica MP3 de un solo de guitarra.

En lugar de una FFT, utilizo una transformada DFT modificada, con espaciado de frecuencia logarítmico, para detectar primero estos posibles Armónicos buscando frecuencias con niveles máximos (consulte el diagrama a continuación).Debido a la forma en que recopilo datos para mi Log DFT modificado, NO tengo que aplicar una función de ventana a la señal, ni agregar ni superponer.Y he creado el DFT para que sus canales de frecuencia estén ubicados logarítmicamente para alinearse directamente con las frecuencias donde los armónicos son creados por las notas de una guitarra, saxofón, etc.

Ahora que estoy retirado, he decidido publicar el código fuente de mi motor de detección de tono dentro de una aplicación de demostración gratuita llamada Reproductor PitchScope.PitchScope Player está disponible en la web y puede descargar el ejecutable para Windows para ver mi algoritmo en funcionamiento en un archivo mp3 de su elección.El siguiente enlace a GitHub.com lo llevará a mi código fuente completo donde podrá ver cómo detecto los armónicos con una transformación logarítmica DFT personalizada y luego busco parciales (armónicos) cuyas frecuencias satisfagan la relación entera correcta que define un ' paso'.

Mi algoritmo de detección de tono es en realidad un proceso de dos etapas:a) Primero el Paso de escala se detecta ('ScalePitch' tiene 12 valores de tono posibles:{E, F, F#, G, G#, A, A#, B, C, C#, D, D#} ) b) y después de determinar ScalePitch, entonces el Octava se calcula examinando todos los armónicos de las 4 posibles notas candidatas a octava.El algoritmo está diseñado para detectar el tono más dominante (una nota musical) en un momento dado dentro de un archivo MP3 polifónico.Suele corresponder a las notas de un solo instrumental.Aquellos interesados ​​en el código fuente C++ de mi algoritmo de detección de tono en dos etapas tal vez quieran comenzar con la función Estimate_ScalePitch() dentro del archivo SPitchCalc.cpp en GitHub.com.https://github.com/CreativeDetectors/PitchScope_Player

A continuación se muestra la imagen de un DFT logarítmico (creado con mi software C++) de 3 segundos de un solo de guitarra en una grabación polifónica de mp3.Muestra cómo aparecen los armónicos en notas individuales de una guitarra, mientras se toca un solo.Para cada nota en este DFT logarítmico podemos ver sus múltiples armónicos extendiéndose verticalmente, porque cada armónico tendrá el mismo ancho de tiempo.Una vez determinada la octava de la nota, conocemos la frecuencia de la fundamental.

enter image description here

aubio , y una biblioteca de código abierto que incluye varios métodos del estado de la técnica para el seguimiento de tono.

Tome un vistazo a esta aplicación de ejemplo:

http://www.codeproject.com/KB/audio-video /SoundCatcher.aspx

Me doy cuenta de que la aplicación está en C # y C ++ necesito, y me di cuenta que es .Net / Windows y que estás en un Mac ... Pero pensé que su aplicación FFT podría ser un punto de referencia inicial. Trate de comparar su aplicación FFT a la suya. (Suya es la versión iterativa, en amplitud de la FFT de Cooley-Tukey). ¿Son similares?

Además, el comportamiento "al azar" que usted describe podría ser porque estás agarrando datos devueltos por la tarjeta de sonido directamente sin ensamblar los valores de la matriz de bytes correctamente. ¿Le pidió a su tarjeta de sonido para muestrear valores de 16 bits, y luego le dio una matriz de bytes para almacenar los valores de? Si es así, recuerde que los dos bytes consecutivos en la matriz devuelta conforman una muestra de audio de 16 bits.

código Java para un detector en tiempo real, en tiempo real está disponible en http://code.google.com / p / freqazoid / .

Funciona bastante bien en cualquier equipo que ejecuta en tiempo real de Java post-2008. El proyecto se ha caído y podría ser recogido por cualquier interesado. Contacta conmigo si quieres más detalles.

He hecho una pregunta similar aquí:

C / C ++ / Obj-C algoritmo en tiempo real para determinar la nota (no Pitch) a partir de la entrada vocal

EDIT:

Performous contiene un módulo de C ++ para detección de tono en tiempo real

También algoritmo Pitch-Tracking Yin

Se puede adaptar cualquier cosa de sintonizadores de instrumentos? Mi afinador de guitarra deliciosamente compacta es capaz de detectar el tono de las cuerdas bastante bien. Veo esta referencia a un sintonizador de piano, que explica un algoritmo en cierta medida.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top