J'essaie de détecter en temps réel la hauteur d'un utilisateur chantant, mais je rencontre beaucoup de problèmes. J'ai essayé de nombreuses méthodes, y compris la FFT ( problème FFT (renvoie des résultats aléatoires) ) et l'autocorrélation ( la détection de hauteur d'autocorrélation renvoie des résultats aléatoires avec une entrée micro ), mais je peux semble pas avoir de méthodes pour donner un bon résultat. Quelqu'un peut-il suggérer une méthode de suivi de hauteur en temps réel ou comment améliorer une méthode que j'ai déjà? Je n'arrive pas à trouver de bonnes méthodes C/C++ pour la détection de hauteur en temps réel.
Merci,
Niall.
Edit: Juste pour noter, j'ai vérifié que les données d'entrée du micro sont correctes et que lorsque vous utilisez une onde sinusoïdale, les résultats sont plus ou moins la hauteur correcte.
Modifier: Désolé, il est tard, mais pour le moment, je visualise l'autocollération en retirant les valeurs du tableau de résultats et de chaque index, et en traçant l'index sur l'axe X et la valeur sur l'axe Y (les deux sont divisés par 100000 ou quelque chose du genre, et j'utilise OpenGL), brancher les données sur un hôte VST et utiliser des plugins VST n'est pas une option pour moi. Pour le moment, cela ressemble à des points aléatoires. Suis-je en train de le faire correctement, ou pouvez-vous s'il vous plaît me diriger vers un code pour le faire ou m'aider à comprendre comment visualiser les données audio brutes et les données d'autocorrélation.
Prendre du recul ... Pour que cela fonctionne, vous DEVEZ trouver un moyen de tracer les étapes intermédiaires de ce processus. Ce que vous essayez de faire n'est pas particulièrement difficile, mais il est sujet aux erreurs et fastidieux. Écrêtage, fenêtrage, mauvais câblage, aliasing, DC, lecture des mauvais canaux, étrange axe de fréquence FFT, décalages d'impédance, erreurs de taille de trame ... qui sait. Mais si vous pouvez tracer le données brutes, puis tracer la FFT, tout deviendra clair.
J'ai trouvé plusieurs implémentations open source de suivi de hauteur en temps réel
dywapitchtrack utilise un algorithme basé sur des ondelettes
Real Time C # Pitch Tracker utilise une approche d'autocorrélation modifiée
aubio (mentionné par piem; plusieurs algorithmes sont disponibles)
Il existe également des trackers de pitch qui ne sont peut-être pas conçus pour le temps réel, mais peuvent être utilisés de cette façon pour autant que je sache, et pourraient également être utiles comme référence pour comparer votre tracker en temps réel à:
Praat est un package open source parfois utilisé pour l'extraction de pitch par les linguistes et vous pouvez trouver l'algorithme documenté sur http://www.fon.hum.uva.nl/paul/praat. html
Snack et WaveSurfer contiennent également un extracteur de hauteur
Je sais que cette réponse ne rendra pas tout le monde heureux, mais voilà.
Ce truc est dur, très dur. Allez d'abord lire autant de tutoriels que vous pouvez trouver sur FFT, Autocorrelation, Wavelets. Bien que je sois toujours aux prises avec le DSP, j'ai obtenu quelques informations des éléments suivants.
https://www.coursera.org/course/audio le cours ne fonctionne pas pour le moment mais les vidéos sont toujours disponibles.
http://miracle.otago.ac.nz/tartini/papers/Philip_McLeod_PhD.pdf thèse sur le développement d'un algorithme de reconnaissance de hauteur.
http://dsp.stackexchange.com un site entier dédié au traitement du signal numérique.
Si, comme moi, vous n'avez pas fait suffisamment de mathématiques pour suivre complètement les didacticiels, n'abandonnez pas, car certains diagrammes et exemples m'ont encore aidé à comprendre ce qui se passait.
Viennent ensuite les données de test et les tests. Écrivez-vous une bibliothèque qui génère des fichiers de test à utiliser pour vérifier vos algorithmes.
1) Un générateur d'onde sinusoïdale pure super simple. Supposons donc que vous envisagiez d'écrire YAT (Yet Another Tuner), puis utilisez votre générateur de sinus pour créer une série de fichiers autour de 440 Hz, par exemple de 420 à 460 Hz, par incréments variables, et voyez à quel point votre code est sensible et précis. Peut-il se résoudre à 5 Hz, 1 Hz, plus fin encore?
2) Ensuite, mettez à niveau votre générateur d'onde sinusoïdale afin qu'il ajoute une série d'harmoniques plus faibles au signal.
3) Viennent ensuite les variations du monde réel sur les harmoniques. Ainsi, alors que pour la plupart des instruments à cordes, vous verrez une série d'harmoniques comme de simples multiples de la fréquence fondamentale F0, pour des instruments comme les clarinettes et les flûtes en raison de la façon dont l'air se comporte dans la chambre, les harmoniques paires seront manquantes ou très faibles. Et pour certains instruments F0 est manquant mais peut être déterminé à partir de la distribution des autres harmoniques. F0 étant ce que l'oreille humaine perçoit comme du tangage.
4) Ajoutez une distorsion délibérée en décalant les fréquences de crête harmoniques de haut en bas de manière irrégulière
Le fait étant que si vous créez des fichiers avec des résultats connus, il est plus facile de vérifier que ce que vous construisez fonctionne réellement, mis à part les bugs bien sûr.
Il existe également un certain nombre de "bibliothèques" contenant des échantillons sonores. https://freesound.org de la série Coursera mentionnée ci-dessus. http://theremin.music.uiowa.edu/MIS.html
Sachez ensuite que votre microphone n'est pas parfait et à moins que vous n'ayez dépensé des milliers de dollars, il aura une plage de réponse en fréquence assez variable. En particulier, si vous travaillez avec des notes basses, des microphones moins chers, lisez ceux intégrés dans votre PC ou votre téléphone, ont un roulement important commençant à environ 80-100 Hz. Pour les appareils externes raisonnablement bons, vous pouvez descendre à 30-40 Hz. Allez trouver les données sur votre microphone.
Vous pouvez également vérifier ce qui se passe en jouant la tonalité via des haut-parleurs, puis en enregistrant avec votre microphone préféré. Mais bien sûr, nous parlons maintenant de 2 ensembles de courbes de réponse en fréquence.
En ce qui concerne les performances, il existe un certain nombre de bibliothèques disponibles gratuitement, bien que vous connaissiez les différents modèles de licence.
Surtout, n'abandonnez pas après vos premiers essais. Bonne chance.
Voici le code source C++ pour un algorithme inhabituel à deux étapes que j'ai conçu qui peut faire Détection de hauteur en temps réel sur polyphonique Fichiers MP3 en cours de lecture sous Windows. Cette application gratuite ( PitchScope Player , disponible sur le web) est fréquemment utilisée pour détecter les notes d'un solo de guitare ou de saxophone lors d'un enregistrement MP3. L'algorithme est conçu pour détecter la hauteur la plus dominante (une note de musique) à un moment donné dans un fichier musical MP3. Les ensembles de notes sont inférés avec précision par un changement significatif de la hauteur la plus dominante (une note de musique) à un moment donné pendant l'enregistrement MP3.
Lorsqu'une seule touche est pressée sur un piano, ce que nous entendons n'est pas seulement une fréquence de vibration sonore, mais un composite de multiples vibrations sonores se produisant à différents fréquences mathématiques. Les éléments de ce composite de vibrations à différentes fréquences sont appelés harmoniques ou partiels. Par exemple, si nous appuyons sur la touche du milieu C du piano, les fréquences individuelles des harmoniques du composite commenceront à 261,6 Hz comme fréquence fondamentale, 523 Hz serait le 2e harmonique, 785 Hz serait le 3e harmonique, 1046 Hz serait être le 4e harmonique, etc. Les harmoniques ultérieurs sont des multiples entiers de la fréquence fondamentale, 261,6 Hz (ex: 2 x 261,6 = 523, 3 x 261,6 = 785, 4 x 261,6 = 1046). En bas, se trouve un instantané des harmoniques réelles qui se produisent lors d'un enregistrement polyphonique MP3 d'un solo de guitare.
Au lieu d'une FFT, j'utilise une transformation DFT modifiée, avec un espacement logarithmique des fréquences, pour détecter d'abord ces harmoniques possibles en recherchant des fréquences avec des niveaux de crête (voir schéma ci-dessous). En raison de la façon dont je collecte des données pour mon journal DFT modifié, je n'ai PAS à appliquer une fonction de fenêtrage au signal, ni à ajouter et à chevaucher. Et j'ai créé la DFT pour que ses canaux de fréquence soient logarithmiquement situés afin de s'aligner directement avec les fréquences où les harmoniques sont créées par les notes d'une guitare, d'un saxophone, etc.
Maintenant à la retraite, j'ai décidé de publier le code source de mon moteur de détection de hauteur dans une application de démonstration gratuite appelée PitchScope Player . PitchScope Player est disponible sur le Web, et vous pouvez télécharger l'exécutable pour Windows pour voir mon algorithme à l'oeuvre sur un fichier mp3 de votre choix. Le lien ci-dessous vers GitHub.com vous mènera à mon code source complet où vous pouvez voir comment je détecte les harmoniques avec une transformation logarithmique DFT personnalisée, puis rechercher des partiels (harmoniques) dont les fréquences satisfont la relation entière correcte qui définit un ' pas'.
Mon algorithme de détection de hauteur est en fait un processus en deux étapes: a) Tout d'abord ScalePitch est détecté ('ScalePitch' a 12 valeurs de hauteur possibles: {E, F, F #, G, G #, A, A #, B, C, C #, D, D #}) b) et une fois ScalePitch déterminé, alors l'octave est calculé en examinant toutes les harmoniques pour les 4 notes Octave-Candidate possibles. L'algorithme est conçu pour détecter la hauteur la plus dominante (une note de musique) à un moment donné dans un fichier MP3 polyphonique. Cela correspond généralement aux notes d'un solo instrumental. Les personnes intéressées par le code source C++ pour mon algorithme de détection de hauteur en deux étapes voudront peut-être commencer par la fonction Estimate_ScalePitch () dans le fichier SPitchCalc.cpp sur GitHub.com. https://github.com/CreativeDetectors/PitchScope_Player
Ci-dessous, l'image d'un DFT logarithmique (créé par mon logiciel C++) pendant 3 secondes d'un solo de guitare sur un enregistrement mp3 polyphonique. Il montre comment les harmoniques apparaissent pour des notes individuelles sur une guitare, tout en jouant un solo. Pour chaque note de cette DFT logarithmique, nous pouvons voir ses multiples harmoniques s'étendre verticalement, car chaque harmonique aura la même largeur de temps. Une fois l'octave de la note déterminée, nous connaissons la fréquence de la fondamentale.
J'ai eu un problème similaire avec l'entrée microphone sur un projet que j'ai fait il y a quelques années - s'est avéré être dû à un décalage DC.
Assurez-vous de supprimer tout biais avant d'essayer la FFT ou toute autre méthode que vous utilisez.
Il est également possible que vous rencontriez des problèmes d'espace libre ou d'écrêtage.
Les graphiques sont le meilleur moyen de diagnostiquer la plupart des problèmes audio.
Jetez un œil à cet exemple d'application:
http://www.codeproject.com/KB/audio-video/SoundCatcher.aspx
Je me rends compte que l'application est en C # et vous avez besoin de C++, et je me rends compte que c'est .Net/Windows et vous êtes sur un mac ... Mais je pensais que son implémentation FFT pourrait être un point de référence de départ. Essayez de comparer votre implémentation FFT à la sienne. (Il s'agit de la première version itérative de la FFT de Cooley-Tukey). Sont-ils similaires?
En outre, le comportement "aléatoire" que vous décrivez peut être dû au fait que vous saisissez directement les données renvoyées par votre carte son sans assembler correctement les valeurs du tableau d'octets. Avez-vous demandé à votre carte son d'échantillonner des valeurs 16 bits, puis lui avez-vous donné un tableau d'octets pour stocker les valeurs? Si tel est le cas, n'oubliez pas que deux octets consécutifs dans le tableau renvoyé constituent un échantillon audio 16 bits.
Découvrez aubio , et la bibliothèque open source qui comprend plusieurs méthodes de pointe pour le suivi du pitch.
Le code Java pour un détecteur réel en temps réel est disponible sur http://code.google.com/p/freqazoid/ .
Il fonctionne assez bien sur tout ordinateur exécutant Java en temps réel après 2008. Le projet a été abandonné et pourrait être repris par toute partie intéressée. Contactez-moi si vous souhaitez plus de détails.
J'ai posé une question similaire ici:
ÉDITER:
Performous contient un module C++ pour la détection de hauteur en temps réel
Aussi Yin Algorithme de Pitch-Tracking
Pouvez-vous adapter quoi que ce soit des accordeurs d'instruments? Mon accordeur de guitare délicieusement compact est capable de détecter assez bien la hauteur des cordes. Je vois cette référence à un accordeur de piano qui explique un algorithme dans une certaine mesure.