Reconocimiento de tono rápido

8

Necesito detectar el tono (medir la frecuencia de la señal) mientras los músicos tocan música, avisando si no están afinados, pero resulta que la música es demasiado rápida para FFT (Fast Fourier Transform).

A continuación trato de dar una descripción técnica del problema.

Los músicos tocan música a 90-140 lpm. Esto significa que hay 90-140 grupos de notas cada minuto, hasta 8 (más frecuentemente, hasta 4) notas en cada grupo (60/140/8 = 0.0536 segundos, 60/90/4 = 0.167 segundos), que es decir, las notas pueden cambiar a razón de 6-19 notas por segundo.

La música usa una escala logarítmica (ver la imagen adjunta): el rango entre, por ejemplo, 440Hz y 880Hz se divide en 12 notas, de las cuales solo 7 se usan para la melodía. (Básicamente, usan solo las teclas blancas en el piano; cuando quieren cambiar la frecuencia inicial, usan algunas de las teclas negras y no usan algunas teclas blancas). Es decir, la frecuencia de cada nota siguiente se multiplica por 2 ^ (1/12) = 1.05946.

Para hacer las cosas más complicadas, la frecuencia A (La) puede variar de 438 a 446 Hz. Los instrumentos de cuerda en teoría se pueden afinar, mientras que los instrumentos de viento dependen de la temperatura y la humedad del aire, por lo que los músicos renegocian la frecuencia durante la prueba de sonido.

A veces, los músicos y los vocalistas cometen errores en la frecuencia, lo llaman "desafinado". Quieren un dispositivo que les informe de tales "errores desafinados". Tienen sintonizadores, pero los sintonizadores requieren reproducir el mismo sonido durante aproximadamente 1 segundo antes de comenzar a mostrar algo. Esto funciona para la sintonización, pero no funciona mientras se reproduce la música.

Lo más probable es que el sintonizador esté haciendo FFT, y debido a la fórmula espera 1 segundo para obtener la resolución de 1Hz.reF=1/ /T

Para A = 440Hz, la diferencia de frecuencia entre dos notas es 440 * 0.05946 = 26.16 Hz, para obtener esa resolución de frecuencia, uno debe usar un tiempo de adquisición de 0.038 segundos, es decir, a un tempo = 196bpm FFT es capaz de distinguir dos observa que, a 98 lpm, puede detectar un error de desajuste del 50%, siempre que comience la adquisición en el mismo momento en que cambie el tono. Si permitimos el cambio de tono en el transcurso de un período de adquisición, obtenemos 49 bpm, que es demasiado lento. Además, es muy deseable ser más preciso sobre la frecuencia, por ejemplo, detectar un error de desajuste del 25% o 12%.

¿Hay alguna manera de medir la frecuencia (detectar tono) mejor que FFT, es decir, con una mejor resolución en menos tiempo de adquisición? (Al menos 2 veces mejor, idealmente, 8-16 veces mejor.) A cambio, no necesito distinguir entre notas de diferentes octavas, por ejemplo, 440 y 880 pueden reconocerse como A. No necesito la linealidad de FFT salida, una escala logarítmica sería mejor. (Probablemente, son posibles más compensaciones, solo que ahora me viene a la mente nada más).

Aquí hay un dibujo muy bueno:

Nota frecuencias vinculadas desde Wikipedia

18446744073709551615
fuente
bonito dibujo deberían ponerlo al revés para que los símbolos de clave (y el pentagrama musical) estén al revés. pero entonces todos los números de frecuencia y período y MIDI estarían al revés.
Robert Bristow-Johnson
Parece que necesita detección de tono polifónico en lugar de una detección monofónica (es decir, una nota a la vez). ¿Es eso correcto?
Jazzmaniac
@Jazzmaniac Polyphonic definitivamente sería una ventaja, es decir, monofónico sería una restricción. Si pudiera usar FFT, mostraría varios picos en un diagrama de frecuencia-tiempo 2D. Por otro lado, si entiendo correctamente, los instrumentos de viento son monofónicos, y el violín está bastante cerca de eso.
18446744073709551615
Los instrumentos de viento definitivamente funcionan con algoritmos de detección monofónicos. Sin embargo, los instrumentos de cuerda (con más de una cuerda) son complicados, y la mayoría de los detectores monofónicos, si no todos, producen resultados poco confiables o incluso inutilizables en presencia de tonos en descomposición de cuerdas no perfectamente silenciadas, cuerdas abiertas que resuenan o simplemente interferencia del micrófono. Dicho esto, la detección polifónica es difícil. Sin embargo, dado que realmente no necesita una detección precisa de notas, sino solo una detección precisa de sintonización, es muy posible que encuentre un algoritmo adecuado. Sin embargo, no será un detector de tono monofónico.
Jazzmaniac
Esto puede explicar el voto negativo de la respuesta de RBJ, o alguien podría haberse ofendido por su argumento de ventas algo no objetivo. En cualquier caso, no saltes a su barco demasiado pronto. Hay otras opciones para lo que quieres, y posiblemente también mejores.
Jazzmaniac

Respuestas:

9

" ¿Hay alguna manera de medir la frecuencia (detectar tono) mejor que FFT, es decir, con una mejor resolución en menos tiempo de adquisición? "

sí hay. o son. Existen múltiples formas mejores de hacer detección de tono musical en tiempo real que son mucho, mucho mejores que ejecutar una FFT.

considerar :

Función de diferencia de magnitud promedio (AMDF)

QX[k]=norteEl |X[norte]-X[norte-k]El |

Función de diferencia cuadrática promedio (ASDF)

QX[k]=norte(X[norte]-X[norte-k])2

Función de autocorrelación (AF)

RX[k]=norteX[norte]X[norte-k]

Tenga en cuenta que estoy jugando rápido y suelto con los límites de la suma.

tenga en cuenta también que no se hacen suposiciones sobre la forma de onda o los cruces por cero u otros cruces de umbral. la única suposición es que cuando el retraso es aproximadamente un período (o dos períodos o algún otro múltiplo entero de la duración del período), parece mucho a . así que la única suposición es que el tono está relacionado con la frecuencia fundamental de una función periódica o casi periódica (lo que me gusta llamar "cuasi periódica").kX[norte]X[norte-k]

mi favorito es ASDF (y ese es un secreto comercial muy poco velado que acabo de anunciar a todos, pero la gente en comp.dsp ya lo sabía). estos son todos dominio de tiempo, AMDF y ASDF se ven muy similares y ASDF parece una versión invertida de AF. está buscando nulos en AMDF o ASDF o picos en AF que corresponderían a la duración del período potencial de la entrada cuasi periódica.

Aquí hay otros trucos:

  1. siempre puede correlacionar las muestras más actuales con algunas muestras demoradas por . de esa manera, está tratando con los datos más actuales posibles en la aplicación en tiempo real.nortenortek

  2. no necesita calcular la correlación para cada retraso entero . de hecho, dado que le gusta la frecuencia logarítmica, el espacio para más grande puede ser mayor que el espacio para más pequeño .kkk

  3. cuando se encuentra un potencial nulo (AM_F) o pico (AF), puede calcular la correlación para los valores enteros adyacentes de .k

  4. entre valores enteros adyacentes de , puede hacer interpolación para determinar la ubicación del pico con una precisión de muestra fraccional. No te diré cómo. use su imaginación.k

  5. todo el truco (y esta es la salsa secreta donde se aplican los secretos comerciales y las patentes IVL) es elegir el pico o nulo correcto cuando hay múltiples candidatos. elegir el pico incorrecto o nulo dará como resultado un "error de octava". No voy a decirte cómo hacerlo. use su imaginación.

envíenme un correo electrónico y podemos discutir los términos de contratación si desea que le diseñe un detector de tono increíble. mucho mejor que YIN, que, en mi opinión, funciona como una mierda.

robert bristow-johnson
fuente
1
Se agradecería un comentario sobre la votación negativa. Si hay algo mal, quiero saberlo. Esta respuesta no ofrece una receta, pero al menos hay una lista de qué leer (bueno, eso no parece una lectura fácil, pero es algo que es mejor que nada). Por favor no elimine esta respuesta.
18446744073709551615
1
¿Quién eliminaría la respuesta? ¿yo?
Robert Bristow-Johnson
3

Ya respondí tu pregunta aquí: /programming/33667275/fast-frequency-measurement/33678202#33678202

Pero, en resumen, en ciertas circunstancias, puede interpolar un resultado FFT a una resolución más fina que el espaciado de bin FFT, lo que le permite utilizar una ventana de datos más corta para una mejor resolución de tiempo.

Pero la frecuencia FFT no es frecuencia de tono. Y para algunos instrumentos de música (aquellos que producen sobretonos ligeramente inarmónicos), tampoco es la frecuencia de la función de autocorrelación (o sus parientes tales como AMDF). Eso es porque el tono es un fenómeno psicoacústico.

hotpaw2
fuente
dos notas: si desea que su detección de tono sea " rápida ", no recomendaría hacerlo en el dominio de la frecuencia (a menos que tal vez si está haciendo algo de velocidad múltiple con múltiples FFT. la razón es que usted ni siquiera puede comenzar a FFT hasta que obtenga todas las muestras. para un FFT de longitud decente (para obtener una resolución suficiente en tonos bajos), ya ha esperado, digamos, 0.1 segundo. tono (y volumen) son medidas psicoacústicas que a veces se correlacionan bien con propiedades físicas como periodo (y el poder) para campanas, timbales, que obtendrá un terreno de juego, pero no puede significar lo correcto..
Robert Bristow-Johnson
pero acabo de ejecutar mi pequeño guión matlab en un hit de tom grabado y me pareció que el tono devuelto sería un valor de nota plausible.
Robert Bristow-Johnson