J'ai passé de nombreuses années à rechercher la détection de hauteur sur la musique polyphonique - comme la détection des notes d'un solo de guitare dans un enregistrement mp3. J'ai également écrit une section sur Wikipedia qui donne une brève description du processus (regardez la sous-section "Détection de hauteur" dans le lien ci-dessous).
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érentes fréquences liées mathématiquement. 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 C du milieu 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 quatrième 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).
J'utilise une transformation logarithmique DFT modifiée pour détecter d'abord les 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, le 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 après avoir déterminé ScalePitch, alors l' octave est calculée en examinant toutes les harmoniques pour les 4 notes possibles pour Octave-Candidate. 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. Ceux qui sont intéressés par le code source C ++ pour mon algorithme de détection de pas en 2 étapes pourraient vouloir commencer par la fonction Estimate_ScalePitch () dans le fichier SPitchCalc.cpp sur GitHub.com.
https://github.com/CreativeDetectors/PitchScope_Player
https://en.wikipedia.org/wiki/Transcription_(music)#Pitch_detection
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.
Le diagramme ci-dessous illustre l'algorithme de détection d'octave que j'ai développé pour choisir la bonne note Octave-Candidate (c'est-à-dire la bonne fondamentale), une fois que le ScalePitch de cette note a été déterminé. Ceux qui souhaitent voir cette méthode en C ++ devraient aller à la fonction Calc_Best_Octave_Candidate () à l'intérieur du fichier appelé FundCandidCalcer.cpp, qui est contenu dans mon code source sur GitHub.