2009-01-12 8 views
18

Il y a ce festival technologique à IIT-Bombay, en Inde, où ils organisent un événement appelé "Artbots" où nous sommes censés concevoir des artbots avec des capacités artistiques. J'ai eu une idée d'un robot musical qui prend une chanson en entrée, détecte les notes dans la chanson et la rejoue sur un piano. J'ai besoin d'une méthode qui va m'aider à calculer les hauteurs des notes de la chanson. Une idée/suggestion sur la façon de s'y prendre?Détecter la fréquence fondamentale

Répondre

1

Avez-vous essayé Wikipedia's article on pitch detection? Il contient quelques références qui peuvent vous intéresser. En outre, voici un list of DSP applications and libraries, où vous pouvez fouiller. La liste ne mentionne que les progiciels Linux, mais beaucoup d'entre eux sont multi-plateformes, et il y a beaucoup de code source que vous pouvez regarder. Just FYI, détecter la hauteur des notes dans un enregistrement monophonique est à la portée de la plupart des gens DSP-savvy. Détecter les hauteurs de toutes les notes, y compris les accords et autres choses, est beaucoup plus difficile.

0

Vous avez essentiellement besoin d'un analyseur de spectre. Vous pourriez être en mesure de faire une FFT sur un enregistrement d'une entrée analogique, mais cela dépend beaucoup de la résolution de l'enregistrement.

0

ce qui me vient immédiatement à l'esprit:

  • filtrent les très basses fréquences (batterie, ligne de basse),
  • filtre à hautes fréquences (harmoniques)
  • FFT,
  • look pour crêtes dans la sortie FFT pour la mélodie

Je ne suis pas sûr, si cela fonctionne pour des sons très polyphoniques - peut-être googling pour "FFT, analysi s, mélodie, etc. retournera plus d'informations sur les problèmes possibles.

concernant

13
Ce

est exactement ce que je fais ici mon projet de l'an dernier :) sauf une chose que mon projet est sur le suivi de la hauteur de la voix humaine de chant (et je n'ai pas le robot jouer le morceau)

Le moyen le plus rapide que je peux penser est d'utiliser BASS library. Il contient une fonction prête à l'emploi qui peut vous donner des données FFT à partir du périphérique d'enregistrement par défaut. Jetez un oeil à l'exemple de code "livespec" fourni avec BASS. Par ailleurs, les données FFT brutes ne suffiront pas à déterminer la fréquence fondamentale. Par contre, les données FFT brutes ne suffiront pas. Vous avez besoin d'un algorithme tel que Harmonic Product Spectrum pour obtenir le F0.

Une autre considération est la source audio. Si vous allez faire de la FFT et y appliquer un spectre de produits harmoniques. Vous devrez vous assurer que l'entrée n'a qu'une seule source audio. S'il contient plusieurs sources comme dans les chansons modernes, il y aura beaucoup de fréquences à considérer.

harmonique du spectre produit Theory

Si le signal d'entrée est une note musicale, alors son spectre devrait être composé d'une série de pics correspondant à fréquence fondamentale avec harmoniques composants à des multiples entiers de la fréquence fondamentale . Par conséquent quand nous compressons le spectre un nombre de fois (sous-échantillonnage), et le comparons avec le spectre original, nous pouvons voir que le plus fort harmonique pointe la ligne vers le haut. Le premier pic dans le spectre original coïncide avec le deuxième pic dans le spectre compressé par un facteur de deux, ce qui coïncide avec le troisième pic dans le spectre comprimé d'un facteur de trois. Par conséquent, lorsque les divers spectres sont multipliés ensemble, le résultat forme un pic net à la fréquence fondamentale .

Méthode

d'abord, on divise le signal d'entrée en segments par application d'une fenêtre de Hanning, où la taille de fenêtre et la taille de houblon sont donnés à titre d'une entrée. Pour chaque fenêtre, , nous utilisons la transformée de courte durée Fourier pour convertir le signal d'entrée du domaine temporel au domaine de fréquence . Une fois que l'entrée est dans le domaine fréquentiel , nous appliquons la technique Harmonic Product Spectrum à chaque fenêtre.

Le HPS comporte deux étapes: sous-échantillonnage et multiplication. Pour downsample, nous comprimons le spectre deux fois dans chaque fenêtre par rééchantillonnage: la première fois, nous compressons le spectre original par deux et le deuxième fois, par trois. Une fois ceci terminé, nous multiplions les trois spectres et trouvons la fréquence correspondant au pic (valeur maximale). Cette fréquence particulière représente la fréquence fondamentale de cette fenêtre particulière.

Limites de la méthode HPS

Quelques fonctionnalités intéressantes de cette méthode comprennent: il est informatiquement bon marché, résistant raisonnablement additif et du bruit multiplicatif et réglable pour différents types de entrées. Par exemple, nous pourrions changer le nombre de spectres compressés à utiliser, et nous pourrions remplacer la multiplication spectrale avec une addition spectrale . Cependant, étant donné que la perception du pas humain est fondamentalement logarithmique, cela signifie que les pas faibles peuvent être suivis avec moins de précision que les hauteurs .

Un autre grave pénurie de la méthode HPS est qu'il sa résolution est aussi bonne que la longueur de la FFT utilisée pour calculer le spectre. Si nous effectuer une FFT courte et rapide, nous sommes limitée dans le nombre de fréquences discrètes nous pouvons considérer. Pour pour obtenir une résolution plus élevée dans notre sortie (et donc voir moins grain dans notre sortie de lancement), nous besoin de prendre une FFT plus longue qui nécessite plus de temps.

de: http://cnx.org/content/m11714/latest/

+3

Comment cela traite-t-il de l'inharmonie des vrais instruments? Les harmoniques sont de plus en plus aigus par rapport aux multiples idéaux, plus haut vous allez. – endolith

4

Juste un commentaire: L'harmonique fondamentale peut aussi bien être d'un manque son (harmonique), cela ne change pas le pas perçu. Comme un cas limite, si vous prenez une onde carrée (par exemple, une note C#) et supprimez complètement la première harmonique, la note perçue est toujours C#, dans la même octave. D'une certaine manière, notre cerveau est capable de compenser l'absence de certaines harmoniques, même la première, quand il devine une note. Par conséquent, pour détecter un pas avec des techniques de domaine fréquentiel, vous devez prendre en compte les harmoniques (les maxima locaux dans l'amplitude de la transformée de Fourier) et extraire une sorte de "plus grand commun diviseur" de leurs fréquences. La détection de hauteur n'est pas du tout un problème ...

DAFX a environ 30 pages dédiées à la détection de hauteur, avec des exemples et du code Matlab.

1

Juste une idée - mais avez-vous besoin de traiter un flux audio numérique en entrée? Si ce n'est pas le cas, pensez à utiliser une représentation symbolique de la musique (par exemple MIDI). Les hauteurs des notes seront alors explicitement indiquées, et vous pouvez synthétiser des sons (et des mouvements) correspondant à la hauteur, au rythme et à de nombreux autres paramètres musicaux extrêmement facilement. Si vous avez besoin d'analyser un flux audio numérique (mp3, wav, live, etc.), gardez à l'esprit que si la détection de pitch de sons monophoniques simples est assez avancée, la détection de pitch polyphonique est un problème non résolu. Dans ce cas, vous pouvez trouver ma réponse à this question utile.

1

Pour extraire la fréquence fondamentale de la mélodie de la musique polyphonique, vous pouvez essayer le MELODIA plug-in: http://mtg.upf.edu/technologies/melodia

Rapatrier les F0 de tous les instruments dans une chanson (multi-F0 suivi) ou de les transcrire en notes est une tâche encore plus difficile. L'extraction de la mélodie et la transcription de la musique sont toujours des problèmes de recherche ouverts, donc quel que soit l'algorithme/l'outil que vous utilisez ne vous attendez pas à obtenir des résultats parfaits pour l'un ou l'autre.

1

Si vous essayez de détecter les notes d'un enregistrement polyphonique (plusieurs notes en même temps), bonne chance. C'est un problème très délicat. Je ne connais aucun moyen d'écouter, disons, un enregistrement d'un quatuor à cordes et d'avoir un algorithme qui sépare les quatre voix. (Les ondelettes peut-être?) Si c'est juste une note à la fois, il y a plusieurs algorithmes de suivi de hauteur, dont beaucoup sont mentionnés dans d'autres commentaires.

L'algorithme que vous souhaitez utiliser dépend du type de musique que vous écoutez. Si vous voulez que les gens chantent, il y a beaucoup de bons algorithmes conçus spécifiquement pour la voix. (C'est là que se trouve la plupart des recherches.) Si vous essayez d'acquérir des instruments spécifiques, vous devrez être un peu plus créatif. Les algorithmes vocaux peuvent être simples car la portée de la voix humaine est généralement limitée à environ 100-2000 Hz. (La portée orale est beaucoup plus étroite). Les fréquences fondamentales sur un piano, cependant, vont d'environ 27 Hz. à 4200 Hz. Il s'agit donc d'une plage plus large généralement ignorée par les algorithmes de détection de hauteur de voix. La forme d'onde de la plupart des instruments va être assez complexe, avec beaucoup d'harmoniques, donc une approche simple comme compter des zéros ou simplement prendre l'autocorrélation ne fonctionnera pas. Si vous saviez à peu près quelle plage de fréquences vous regardiez, vous pouviez filtrer le filtre passe-bas, puis compter zéro. Je pense que vous feriez mieux d'utiliser un algorithme plus complexe tel que Harmonic Product Spectrum mentionné par un autre utilisateur, ou YAAPT ("Yet Another Algorithm for Pitch Tracking"), ou quelque chose de similaire.

Un dernier problème: certains instruments, notamment le piano, auront le problème des fondamentaux manquants et de l'inharmonie. Les fondamentaux manquants peuvent être traités par les algorithmes de suivi de hauteur ... en fait, ils doivent l'être puisque les fondamentaux sont souvent coupés dans la transmission électronique ... même si vous aurez probablement encore quelques erreurs d'octave. Inharmonicity cependant, vous donnera des problèmes si quelqu'un joue une note dans les octaves inférieures du piano. Les algorithmes de suivi de hauteur normaux ne sont pas conçus pour traiter l'inharmonie car la voix humaine n'est pas significativement inharmonique.

Questions connexes