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?
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.
la source
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.
la source