Veuillez supposer ce qui suit:
- La fréquence du fondamental d'un signal a été estimée à l'aide de la FFT et de certaines méthodes d'estimation de fréquence et se situe entre deux centres de bin
- La fréquence d'échantillonnage est fixe
- L'effort de calcul n'est pas un problème
Connaissant la fréquence, quelle est la manière la plus précise d'estimer la valeur de crête correspondante des signaux fondamentaux?
Une façon pourrait être de mettre à zéro le signal temporel pour augmenter la résolution FFT de sorte que le centre du bac soit plus proche de la fréquence estimée. Dans ce scénario, un point dont je ne suis pas sûr est de savoir si je peux mettre à zéro autant que je veux ou s'il y a des inconvénients à le faire. Un autre est le centre du bac que je devrais sélectionner après un remplissage nul comme celui dont j'obtiens la valeur de crête (car on ne peut pas atteindre la fréquence d'intérêt exactement, même après un remplissage nul).
Cependant, je me demande également s'il existe une autre méthode qui peut donner de meilleurs résultats, par exemple un estimateur qui utilise les valeurs de crête des deux centres de cellules environnants pour estimer la valeur de crête à la fréquence d'intérêt.
imax
est le pic FFT) vous donnera des résultats précisRéponses:
Le premier algorithme qui me vient à l'esprit est l' algorithme de Goertzel . Cet algorithme suppose généralement que la fréquence d'intérêt est un multiple entier de la fréquence fondamentale. Cependant, cet article applique l'algorithme (généralisé) au cas qui vous intéresse.
Un autre problème est que le modèle de signal est incorrect. Il utilise
2*%pi*(1:siglen)*(Fc/siglen)
. Il devrait utiliser2*%pi*(0:siglen-1)*(Fc/siglen)
pour que la phase sorte correctement.Je pense aussi qu'il y a un problème avec la fréquence
Fc=21.3
très basse. Les signaux à basse fréquence à valeur réelle ont tendance à présenter un biais lorsqu'il s'agit de problèmes d'estimation de phase / fréquence.J'ai également essayé une recherche de grille grossière pour l'estimation de phase, et elle donne la même réponse que l'algorithme de Goertzel.
Vous trouverez ci-dessous un graphique qui montre le biais dans les deux estimations (Goertzel: bleu, grossier: rouge) pour deux fréquences différentes:
Fc=21.3
(solide) etFc=210.3
(en pointillés). Comme vous pouvez le voir, le biais pour la fréquence plus élevée est beaucoup moins.la source
Si vous êtes prêt à utiliser plusieurs bacs FFT voisins, pas seulement 2, l'interpolation Sinc fenêtrée entre les résultats de bac complexes peut produire une estimation très précise, en fonction de la largeur de la fenêtre.
L'interpolation Windinc Sinc se trouve couramment dans les suréchantillonneurs audio de haute qualité, de sorte que les articles sur ce sujet auront des formules d'interpolation appropriées avec analyse des erreurs.
la source
[1] JL Flanagan et RM Golden, «Phase vocoder», Bell Systems Technical Journal, vol. 45, p. 1493-1509, 1966.
[2] K. Dressler, «Extraction sinusoïdale utilisant une implémentation ef fi cace d'une FFT multi-résolution», dans Proc. 9th Int. Conf. sur les effets audio numériques (DAFx-06), Montréal, Canada, sept. 2006, pp. 247–252.
la source
Une méthode consiste à trouver le maximum et à ajuster une parabole à ce sujet, puis à utiliser le maximum de la parabole comme estimation de fréquence et d'amplitude. Vous pouvez tout lire ici: https://ccrma.stanford.edu/~jos/sasp/Sinusoidal_Peak_Interpolation.html
la source
J'ai eu beaucoup de difficultés avec ce problème il y a quelques années.
J'ai posté cette question:
/programming/4633203/extracting-precise-frequencies-from-fft-bins-using-phase-change-between-frames
J'ai fini par faire les calculs à partir de zéro et j'ai posté une réponse à ma propre question.
Je suis surpris de n'avoir pu trouver aucune exposition similaire sur Internet.
Je posterai à nouveau la réponse ici; notez que le code est conçu pour un scénario dans lequel je chevauche ma fenêtre FFT de 4x.
π
Ce puzzle prend deux clés pour le déverrouiller.
La première clé est de comprendre comment le chevauchement de la fenêtre FFT introduit une rotation sur la phase bin.
La deuxième clé provient des graphiques 3.3 et 3.4 ici (merci à Stephan Bernsee pour la permission de copier les photos ici).
Graphique 3.3:
Graphique 3.4:
Code:
la source
Ce code python vous donnera un résultat très précis (je l'ai utilisé pour beaucoup de notes de musique et obtenu des erreurs inférieures à 0,01% de demi-ton) avec interpolation parabolique (méthode utilisée avec succès par McAulay Quatieri, Serra, etc. en harmonique + résiduel techniques de séparation)
la source
Les fréquences que vous traitez (21,3 Hz échantillonnés à 8 kHz) sont très basses. Parce que ce sont des signaux à valeur réelle, ils présenteront un biais dans l'estimation de phase pour ** n'importe quelle ** fréquence.
Cette image montre un tracé du biais (
phase_est - phase_orig
) pourFc = 210.3;
(en rouge) par rapport au biais pourFc = 21.3;
. Comme vous pouvez le voir, le décalage est beaucoup plus important pour le21.3
cas.Une autre option consiste à réduire votre taux d'échantillonnage. La courbe verte montre le biais pour
Fs = 800
au lieu de8000
.la source
goertzel = atan(imag(y(2)),real(y(2)))*180/%pi + 90;
. :-) Va creuser un peu plus. Surveillez cet endroit.p
parp2 = (abs(y(3)) - abs(y(1)))/(2*(2*abs(y(2)) - abs(y(3)) - abs(y(1)))); phase2 = y0 - 0.25*(ym1-yp1)*p2;
alors vous obtenez BEAUCOUP de meilleures réponses --- même pourFc=210
. Je ne suis pas du tout sûr que la version actuelle dep
vous donnera quelque chose de sensé. La formule d'interpolation est pour l'interpolation de l'AMPLITUDE d'une parabole, maisp
interpole la phase qui est juste ... bizarre.p = (yp1 - ym1)/(2*(2*y0 - yp1 - ym1))
) sera incorrect parfois si vous utilisez des PHASES au lieu des amplitudes. En effet, les phases peuvent sauter autour de la limite de +/- 180 degrés. Tout ce qui est nécessaire pour le corriger pour la phase est de changer cette ligne pour monp2
calcul ci-dessus.