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

13

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

  1. Graba 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 que está 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 clasificarla

No he intentado nada de esto todavía porque no quiero comenzar por el camino equivocado. Entonces, en teoría, ¿funcionará esto?

    
pregunta michaelsnowden

4 respuestas

22

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.

Las bandejas de frecuencia FFT no pueden golpear todos los tonos (o incluso múltiples) de la escala musical simultáneamente.

Le sugeriría que juegue con un programa de audio (por ejemplo, Audacity) que incluya un analizador de 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 el FFT.

Si necesita detectar unos pocos tonos específicos, puede encontrar que el algoritmo de Goertzel es 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 puede que no obtenga lo que desea.

    
respondido por el JRE
3

Yo diría que usar una ventana de observación multimodal de la señal sería mejor. Algo a lo largo de las líneas de 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 qué son las wavelets, pero piensa en ellas como una ventana de resolución múltiple que pasa sobre tu señal como un STFT. Por lo tanto, 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 wavelet, necesitarás implementar algoritmos que identifiquen las notas y los tonos periféricos.

Creo que las wavelets realmente abordan los problemas que la gente ha estado hablando acerca de la identificación del tono.

si desea saber cómo funcionan las wavelets, este es un maravilloso artículo publicado por HP al respecto. enlace y Introducción a Wavelets

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

    
respondido por el steve_stackex
1

Supongo que estás pensando en las notas tocadas en la mitad del rango del piano (por ejemplo, entre 200 y 500 Hz) pero incluso en ese rango, una sola nota tendrá muchos armónicos, que no son exactos múltiplos de la frecuencia fundamental, y también una 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 de la 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 un FFT asume que la señal que está tratando de detectar tiene una amplitud constante. Eso no se aplica a las notas de piano donde la amplitud realmente sigue a varias decaimientos exponenciales superpuestos: la parte inicial de la decadencia tiene una constante de tiempo relativamente corta, pero la parte posterior tiene una constante de tiempo más larga.

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

Tenga en cuenta que dado que el tono fundamental de las notas sucesivas aumenta en 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 en sintonía con una escala musical, donde es posible que las frecuencias deban medirse con una precisión superior al 0,1%.

    
respondido por el alephzero
0

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

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

Si solo desea analizar su propia música, ya hay software para hacerlo. Puede ver los ecualizadores que muestran la respuesta (básicamente la FFT) u obtener un "ecualizador musical" que muestre los tonos también. Puede obtener audio para midi VST que convierte 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 la FFT y cómo se relaciona con la música, entonces es mejor obtener algo como Matlab, donde puedes calcular la FFT de cualquier información. Tiene la capacidad de grabar y reproducir junto con la lectura de archivos wav y demás. Estos entonces para ser realmente fácil de usar. Puede graficar el audio y hacer todo tipo de análisis con bastante rapidez si conoce la sintaxis.

Si quieres 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).

Necesitarás construir los circuitos y todo eso. No es difícil, pero dependiendo de su experiencia / conocimiento, puede llevar bastante tiempo y tiene una curva de aprendizaje muy pronunciada. También depende de la calidad del producto final.

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

Supongamos que F0 es la frecuencia fundamental, entonces la mayoría de las notas musicales se aproximarán por F (t) + F0 * suma (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 la FFT, terminas con datos que, y solo haces matemáticas. Es básicamente cálculo.

Todo lo que 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 el juego A = 440 hz y A '= 880 hz, la mayoría de los armónicos se superpondrán. Puede obtener fácilmente el A = 440 hz, pero obtener el A '= 880 hz es más difícil. Cuando piensas en acordes, ejecuciones rápidas, etc., puede ser muy difícil obtener toda la información con precisión (notas). Si bien en general todo es matemáticamente posible, los datos en sí tienen errores y anomalías, y en algunos casos las ecuaciones están poco definidas.

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

respondido por el AbstractDissonance

Lea otras preguntas en las etiquetas