Comment gérer les fondamentaux faibles lors de l'utilisation d'AMDF pour l'extraction de pitch?

11

J'utilise la fonction de différence d'amplitude moyenne pour estimer la fréquence fondamentale d'un signal audio quasi-périodique. L'AMDF est défini comme

Dn=1Nnk=nN1|SkSkn|

où est la longueur du signal. Cette fonction présente un minimum lorsque le signal est décalé d'une quantité égale à sa période.N

Voici le code que j'utilise pour extraire le pitch (dans Matlab):

 a = amdf(f);
 a = a/max(a);
 [p l] = findpeaks(-a, 'minpeakprominence', 0.6);
 pitch = round(sample_freq/l(1);

Cependant, j'ai affaire à un signal audio où la fréquence fondamentale est très basse:

spectre du signal audio

En conséquence, un problème de doublage de hauteur se pose: le minimum détecté correspond à la moitié de la période du signal (ie la deuxième harmonique):

AMDF du signal ci-dessus

J'ai essayé d'extraire le plus grand pic et pas seulement le premier, mais parfois ce problème persiste. Comment puis-je améliorer mon code et / ou la fonction AMDF pour faire face aux bas fondamentaux?

firion
la source
La psycho-acoustique et la perception humaine influencent l'incertitude perçue de la hauteur et de l'octave. Il peut nécessiter une expérimentation pour déterminer dans quelles conditions le plus grand pic AMDF fait une différence audible.
hotpaw2
vos fréquences sont-elles basses? y a-t-il un exemple à écouter?
ederwander

Réponses:

10

C'est ce que nous appelons le biz de détection de hauteur, le " problème d'octave ".

Tout d'abord, je changerais l'AMDF en ASDF. Et je ne réduirais pas la taille de la fenêtre à mesure que le décalage augmente. (De plus, je change la notation pour ce que je considère comme plus conventionnel. " " est un signal à temps discret.)x[n]

La fonction de différence quadratique moyenne (ASDF) de au voisinage de l'échantillon x [ n 0 ] est:x[n]x[n0]

Qx[k,n0]1Nn=0N1(x[n+n0N+k2]  x[n+n0N+k2+k])2

est la floor()fonction et, si est pair alors .kkk2=k+12=k2

Maintenant, développez la place et d' examiner ce que les sommations ressemblent comme (pas que est va à l' infini, mais pour vous donner une idée si est grand). L'ASDF est directement lié à l'autocorrélation. Il s'agit essentiellement de l'autocorrélation renversée. Je vous laisse ces étapes. jetez un oeil à cette réponse.N NNN N

Considérons maintenant cette "autocorrélation" de longueur finie (au voisinage de l'échantillon ) définie à partir de l'ASDF:x[n0]

Rx[k,n0]=Rx[0,n0]12Qx[k,n0]

Rx[0,n0]1Nn=0N1(x[n+n0N2])2

Puisque et pour tous les décalages , cela signifie que pour tous les décalages .Q x [ k , n 0 ] 0 k R x [ k , n 0 ] R x [ 0 , n 0 ] kQx[0,n0]=0Qx[k,n0]0kRx[k,n0]Rx[0,n0]k

Supposons pendant une minute que soit périodique avec la période (et se trouve être un entier), puisP Px[n]PP

x[n+P]=x[n]n

et et pour tout nombre entier de périodes ( est un entier). Vous obtenez donc un pic à et à égal à tout autre multiple de si est périodique. Si n'est pas parfaitement périodique, ce à quoi nous pourrions nous attendre est le plus grand pic à , un autre pic (mais légèrement plus petit) à (la période que nous recherchons) et des pics progressivement plus petits pour des multiples plus grands de .R x [ m P , n 0 ] = R x [ 0 , n 0 ] R x [ k , n 0 ] mQx[mP,n0]=0Rx[mP,n0]=Rx[0,n0]Rx[k,n0]mk P x [ n ] x [ n ] k = 0 k = P Pk=0kPx[n]x[n]k=0k=PP

Le problème d'octave survient donc pour deux raisons. Tout d'abord, n'est pas nécessairement un entier. C'est un problème d'interpolation, pas grave. P

La deuxième raison et le problème le plus difficile est celui des sous - harmoniques . Considérez que vous écoutez une belle tonalité périodique à exactement A-440 Hz et cela ressemble à un A qui est 9 demi-tons au-dessus du milieu C. Supposons maintenant que quelqu'un ajoute à cette tonalité une très petite amplitude (comme vers le bas 60 dB) A -220? À quoi cela ressemblera-t-il et mathématiquement quelle est la "vraie" période?


Choisir le "bon" pic pour la période.

Supposons que vous exécutez votre note à travers un filtre de blocage DC, de sorte que la moyenne de soit nulle. Il s'avère que la moyenne de l'autocorrélation pour chaque également nulle (ou proche si est grand). Cela signifie que doit (sur ) pour être environ zéro, ce qui signifie qu'il y a autant d'aire au-dessus de zéro qu'en-dessous.x[n]Rx[k,n0]n0NRx[k,n0]k

D'accord, donc représente la puissance de au voisinage de et doit être non négatif. ne dépasse jamais mais peut devenir aussi grand que lorsque est périodique. si . Donc, si est périodique avec la période et que vous avez un tas de pics espacés par et que vous avez une idée de la hauteur de ces pics. Et si la composante continue de est nulle, cela signifie entre les pics, elle doit avoir des valeurs négatives.x [ n ] n = n 0 R x [ k , n 0 ] R x [ 0 ,Rx[0,n0]x[n]n=n0Rx[k,n0]Rx[0,n0]x[n]Rx[P,n0]=Rx[0,n0]x[n+P]=x[n]x[n]PPRx[k,n0]

Si était "quasi-périodique", un cycle de ressemblera beaucoup à un cycle adjacent, mais pas tellement à un cycle de plus bas dans le temps. Cela signifie que le premier pic sera plus élevé que le second à ou le troisième . On pourrait utiliser la règle pour toujours choisir le pic le plus élevé et s'attendre à ce que le pic le plus élevé soit toujours le premier. Mais, à cause de sous-harmoniques inaudibles, parfois ce n'est pas le cas. parfois le deuxième ou peut-être le troisième pic est oh-tellement-légèrement plus élevé. De plus, parce que la période n'est probablement pas un nombre entier d'échantillons mais dansx [ n ] x [ n ] R x [ P , n 0 ] R x [ 2 P , n 0 ]x[n]x[n]x[n]Rx[P,n0]Rx[2P,n0]Rx[3P,n0]PkRx[k,n0]est toujours un entier, donc le vrai pic sera probablement entre les valeurs entières de . Même si vous deviez interpoler où se trouve le pic lisse (ce que je recommande et l'interpolation quadratique est assez bonne), et à quel point il est vraiment entre l'entier , votre interpolation alg pourrait faire un pic légèrement plus haut ou légèrement plus bas qu'il ne l'est vraiment. Ainsi, le choix du pic le plus élevé peut entraîner un choix fallacieux du second sur le premier pic (ou vice versa) lorsque vous vouliez vraiment l'autre.kk

Donc, d'une manière ou d'une autre, vous devez handicaper les pics à l'augmentation de pour que le premier pic ait un léger avantage sur le second, et le second sur le quatrième (la prochaine octave vers le bas), etc. Comment faites-vous cela?k

Vous faites cela en multipliant avec une fonction décroissante de de telle sorte que le pic à est réduite par un facteur, par rapport à un pic identique à . Il s'avère que la fonction de puissance (pas l'exponentielle) fait cela. alors calculezRx[k,n0]kk=2Pk=P

kα Rx[k,n0]

Donc, si était parfaitement périodique avec la période , et en ignorant les problèmes d'interpolation pour non entier , alorsx[n]PP

Rx[2P,n0]=Rx[P,n0]

mais

(2P)αRx[2P,n0]=(2P)αRx[P,n0]<PαRx[P,n0]

Le facteur par lequel le pic pour une hauteur d'une octave inférieure est réduit est le rapport

(2P)αRx[2P,n0]PαRx[P,n0]=(2P)αPα=2α

Donc, si vous voulez donner à votre premier pic un boost de 1% par rapport au deuxième pic, ce qui signifie que vous ne choisirez pas le pitch comme étant le pitch sous-harmonique, à moins que l'autocorrélation de la hauteur du sub-harmonique soit au moins 1% plus élevée que la première pic, vous résoudriez pour deα

2α=0.99

C'est la manière cohérente de pondérer ou de désaccentuer ou de handicaper le pic correspondant à la hauteur subharmonique une octave plus bas.

Cela vous laisse toujours avec un problème de seuil. Vous devez bien choisir . Mais c'est une manière cohérente de souligner le premier pic par rapport au second, qui est une octave plus basse, mais pas tellement que si la note est vraiment une octave plus basse, mais l'énergie dans toutes les harmoniques paires était forte, par rapport à l'impaire harmoniques, cela laissera toujours la possibilité de choisir le deuxième pic.α

robert bristow-johnson
la source
1
Pour répondre à votre dernière question: si vous ajoutez une amplitude de 220 Hz, alors la hauteur sera de 220 Hz où 440 Hz est la première harmonique après la fondamentale (mathématiquement parlant). Mon cas est similaire mais il y a aussi des harmoniques plus élevées, donc le fondamental manquant n'est pas un problème d'un point de vue perceptuel. Je ne comprends pas comment le remplacement d'AMDF par ASDF pourrait résoudre le problème d'octave
firion
mais l'autre moitié de la question est * "à quoi cela ressemblera-t-il"? Répondez à cela et voyons ce que vous voulez que votre détecteur de hauteur fasse.
robert bristow-johnson
essayez de calculer et de tracer pour le même morceau de ton que vous avez fait pour l'AMDF. devrait ressembler à quelque chose comme l'AMDF à l'envers. Rx[k,n0]
robert bristow-johnson
Si vous n'avez pas d'autres harmoniques plus élevées mais juste celle de 440 Hz et que la tonalité de 220 Hz est suffisamment basse, vous entendrez une hauteur de 440 Hz. Au-dessus d'un certain niveau (je ne sais pas lequel), vous entendrez également la tonalité de 220 Hz et donc une hauteur de 220 Hz.
firion
il y a une raison pour laquelle j'ai dit -60 dB. maintenant que voulez-vous que votre détecteur de hauteur dise, que ce soit une note de 220 Hz ou 440 Hz ou autre chose?
robert bristow-johnson
0

Heuristiquement, la fréquence fondamentale de la parole vocale se situera dans l'intervalle [70, 400] Hz. Ainsi, la première étape serait d'appliquer un filtre passe-bande pour isoler approximativement cette bande.

Deuxièmement, vous pouvez appliquer une fonction de pondération au spectre de puissance. Près du fondamental, le poids devrait être proche de 1, tandis que plus près de la fin de la bande, le poids devrait être proche de 0. Cette pondération est bien sûr normalisée. Je recommanderais quelque chose de super linéaire: quadratique, quartique, etc. - pour vraiment tuer les octaves.

Le mec
la source
Comment appliquer le poids? Je ne sais pas où est le fondamental. De plus, mon signal est une note d'instrument, donc la plage est plus large
firion