¿Puedo usar el FFT para reconocer notas musicales en un piano?

13

Quiero crear una herramienta que reconozca algunas notas musicales (sé que esto está reinventando la rueda). Entonces tocaría C, D y E en el piano y debería poder clasificar esas notas. Así es como creo que debería abordarlo:

  1. Grabe una muestra de mí tocando una nota
  2. Convierta la señal al dominio de frecuencia utilizando la transformada rápida de Fourier
  3. Encuentre la frecuencia más presente (básicamente argmax de los datos del dominio de frecuencia)
  4. Suponga que la frecuencia proviene de la nota tocada y úsela para clasificar la nota.

Todavía no he probado nada de esto porque no quiero comenzar por el camino equivocado. Entonces, teóricamente, ¿funcionará esto?

michaelsnowden
fuente
Sería bueno si pudieras ser más específico en el título. Traté de incluir un poco sobre el reconocimiento de tono de piano, pero mi inglés (no nativo) aparentemente me está fallando hoy.
tubería
1
@pipe ok lo cambié
michaelsnowden
1
Su "muestra" de tocar una nota ya debería ser una forma de onda de amplitud y tiempo. Esencialmente, el punto 2 es redundante. Para una implementación relativamente simple, los pasos anteriores deberían estar bien.
user2943160
@ user2943160 Lo agregué para que sea explícito. El sonido se puede almacenar en muchos formatos, y por lo general se necesita un poco de manipulación para lograr una amplitud agradable con el tiempo.
michaelsnowden
@michaelsnowden: Usted está utilizando el término "amplitud" equivocado: la amplitud de una función sinusoidal es A . Es el máximo de la señal (voltaje, desplazamiento, ...) y es una constante (o que cambia lentamente con respecto a la frecuencia). Lo que quieres decir es solo la señal y ( t ) . De lo contrario, creo que por "amplitud en el tiempo" te refieres a la envolvente de la señal, pero por lo que entiendo, no lo haces. y(t)=UNpecado(ωt)UNy(t)
Cuajada

Respuestas:

23

El concepto es bueno, pero encontrará que no es tan simple en la práctica.

El tono no es simplemente el tono predominante, por lo que hay un problema número 1.

Los contenedores de frecuencia FFT no pueden alcanzar todos los tonos (o incluso múltiples) de la escala musical simultáneamente.

Sugeriría jugar con un programa de audio (por ejemplo, Audacity) que incluye un analizador FFT y un generador de tonos para tener una idea de lo que puede (y no puede) hacer antes de intentar implementar una tarea en particular usando la FFT.

Si necesita detectar solo unos pocos tonos específicos, puede encontrar el algoritmo de Goertzel sea ​​más fácil y rápido.

La detección de tono es complicada, y todavía hay investigaciones en curso en ese campo. La detección de tonos es bastante sencilla, pero es posible que no obtenga lo que desea.

JRE
fuente
Si comenzamos con el supuesto de que las muestras son de un instrumento específico, el problema puede ser un poco más fácil de manejar, ¿verdad?
mkeith
Esto se ve muy bien. Una pregunta de seguimiento es: ¿se puede usar el algoritmo de Goertzel para detectar dos notas que se están reproduciendo simultáneamente?
michaelsnowden
Se puede usar para detectar tonos simultáneos. Si eso es suficiente para detectar notas simultáneas es una pregunta diferente, y todavía estoy trabajando. Tengo un detector de notas de guitarra basado en Goertzel con el que he estado monjeando de vez en cuando.
JRE
2
@mkeith: más o menos. Puede probar las notas y ver si la detección del tono predominante es adecuada para un instrumento en particular (y tal vez solo las notas de interés). Hasta donde sé, sin embargo, no hay una solución general para detectar todas las notas de todos los instrumentos.
JRE
3

Yo diría que usar una ventana de observación multimodal de la señal sería mejor. Algo parecido a una descomposición wavelet de su señal de audio que le permitirá identificar los múltiples armónicos dentro de la nota. Sí, en realidad Wavelets, diría que es el camino a seguir.

Este es un desglose muy generalizado de lo que son las wavelets, pero piense en ellas como una ventana multirresolución que pasa sobre su señal como un STFT. Entonces puede identificar diferentes sinusoidales que ocurren en diferentes ubicaciones temporales dentro de su señal. Esto también es importante ya que la nota que tocas no es una señal estacionaria, se reproduce y luego decae con el tiempo. No soy músico, sin embargo, creo que el dominio del tono cambia a lo largo de la decadencia de la nota.

Por supuesto, después de la descomposición de wavelets, deberá implementar algoritmos que identifiquen las notas y los tonos periféricos.

Creo que las wavelets realmente abordan los problemas de los que la gente ha estado hablando en términos de identificación de tono.

si desea saber cómo funcionan las wavelets, este es un maravilloso documento publicado por HP al respecto :) http://www.hpl.hp.com/hpjournal/94dec/dec94a6.pdf e Introducción a Wavelets

para la implementación, MATLAB tiene una herramienta wavelet y estoy seguro de que hay una gran cantidad de otros paquetes disponibles para plataformas como R, etc.

steve_stackex
fuente
1

Supongo que está pensando en notas tocadas en el medio del rango del piano (digamos entre 200 y 500 Hz) pero incluso en ese rango, una sola nota tendrá muchos sobretonos, que no son múltiplos exactos de la frecuencia fundamental, y también un cantidad significativa de ruido de banda ancha al comienzo de cada nota, y quizás también al final.

Para notas fuertes en el extremo inferior del rango de notas, encontrará que muy poca energía del sonido (menos del 1%) está realmente en el tono fundamental de la nota.

Otro problema es que una interpretación ingenua de una FFT supone que la señal que intenta detectar tiene una amplitud constante. Eso no se aplica a las notas de piano donde la amplitud realmente sigue a varios decaimientos exponenciales superpuestos: la parte inicial del decaimiento tiene una constante de tiempo relativamente corta, pero la parte posterior tiene una constante de tiempo más larga.

Es posible que esté investigando mejor los métodos de transformación de Fourier a corto plazo, por ejemplo, la transformación de Gabor o los métodos basados ​​en wavelet.

Tenga en cuenta que dado que el tono fundamental de las notas sucesivas aumenta aproximadamente un 6% para cada nota, no necesariamente necesita una precisión muy alta para identificar las frecuencias de los armónicos en el audio. Identificar correctamente las notas musicales no es el mismo problema que determinar si las notas están afinadas con precisión con una escala musical, donde es posible que sea necesario medir las frecuencias con una precisión superior al 0.1%.

alephzero
fuente
0

Sí, ¡de eso se trata la FFT! Para darle el espectro de frecuencia de los datos que alimenta. La parte difícil son los detalles de implementación, como usted ha mencionado.

Dependiendo de lo que quieras hacer, exactamente, cambia la respuesta.

Si solo quieres analizar tu propia música, ya hay un software para hacerlo. Podrías mirar los ecualizadores que muestran la respuesta (básicamente la FFT) u obtener un "ecualizador musical" que también muestre los tonos. Puede obtener audio en VST midi que convierten lo que toca en las notas midi correctas. Si su teclado es midi, simplemente omita los VST y grabe el midi directamente.

Si quieres enseñarte a ti mismo el FFT y cómo se relaciona con la música, entonces mejor obtener algo como Matlab donde puedas calcular el FFT de cualquier dato. Tiene la capacidad de grabar y también reproducir junto con la lectura de archivos wav y demás. Estos luego serán realmente fáciles de usar. Puede graficar el audio y hacer todo tipo de análisis bastante rápido si conoce la sintaxis.

Si desea construir un dispositivo para hacer tal cosa, entonces es bastante complejo. Necesitará un uC / dsp / fpga / etc para hacer los cálculos. La mayoría de los dispositivos populares ya vienen con código FFT, por lo que no tendrá que codificarlo usted mismo (también es complicado).

Tendrás que construir el circuito y todo eso. No es difícil, pero dependiendo de su experiencia / conocimiento, podría llevar bastante tiempo y tiene una curva de aprendizaje empinada. También depende de la calidad del producto final.

Matemáticamente, una nota musical ideal consiste en una serie geométrica de lo "fundamental".

Suponga que F0 es la frecuencia fundamental, entonces la mayoría de las notas musicales se aproximarán por F (t) + F0 * sum (a_k e ^ (2 ^ k F0 * pi i t)) = F0 + a_1 * F1 + a_2 * F2 +. ...

Los a_k son solo la fuerza de esas frecuencias más altas F_k y F_k es solo un múltiplo de F0. Si a_k = 0 para todo k, entonces tenemos una sinusoide pura. El tono de esto es fácil de detectar. Simplemente encuentre el máximo de la FFT y esa frecuencia es la fundamental del tono = la nota musical.

Cuando tomas el FFT, terminas con datos que, y solo haces matemáticas. Básicamente es cálculo.

Todo eso es relativamente fácil.

Algunos problemas con los que tendrás que lidiar. Tenga en cuenta que no todos estos están "resueltos".

  1. Latencia: si va a hacer cualquier tipo de cosas en tiempo real, esto puede convertirse en un problema.

  2. Notas múltiples: es difícil determinar el grupo de notas debido a todos los armónicos adicionales. Si toca A = 440hz y A '= 880hz, la mayoría de los armónicos se superpondrán. Puede obtener fácilmente A = 440 hz, pero obtener A '= 880 hz es más difícil. Cuando piensa en acordes, ejecuciones rápidas, etc., puede ser muy difícil obtener con precisión toda la información (notas). Si bien todo generalmente es matemáticamente posible, los datos en sí tienen errores y aberraciones, y las ecuaciones están poco definidas en algunos casos.

  3. Ruido: el ruido en la señal puede brindarle resultados espurios. Si se produce un ruido musical, puede arruinar sus resultados. Se requerirían mejores algoritmos = tiempo + dinero + conocimiento.

AbstractDissonance
fuente