Détection de hauteur humaine en temps réel

11

J'essaie de mettre en œuvre un jeu de chant qui analysera les entrées micro brutes et dira au joueur à quel point il chante. Cela doit être fait en temps réel.

J'ai rencontré beaucoup de discussions posant la même question, mais je n'en ai pas encore assez fini, probablement en raison de mon manque d'expérience dans le domaine et de mes connaissances en mathématiques superficielles. J'ai implémenté un algorithme basé sur l'article du pitch pitch du site DSPDimension: http://www.dspdimension.com/admin/pitch-shifting-using-the-ft/

J'extrait la vraie fréquence et l'amplitude comme l'explique l'article, mais je ne sais pas trouver la fréquence fondamentale avec cela. J'ai essayé d'obtenir le bin avec la plus grande ampleur mais cela ne me donne que de bons résultats pour des signaux de hauteur plus élevée, peu importe le facteur de suréchantillonnage que j'utilise, j'obtiens toujours de mauvaises données pour les signaux à basse fréquence. Cette approche est-elle complètement fausse ou suis-je sur la bonne voie, mais je manque quelque chose?

Merci d'avance,

EDIT: J'ai oublié de mentionner que je ne suis intéressé que par la classe de pitch, donc c'est ok si le fondamental manque, mais j'ai une forte tonalité dans l'échantillon.

EDIT2: Merci à tous, je viens de terminer une version de l'algorithme qui fonctionne comme un charme. Le problème d'estimation de faible hauteur était dû à mon test d'entrée. Quand j'ai chanté la note, elle correspondait correctement. De plus, je considère maintenant toutes les harmoniques, pas seulement le pic le plus élevé.

Felipe Lira
la source
Wikipédia a quelques informations.
Emre

Réponses:

9

J'ai essayé d'obtenir le bin avec la plus grande ampleur mais cela ne me donne que de bons résultats pour des signaux de hauteur plus élevée, peu importe le facteur de suréchantillonnage que j'utilise, j'obtiens toujours de mauvaises données pour les signaux à basse fréquence.

C'est parce que les harmoniques sont plus grandes que les fondamentales. Tracez votre spectre et vous verrez. Une meilleure méthode pour trouver le véritable fondamental est l'autocorrélation. Ensuite, vous "glissez" la forme d'onde au-delà d'elle-même et trouvez des retards auxquels la forme d'onde s'aligne avec elle-même.

http://www.phon.ucl.ac.uk/courses/spsci/matlab/lect10.html

Voulez-vous vraiment qu'ils chantent la note exacte, ou est-ce correct s'ils chantent une octave au-dessus ou en dessous en fonction de leur registre vocal?

endolith
la source
Tu as raison, j'ai oublié de mentionner que je ne m'intéresse qu'aux cours de pitch. J'utilise ce site Web pour tester mon outil: Seventhstring.com/tuningfork/tuningfork.html . Pour l'entrée de A (220 Hz), elle renvoie E (660 Hz) comme classe de hauteur trouvée. J'ai jeté un œil au sprectum et le 220Hz est bien là, mais avec une ampleur moindre que le 660Hz. Après avoir filtré les valeurs inférieures à une amplitude minimale et des fréquences de plafonnement dans la plage souhaitée, le sprectum que j'en retiens a 4 pics. [pic, mag] = [220, 0,0203], [618, 0,0142], [660, 0,0668], [703, 0,0497].
Felipe Lira
Je viens de me faire penser que je devrais peut-être prendre en compte le décalage de phase lors du calcul de l'amplitude, tout comme je le fais pour obtenir la vraie fréquence. Cela a-t-il du sens? Ce que je veux dire, c'est que si j'ai un décalage de phase d'environ 90 ° pour un bac, le "pic" serait à une magnitude de 0, n'est-ce pas?
Felipe Lira
@elipedrl: Vous écrivez donc essentiellement un accordeur de guitare. :) Si je comprends bien, ils filtre passe-bas pour nettoyer la forme d'onde et puis compter les pics pour obtenir la hauteur. electronicdesign.com/article/articles/… aboutmicrocontroller.blogspot.com/2008/04/… Il existe de meilleures façons, cependant, si vous optez
endolith
@elipedrl: Le décalage de phase pour un bac ne devrait pas être pertinent pour la hauteur. Chaque casier est un nombre complexe, et vous êtes intéressé par la valeur absolue ou l'ampleur de ce nombre. en.wikipedia.org/wiki/Absolute_value#Complex_numbers
endolith
1
et s'il vous arrive d'avoir 2 FFT plus courtes pour une raison quelconque (latence, quanta de temps, etc.), un calcul de vocodeur de phase est moins de calcul que de faire encore une autre FFT plus longue et de l'interpoler.
hotpaw2
6

Oui, l'utilisation d'un estimateur de fréquence de crête pour la hauteur est incorrecte. La hauteur tonale est un phénomène psychoacoustique, la détection ou l'estimation de la hauteur tonale est donc différente de l'estimation de fréquence. Il y a eu beaucoup de méthodes d'estimation de la hauteur données dans les réponses précédentes à des questions similaires ici. Il y a plus d'un choix.

En voici un: /programming/4227420/matlab-missing-fundamental-from-an-fft/4231322#4231322 , et un autre: Conseils pour améliorer la détection de la hauteur

AJOUT # 1: Des questions similaires à celle-ci sont posées 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- fréquence.html

hotpaw2
la source
J'ai mis à jour la question avec l'information que je ne suis intéressé que par la classe de pitch. J'espère vraiment que la FFT avec un post-traitement est suffisante pour cela, je suis très en retard sur mon calendrier et changer l'approche serait horrible pour moi.
Felipe Lira
@elipedrl: FFT devrait alors fonctionner. Obtenir plusieurs pics, puis sélectionner intelligemment l'un d'entre eux devrait être suffisant. N'oubliez pas que les pics valides seront proches (mais pas exactement) des multiples entiers du fondamental, contrairement aux pics parasites. Vous devez éviter de sélectionner des pics parasites et éviter de sélectionner la 3e harmonique, etc. qui ne se trouve pas à une octave de la note que vous recherchez.
endolith
Il est possible, quoique peut-être peu probable, qu'aucun pic de fréquence ne soit à la fréquence de hauteur musicale. Certaines voyelles masculines peuvent être proches de cela, il ne reste que des harmoniques élevées après filtrage par le formant vocalique.
hotpaw2
La méthode du spectre de produits harmoniques peut convenir pour trouver une estimation LCD du plus petit dénominateur commun d'un groupe de pics spectraux, en post-traitant les résultats FFT initiaux.
hotpaw2