15 votos

¿Puedo utilizar la FFT para reconocer las notas musicales de un piano?

Quiero crear una herramienta que reconozca algunas notas musicales (sé que esto es reinventar la rueda). Así que tocaría el Do, el Re y el Mi medios en un piano y debería ser capaz de clasificar esas notas. Así es como creo que debería enfocarlo:

  1. Grabar una muestra de mí tocando una nota
  2. Convertir la señal al dominio de la frecuencia mediante la transformada rápida de Fourier
  3. Encontrar la frecuencia más presente (básicamente argmax de los datos del dominio de la frecuencia)
  4. Asumir que la frecuencia proviene de la nota tocada y utilizarla para clasificar la nota

Todavía no he probado nada de esto porque no quiero empezar por el camino equivocado. Así que, en teoría, ¿funcionará esto?

0 votos

Estaría bien que fueras más específico en el título. Intenté incluir la parte del reconocimiento del tono del piano, pero mi inglés (no nativo) parece que me está fallando hoy.

1 votos

@pipe ok lo he cambiado

1 votos

La "muestra" de tocar una nota debería ser ya una forma de onda de amplitud y tiempo. Esencialmente, el punto 2 es redundante. Para una implementación relativamente simple, tus pasos anteriores deberían estar bien.

25voto

JRE Puntos 4167

El concepto es bueno, pero verás que no es tan sencillo en la práctica.

El tono no es simplemente el tono predominante, así que ahí está el problema número 1.

Los bines de frecuencia de la FFT no pueden alcanzar todos (o incluso varios) tonos de la escala musical simultáneamente.

Sugeriría jugar 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 concreta utilizando la FFT.

Si necesita detectar sólo algunos tonos específicos, puede encontrar el Algoritmo Goertzel para que sea más fácil y rápido.

La detección del tono es complicada, y todavía se está investigando en ese campo. La detección del tono es bastante sencilla, pero puede que no consiga lo que quiere.

0 votos

Si partimos de la base de que las muestras son de un instrumento específico, el problema puede ser un poco más fácil de tratar, ¿no?

0 votos

Esto tiene muy buena pinta. Una pregunta de seguimiento es: ¿se puede utilizar el Algoritmo Goertzel para detectar dos notas que se están tocando simultáneamente?

0 votos

Puede utilizarse para detectar tonos simultáneos. Si eso es suficiente para detectar notas simultáneas es una cuestión diferente, en la que todavía estoy trabajando. Tengo un detector de notas de guitarra basado en Goertzel con el que he estado jugando durante años.

3voto

steve_stackex Puntos 21

Yo diría que utilizar 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 permita identificar los múltiples sobretonos dentro de la nota. Sí, en realidad Wavelets, yo diría que es el camino a seguir.

Esto es un desglose muy generalizado de lo que son las ondículas, pero piensa en ellas como una ventana multirresolución que pasa sobre tu señal como una STFT. Esto también es importante, ya que la nota que tocas no es una señal estacionaria, sino que suena y decae con el tiempo. No soy músico, pero creo que la dominancia del tono cambia a lo largo del decaimiento de la nota.

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

Creo que las ondículas abordan realmente los problemas de los que se ha hablado en cuanto a la identificación del tono.

si quieres aprender cómo funcionan las wavelets, este es un magnífico libro blanco publicado por HP al respecto :) http://www.hpl.hp.com/hpjournal/94dec/dec94a6.pdf y Introducción a las ondículas

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

1voto

ioscode Puntos 126

Supongo que estás pensando en las notas que se tocan 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 exactamente múltiplos de la frecuencia fundamental, y también una cantidad significativa de ruido de banda ancha al principio de cada nota, y quizás también al final.

En el caso de las notas fuertes en el extremo inferior de la gama de notas, verás que muy poca de la energía sonora (menos del 1%) está realmente en el tono fundamental de la nota.

Otro problema es que una interpretación ingenua de la FFT supone que la señal que se intenta detectar tiene una amplitud constante. Esto no se aplica a las notas de piano, en las que la amplitud sigue en realidad 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.

Quizá sea mejor investigar los métodos de transformada de Fourier de escala temporal corta, por ejemplo la transformada de Gabor, o los métodos basados en ondículas.

Tenga en cuenta que, dado que el tono fundamental de las notas sucesivas aumenta aproximadamente un 6% por cada nota, no se necesita necesariamente 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 en una escala musical, donde las frecuencias deben medirse con una precisión superior al 0,1%.

0voto

mrbradleyt Puntos 800

Sí, ¡en esto consiste la FFT! Para obtener el espectro de frecuencias de los datos que se introducen. La parte difícil son los detalles de implementación, como has mencionado.

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

Si sólo quieres analizar tu propia música, ya existen programas informáticos para hacerlo. Puedes buscar ecualizadores que muestren la respuesta (básicamente la FFT), o conseguir un "ecualizador musical" que muestre también los tonos. Puedes conseguir VST's de audio a midi que convierten lo que tocas en las notas midi correctas. Si tu teclado es midi, omite los VST y graba el midi directamente.

Si quieres enseñarte a ti mismo la FFT y cómo se relaciona con la música, entonces es mejor conseguir algo como Matlab donde puedes calcular la FFT de cualquier dato. Tiene la capacidad de grabar y también reproducir junto con la lectura de archivos wav y tal. Estos entonces ser reall fácil de usar. Puedes graficar el audio y hacer todo tipo de análisis bastante rápido si conoces la sintaxis.

Si quieres construir un dispositivo para hacer tal cosa, es bastante complejo. Necesitarás un uC/dsp/fpga/etc para hacer los cálculos. La mayoría de los dispositivos populares ya vienen con el código FFT para que no tengas que codificarlo tú mismo (también complicado).

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

Matemáticamente, una nota musical ideal consiste en una serie geométrica de la "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 + ....

Las a_k no son más que la fuerza de esas frecuencias más altas F_k y F_k no es más que algún 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. Basta con encontrar el máximo de la FFT y esa frecuencia es la fundamental del tono = la nota musical.

Cuando se toma la FFT, se termina con datos que, y sólo hacer las matemáticas en. Es básicamente el cálculo.

Todo eso es relativamente fácil.

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

  1. Latencia - Si vas 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 tocas A = 440hz y A' = 880hz, la mayoría de los armónicos se solaparán. Puedes conseguir fácilmente el A = 440hz, pero conseguir el A' = 880hz es más difícil. Cuando se piensa en acordes, carreras rápidas, etc, entonces puede ser muy difícil obtener con precisión toda la información (notas). Aunque en general todo 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 dar resultados espurios. Si se produce un ruido musical, puede estropear los resultados. Se necesitarían entonces mejores algoritmos = tiempo + dinero + conocimientos.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X