Je travaille sur une application web simple qui permet à l'utilisateur de régler sa guitare. Je suis un vrai débutant dans le traitement du signal, alors ne jugez pas trop si ma question est inappropriée.
J'ai donc réussi à obtenir la fréquence fondamentale à l'aide d'un algorithme FFT et à ce stade, l'application est en quelque sorte fonctionnelle. Cependant, il y a place à amélioration, en ce moment j'envoie du pcm brut à l'algorithme FFT, mais je pensais qu'il y avait peut-être des algorithmes / filtres pré / post qui pourraient améliorer la détection. Pouvez-vous en suggérer?
Mon problème principal est que lorsqu'il détecte une certaine fréquence, il montre cette fréquence pendant 1-2 secondes, puis saute sur d'autres fréquences aléatoires et revient encore et ainsi de suite, même si le son est continu.
Je suis également intéressé par tout autre type d'optimisation si l'on a de l'expérience avec de telles choses.
la source
Le pas n'est pas le même que le casier de fréquence de magnitude maximale d'une FFT. Le pitch est un phénomène psycho-acoustique humain. Le son de hauteur pourrait avoir un fondamental manquant ou très faible (commun à certains sons de voix, de piano et de guitare) et / ou beaucoup d'harmoniques puissantes dans son spectre qui submergent la fréquence de hauteur (mais toujours entendu comme cette note de hauteur par un humain) . Ainsi, tout détecteur de fréquence de crête FFT (même en incluant un fenêtrage et une interpolation) ne sera pas une méthode robuste d'estimation de la hauteur.
Cette question de stackoverflow comprend une liste de quelques méthodes alternatives d'estimation de la hauteur qui pourraient produire de meilleurs résultats.
AJOUT: Si vous faites cela pour les sons de guitare, notez que les cordes de guitare les plus basses peuvent en fait produire des harmoniques légèrement inharmoniques, ce qui rend l'estimation de la hauteur encore plus difficile, car l'oreille humaine peut entendre une fréquence de hauteur plus proche des sous-multiples des harmoniques , plutôt qu'à la fréquence de vibration fondamentale réelle de la corde.
AJOUT # 2: Cela se pose si souvent que j'ai rédigé un article de blog plus long sur le sujet: http://www.musingpaw.com/2012/04/musical-pitch-is-not-just-fft-frequency.html
la source
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.
la source