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
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.
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:
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):
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?
la source
Réponses:
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]
floor()
fonction et, si est pair alors .⌊ kMaintenant, 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 NN→ ∞ N N
Considérons maintenant cette "autocorrélation" de longueur finie (au voisinage de l'échantillon ) définie à partir de l'ASDF:x [ n0]
où
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] = 0 QX[ k , n0] ≥ 0 k RX[ 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 ] P P
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]=0 Rx[mP,n0]=Rx[0,n0]≥Rx[k,n0] m k P x [ n ] x [ n ] k = 0 k = P Pk=0 k P x[n] x[n] k=0 k=P P
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] n0 N Rx[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=n0 Rx[k,n0] Rx[0,n0] x[n] Rx[P,n0]=Rx[0,n0] x[n+P]=x[n] x[n] P P Rx[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] P k Rx[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.k k
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] k k=2P k=P
Donc, si était parfaitement périodique avec la période , et en ignorant les problèmes d'interpolation pour non entier , alorsx[n] P P
mais
Le facteur par lequel le pic pour une hauteur d'une octave inférieure est réduit est le rapport
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α
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.α
la source
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.
la source