Comment la taille de la fenêtre et la fréquence d'échantillonnage influencent-elles l'estimation du pas FFT?

8

J'essaie de créer un programme de détection de hauteur qui extrait les fréquences des pics dans un spectre de puissance obtenu à partir d'une FFT ( fftpack). J'extrais les fréquences de crête de mon spectre en utilisant le premier estimateur de Quinn pour interpoler entre les nombres de cases. Ce schéma semble bien fonctionner sous certaines conditions. Par exemple, en utilisant une fonction de fenêtre rectangulaire avec une taille de fenêtre de 1024 et un taux d'échantillonnage de 16000, mon algorithme identifie correctement la fréquence d'un ton A440 purcomme 440,06 avec une deuxième fréquence partielle de 880,1. Cependant, dans d'autres conditions, cela produit des résultats inexacts. Si je change la fréquence d'échantillonnage (par exemple à 8000) ou la taille de la fenêtre (par exemple à 2048), il identifie toujours correctement le premier partiel comme 440, mais le second partiel se situe quelque part autour de 892. Le problème devient encore pire pour les tons inharmoniques comme ceux produit par une guitare ou un piano.

Ma question générale est: de quelle manière la fréquence d'échantillonnage, la taille de la fenêtre et la fonction de la fenêtre affectent-elles l'estimation de fréquence des pics FFT? Mon hypothèse était que le simple fait d'augmenter la résolution du spectre augmenterait la précision de l'estimation de la fréquence de crête, mais ce n'est clairement pas mon expérience (le remplissage nul n'aide pas non plus). Je suppose également que le choix de la fonction de fenêtre n'aura pas beaucoup d'effet car les fuites spectrales ne devraient pas changer l' emplacement du pic (bien que, maintenant que j'y pense, les fuites spectrales pourraient potentiellement influencer l'estimation de fréquence interpolée si les amplitudes des bacs adjacents à les pics sont artificiellement augmentés par les fuites d'autres pics ...).

Des pensées?

willpett
la source

Réponses:

8
  1. Utiliser une fenêtre gaussienne - la transformée de Fourier d'une gaussienne est une gaussienne
  2. Échelle logarithmique du spectre pour accentuer les pics et transformer les pics gaussiens en pics paraboliques
  3. Utilisez l'interpolation parabolique pour trouver les vrais pics.

Notez que, comme mentionné au §D.1, l'amplitude de la transformation de fenêtre gaussienne est précisément une parabole à l'échelle dB. Par conséquent, l'interpolation du pic spectral quadratique est exacte sous la fenêtre gaussienne. Bien sûr, nous devons en quelque sorte supprimer les queues infiniment longues de la fenêtre gaussienne dans la pratique, mais cela ne provoque pas beaucoup de déviation par rapport à une parabole, comme le montre la Fig.3.30.

https://ccrma.stanford.edu/~jos/sasp/Quadratic_Interpolation_Spectral_Peaks.html

entrez la description de l'image ici

J'évalue 1000.000004 Hz pour une forme d'onde de 1000 Hz de cette façon: https://gist.github.com/255291#file_parabolic.py

Si vous rencontrez des problèmes, tracez le spectre et utilisez vos yeux pour voir pourquoi cela ne fonctionne pas.

endolith
la source
2
Je vous remercie! Cela est parfaitement logique. Le log d'un gaussien est une parabole, donc l'interpolation parabolique des pics dans un spectre de log à fenêtre gaussienne est presque exacte. Après avoir implémenté cela, j'obtiens des estimations de fréquence de crête FFT cohérentes sur différentes fréquences d'échantillonnage et tailles de fenêtre. Huzzah!
willpett
@ will.pett: Alors peut-être que le problème a été causé par "Quinn's First Estimator" plus que par la FFT?
endolith
Je ne pense pas que la méthode d'interpolation soit entièrement à blâmer car l'interpolation quadratique m'a également donné de mauvais résultats avec certaines fonctions de fenêtre et fréquences d'échantillonnage. Je pense que c'était la combinaison des paramètres ci-dessus qui était importante. Je n'utilisais pas la fonction de fenêtre appropriée et je n'avais pas transformé mon spectre de façon logarithmique. Je parie que la chose la plus importante était la transformation du journal. Protocole probablement standard que je ne connaissais pas.
willpett
@endolith, merci, j'ai compris (des questions peuvent suivre)
denis
3

Premièrement, l'estimation de la fréquence de crête et l'estimation de la hauteur sont deux choses différentes. Le pitch est un phénomène psycho-acoustique. Les gens peuvent entendre une hauteur même avec la fréquence fondamentale complètement manquante, ou relativement faible par rapport à la plupart des autres pics, comme dans les notes graves produites par certains instruments.

Deuxièmement, l'utilisation d'aucune fenêtre sur une FFT équivaut à l'utilisation d'une fenêtre rectangulaire, qui convolue votre spectre avec la fonction Sinc. La fonction Sinc a beaucoup de bosses réparties loin du pic qui apparaîtra pour toutes les fréquences qui ne sont pas exactement périodiques dans la longueur de la FFT (également connue sous le nom de "fuite spectrale"). Toutes ces fuites d'énergie d'une fréquence forte interfèrent avec l'estimation de position d'autres pics de fréquence. Une fonction de fenêtre plus appropriée (Hamming ou von Hann) pourrait donc aider à réduire cette interférence entre les pics.

Une FFT plus longue réduira la fréquence delta entre les centres de cellules, ce qui devrait augmenter l'interpolation et donc la précision d'estimation de fréquence pour les spectres stationnaires. Cependant, si la FFT est si longue que le spectre change dans la fenêtre FFT, toutes ces fréquences modifiées seront floues ensemble dans une FFT plus longue.

hotpaw2
la source
1

Vous avez certainement besoin d'une fonction de fenêtre appropriée - les effets des fuites spectrales varient considérablement en fonction de la façon dont la période de pitch et la longueur de la fenêtre FFT sont liées - si vous obtenez un grand transitoire entre le dernier et le premier échantillon de la fenêtre FFT, cela produira un effet très désagréable étalement du spectre, alors que si vous avez de la chance et que cette discontinuité est petite, le spectre résultant sera beaucoup plus propre. C'est probablement pourquoi vous voyez des incohérences lorsque vous modifiez l'un de vos paramètres tels que la taille FFT. Avec une fonction de fenêtre appropriée, vous obtiendrez un spectre cohérent à mesure que la hauteur change.

Paul R
la source
J'ai maintenant essayé différentes fonctions de fenêtre (Hamming, Blackman-Harris, Gauss, Weedon-Gauss) et toutes me donnent des résultats extrêmement inexacts dans toutes les conditions de fréquence d'échantillonnage / taille de fenêtre (par exemple, estimation de la première fréquence partielle à 460, 488, et autres). Seule une fenêtre rectangulaire a pu identifier correctement un pic à 440 Hz. Fait intéressant, ce pic est largement invariant avec différentes combinaisons de taux d'échantillonnage / taille de fenêtre dans une fenêtre rectangulaire, bien que le second partiel soit toujours variable. Comment concilier ces résultats avec vos conseils?
En remarque, j'utilise également un algorithme d'autocorrélation pour comparer avec la FFT. Cette méthode (qui est indépendante de la fonction fenêtre) donne ~ 440,4 Hz pour la tonalité wikipedia, tandis que la méthode FFT donne presque exactement 440 sans fonction fenêtre. Je me rends compte que l'autocorrélation ne permet pas d'estimer directement la première fréquence partielle, mais plutôt le "pitch" psychoacoustique, mais c'est quand même intéressant à comparer. En expérimentant avec des sons de piano, j'ai remarqué que la méthode d'autocorrélation surestime systématiquement la première fréquence partielle par rapport à la méthode FFT.
1
Il est difficile de deviner quels pourraient être les problèmes sans voir le code, etc. Avez-vous essayé de tracer le spectre de puissance pour voir à quoi ressemblent les pics avec / sans fonction de fenêtre? Cela devrait non seulement vous dire si votre fenêtrage / FFT / etc. se comporte correctement, mais peut également vous donner une idée de la raison pour laquelle votre algorithme d'estimation de hauteur donne les résultats qu'il fait.
Paul R
C'est bizarre, car les fonctions de fenêtre produisent en effet des spectres plus propres, avec peu de bavures. Cependant, les estimations des fréquences de crête ne sont pas correctes. Lorsque j'utilise les paramètres qui me donnent 440 Hz sans fenêtrage, puis que je passe à une fenêtre de Hamming, j'obtiens 444,6 Hz. Avec une fenêtre Blackman-Harris, j'obtiens 460,9 Hz, et avec une fenêtre gaussienne j'obtiens 446,4 Hz. Est-il possible que les méthodes d'interpolation de pointe fassent des hypothèses implicites sur la fonction de fenêtre que je violerais?
willpett
Je ne connais pas vraiment les méthodes d'interpolation dans l'article auquel vous vous connectez - elles semblent utiliser à la fois des informations de magnitude et de phase plutôt que simplement de magnitude, mais je n'aurais pas pensé que le fenêtrage aurait un impact significatif sur la phase.
Paul R