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.
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: