Conseils pour améliorer la détection de la hauteur

21

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.

Valentin Radu
la source

Réponses:

20

Je suppose que les autres fréquences qu'il obtient sont des harmoniques du fondamental? Comme si vous jouiez à 100 Hz et qu'il choisit à la place 200 Hz ou 300 Hz? Tout d'abord, vous devez limiter votre espace de recherche aux fréquences qu'une guitare est susceptible d'être. Trouvez le fondamental le plus élevé dont vous aurez probablement besoin et limitez-vous à cela.

L'autocorrélation fonctionnera mieux que la FFT pour trouver le fondamental, si le fondamental est plus faible en amplitude que les harmoniques (ou complètement absent, mais ce n'est pas un problème avec la guitare):

entrez la description de l'image ici

Vous pouvez également essayer de pondérer les fréquences les plus basses pour souligner les fondamentaux et minimiser les harmoniques, ou utiliser un algorithme de pic de sélection comme celui-ci , puis choisir la fréquence la plus basse.

De plus, vous devez fenêtrer votre signal avant d'appliquer la FFT. Vous venez de le multiplier par une fonction de fenêtre , qui effile le début et la fin de la forme d'onde pour rendre le spectre de fréquences plus propre. Ensuite, vous obtenez de grands pics étroits pour les composants de fréquence au lieu de larges.

Vous pouvez également utiliser l'interpolation pour obtenir un pic plus précis. Prenez le logarithme du spectre, puis ajustez une parabole au pic et aux deux points voisins, et trouvez le vrai pic de la parabole. Cependant, vous n'aurez peut-être pas besoin de cette précision.

Voici mon exemple de code Python pour tout cela .

endolith
la source
C'est ce que je cherchais, très bonne réponse, merci!
Valentin Radu
2
La multiplication par une fonction de fenêtre effilée étalera en fait toutes les raies spectrales de votre signal, les rendant ainsi plus larges. Ce qu'il peut vous acheter, cependant, c'est une plage dynamique, vous permettant d'identifier, par exemple, une raie spectrale de très faible puissance en présence d'une tonalité interférente de haute puissance.
Jason R
@JasonR étant donné que cela est conçu pour fonctionner dans un environnement dans lequel la probabilité d'une ou plusieurs tonalités interférentes de haute puissance est vraiment faible, suggérez-vous qu'il vaut mieux ne pas utiliser de fenêtre Hamming?
Valentin Radu
1
Je peux confirmer que l'utilisation d'une fenêtre de Hamming m'a rapproché de mon objectif de garder les lectures stables. À l'heure actuelle, lorsque je joue sur un A4, j'obtiens 440 Hz la plupart du temps et ce n'est que très rare que j'obtiens une lecture rapprochée comme 650 Hz environ. Je suppose que ce sont des harmoniques? De plus, je n'ai pas pu m'empêcher de remarquer que pour une fréquence plus élevée, l'application fonctionne parfaitement et que pour une fréquence plus basse, elle commence à échouer. Probablement parce que j'utilise la FTT pour détecter la fréquence de crête de magnitude et pour des fréquences plus basses qui ne sont pas toujours fondamentales?
Valentin Radu
1
@mindnoise: 660 Hz n'est pas une harmonique de 440 Hz, mais c'est une harmonique de 220 Hz, ou une cinquième parfaite au-dessus de 440. Pourrait-il y avoir une autre corde résonnant ou distorsion ou quelque chose? Il est beaucoup plus facile de comprendre des problèmes comme celui-ci si vous pouvez tracer la FFT et la regarder. Oui, les basses fréquences peuvent être filtrées et réduites par rapport aux plus hautes, soit par des effets mécaniques, soit par vos circuits analogiques.
endolith
12

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

hotpaw2
la source
vient de visiter (et de commenter) le blog auquel vous venez de nous référer.
robert bristow-johnson
5

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.

entrez la description de l'image ici

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.

entrez la description de l'image ici

James Paul Millard
la source
James, votre détecteur de hauteur tonale DFT détecte-t-il des notes avec un fondamental manquant (ou faible)?
robert bristow-johnson
Oui, mon algorithme de détection de hauteur en 2 étapes détectera les notes, même si le signal a une fondamentale "manquante (ou faible)" - c'est une grande force de ce processus en 2 étapes. L'essentiel est déterminé dans la deuxième étape lorsque la détection d'octave est effectuée sur les intervalles de temps que vous voyez pour les notes sur le diagramme DFT logarithmique. Étant donné que cette fonction de détection de hauteur fonctionne dans la confusion d'un signal mp3 polyphonique, elle détectera les notes qui manquent de nombreuses harmoniques, y compris la fondamentale. Je viens d'ajouter à cette réponse un deuxième diagramme qui explique mon algorithme de détection d'octave.
James Paul Millard