Puis-je utiliser la FFT pour reconnaître des notes de musique sur un piano?

13

Je veux créer un outil qui reconnaît quelques notes de musique (je sais que cela réinvente la roue). Je jouerais donc du C, D et E du milieu sur un piano et il devrait être capable de classer ces notes. Voici comment je pense que je devrais l'aborder:

  1. Enregistrer un échantillon de moi jouant une note
  2. Convertir le signal dans le domaine fréquentiel en utilisant la transformée de Fourier rapide
  3. Trouver la fréquence la plus présente (essentiellement l'argmax des données du domaine fréquentiel)
  4. Supposons que la fréquence provient de la note jouée et utilisez-la pour classer la note

Je n'ai encore rien essayé parce que je ne veux pas m'engager dans la mauvaise voie. Donc, théoriquement, cela fonctionnera-t-il?

michaelsnowden
la source
Ce serait bien si vous pouviez être plus précis dans le titre. J'ai essayé d'inclure un peu sur la reconnaissance de la hauteur de piano, mais mon anglais (non natif) me manque apparemment aujourd'hui.
pipe
1
@pipe ok je l'ai changé
michaelsnowden
1
Votre "échantillon" de lecture d'une note doit déjà être une forme d'onde d'amplitude et de temps. Essentiellement, le point 2 est redondant. Pour une implémentation relativement simple, vos étapes ci-dessus devraient être très bien.
user2943160
@ user2943160 Je l'ai ajouté pour être explicite. Le son peut être stocké dans de nombreux formats, et il faut généralement un peu de mal pour le mettre dans une belle amplitude au fil du temps.
michaelsnowden
@michaelsnowden: Vous utilisez le terme "amplitude" mauvais: l'amplitude d'une fonction sinusoïdale est un . C'est le maximum du signal (tension, déplacement, ...) et c'est une constante (ou évoluant lentement par rapport à la fréquence). Ce que vous voulez dire, c'est juste le signal y ( t ) . Sinon, je pense que par "amplitude dans le temps", vous voulez dire l'enveloppe du signal, mais d'après ce que je comprends, vous ne le faites pas. y(t)=UNEpéché(ωt)UNEy(t)
Curd

Réponses:

23

Le concept est bon, mais vous constaterez qu'il n'est pas si simple dans la pratique.

Le ton n'est pas simplement le ton prédominant, il y a donc le problème numéro 1.

Les bacs de fréquences FFT ne peuvent pas toucher tous (ou même plusieurs) tons de l'échelle musicale simultanément.

Je suggérerais de jouer avec un programme audio (par exemple, Audacity) qui comprend un analyseur FFT et un générateur de sons pour avoir une idée de ce qu'il peut (et ne peut pas) faire avant d'essayer de mettre en œuvre une tâche particulière à l'aide de la FFT.

Si vous avez besoin de détecter seulement quelques tonalités spécifiques, vous trouverez peut-être que l' algorithme de Goertzel est plus facile et plus rapide.

La détection de la hauteur est compliquée et des recherches sont toujours en cours dans ce domaine. La détection de tonalité est assez simple, mais peut ne pas vous donner ce que vous voulez.

JRE
la source
Si nous partons de l'hypothèse que les échantillons sont d'un instrument spécifique, le problème peut être un peu plus facile à traiter, non?
mkeith
Ça a l'air vraiment bien. Une question de suivi est: l'algorithme de Goertzel peut-il être utilisé pour détecter deux notes jouées simultanément?
michaelsnowden
Il peut être utilisé pour détecter des tonalités simultanées. Que ce soit suffisant pour détecter des notes simultanées est une question différente, et je travaille toujours dessus. J'ai un détecteur de notes de guitare basé sur Goertzel avec lequel je fais du singe depuis des années.
JRE
2
@mkeith: En quelque sorte. Vous pouvez tester les notes et voir si la détection de la tonalité prédominante est adéquate pour un instrument particulier (et peut-être seulement les notes d'intérêt.) Pour autant que je sache, il n'y a pas de solution générale pour détecter toutes les notes de tous les instruments.
JRE
3

Je dirais qu'il serait préférable d'utiliser une fenêtre d'observation multimodale du signal. Quelque chose dans le sens d'une décomposition en ondelettes de votre signal audio qui vous permettra d'identifier les multiples harmoniques à l'intérieur de la note. Ouais, en fait des ondelettes, je dirais que c'est la voie à suivre.

Il s'agit d'une ventilation très généralisée de ce que sont les ondelettes, mais considérez-les comme une fenêtre multirésolution qui passe sur votre signal comme un STFT. Ainsi, vous pouvez identifier différentes sinusoïdes qui se produisent à différents emplacements temporels dans votre signal. ceci est également important car la note que vous jouez n'est pas un signal stationnaire, elle est jouée puis décroît avec le temps. Je ne suis pas musicien, mais je pense que la dominance de ton change tout au long de la décroissance de la note.

bien sûr, après la décomposition en ondelettes, vous devrez implémenter des algorithmes qui identifient les notes et les tons périphériques.

Je pense que les ondelettes résolvent vraiment les problèmes que les gens ont évoqués en termes d'identification de la hauteur.

si vous souhaitez savoir comment fonctionnent les ondelettes, c'est un merveilleux livre blanc publié par HP à ce sujet :) http://www.hpl.hp.com/hpjournal/94dec/dec94a6.pdf et Introduction aux ondelettes

pour la mise en œuvre, MATLAB dispose d'un outil en ondelettes et je suis sûr qu'il existe une pléthore d'autres packages disponibles pour des plateformes comme R, etc.

steve_stackex
la source
1

Je pense que vous pensez à des notes jouées au milieu de la plage du piano (disons entre 200 et 500 Hz) mais même dans cette plage, une seule note aura de nombreuses harmoniques, qui ne sont pas exactes multiples de la fréquence fondamentale, et aussi un quantité importante de bruit à large bande au début de chaque note, et peut-être aussi à la fin.

Pour les notes fortes à l'extrémité inférieure de la plage de notes, vous constaterez que très peu de l'énergie sonore (moins de 1%) se trouve réellement dans la hauteur fondamentale de la note.

Un autre problème est qu'une interprétation naïve d'une FFT suppose que le signal que vous essayez de détecter a une amplitude constante. Cela ne s'applique pas aux notes de piano où l'amplitude suit en fait plusieurs désintégrations exponentielles superposées - la partie initiale de la désintégration a une constante de temps relativement courte, mais la dernière partie a une constante de temps plus longue.

Il vaut peut-être mieux étudier les méthodes de transformée de Fourier à court terme, par exemple la transformée de Gabor, ou les méthodes basées sur les ondelettes.

Notez que puisque la hauteur fondamentale des notes successives augmente d'environ 6% pour chaque note, vous n'avez pas nécessairement besoin d'une très grande précision pour identifier les fréquences des harmoniques dans l'audio. Identifier correctement les notes de musique n'est pas tout à fait le même problème que de déterminer si les notes sont précisément en accord avec une échelle musicale, où les fréquences peuvent devoir être mesurées avec une précision supérieure à 0,1%.

alephzero
la source
0

Oui, c'est bien la FFT! Pour vous donner le spectre de fréquence des données que vous alimentez. La partie difficile est les détails de mise en œuvre, comme vous l'avez mentionné.

Selon ce que vous voulez faire, exactement, change la réponse.

Si vous souhaitez simplement analyser votre propre musique, il existe déjà des logiciels pour le faire. Vous pouvez regarder les égaliseurs qui montrent la réponse (essentiellement la FFT), ou obtenir un "égaliseur musical" qui montre également les hauteurs. Vous pouvez obtenir de l'audio en MIDI VST qui convertissent ce que vous jouez en notes MIDI correctes. Si votre clavier est midi, sautez simplement les VST et enregistrez le midi directement.

Si vous voulez vous apprendre la FFT et comment elle se rapporte à la musique, mieux vaut obtenir quelque chose comme Matlab où vous pouvez calculer la FFT de toutes les données. Il a la capacité d'enregistrer et de lire avec la lecture de fichiers wav et autres. Celles-ci doivent alors être très faciles à utiliser. Vous pouvez représenter graphiquement l'audio et effectuer toutes sortes d'analyses assez rapidement si vous connaissez la syntaxe.

Si vous voulez construire un appareil pour faire une telle chose, c'est assez complexe. Vous aurez besoin d'un uC / dsp / fpga / etc pour faire les calculs. La plupart des appareils populaires sont déjà livrés avec du code FFT, vous n'aurez donc pas à le coder vous-même (aussi compliqué).

Vous aurez besoin de construire les circuits et tout ça. Ce n'est pas difficile, mais selon votre expérience / vos connaissances, cela peut prendre un certain temps et avoir une courbe d'apprentissage abrupte. Cela dépend également de la qualité du produit final.

Mathématiquement, une note de musique idéale consiste en une série géométrique du "fondamental".

Supposons que F0 soit la fréquence fondamentale, alors la plupart des notes de musique seront approximées par F (t) + F0 * sum (a_k e ^ (2 ^ k F0 * pi i t)) = F0 + a_1 * F1 + a_2 * F2 +. ...

Les a_k ne sont que la force de ces fréquences plus élevées F_k et F_k n'est qu'un multiple de F0. Si a_k = 0 pour tout k, alors nous avons une sinusoïde pure. La hauteur de celui-ci est facile à détecter. Il suffit de trouver le maximum de la FFT et cette fréquence est le fondamental du ton = la note de musique.

Lorsque vous prenez la FFT, vous vous retrouvez avec des données et faites simplement des calculs. C'est essentiellement du calcul.

Tout cela est relativement simple.

Certains problèmes que vous devrez résoudre. Notez que tous ces problèmes ne sont pas "résolus".

  1. Latence - Si vous allez faire n'importe quel type de choses en temps réel, cela peut devenir un problème.

  2. Notes multiples - Il est difficile de déterminer le groupe de notes en raison de toutes les harmoniques supplémentaires. Si vous jouez A = 440 Hz et A '= 880 Hz, la plupart des harmoniques se chevaucheront. Vous pouvez facilement obtenir le A = 440 Hz, mais obtenir le A '= 880 Hz est plus difficile. Lorsque vous pensez à des accords, à des exécutions rapides, etc., il peut être très difficile d'obtenir précisément toutes les informations (notes). Bien que tout soit généralement mathématiquement possible, les données elles-mêmes comportent des erreurs et des aberrations, et les équations sont sous-définies dans certains cas.

  3. Bruit - Le bruit dans le signal peut vous donner de faux résultats. Si un bruit musical se produit, il peut gâcher vos résultats. De meilleurs algorithmes seraient alors nécessaires = temps + argent + connaissances.

RésuméDissonance
la source