Wie beeinflussen Fenstergröße und Abtastrate die Schätzung der FFT-Tonhöhe?


8

Ich versuche, ein Tonhöhenerkennungsprogramm zu erstellen, das die Frequenzen von Spitzen in einem Leistungsspektrum extrahiert, das von einer FFT ( fftpack) erhalten wird. Ich extrahiere die Spitzenfrequenzen aus meinem Spektrum mit Quinns erstem Schätzer, um zwischen Bin-Nummern zu interpolieren. Dieses Schema scheint unter bestimmten Bedingungen gut zu funktionieren. Mit einer rechteckigen Fensterfunktion mit einer Fenstergröße von 1024 und einer Abtastrate von 16000 identifiziert mein Algorithmus beispielsweise die Frequenz eines reinen A440-Tons korrektals 440.06 mit einer zweiten Teilfrequenz von 880.1. Unter anderen Bedingungen führt es jedoch zu ungenauen Ergebnissen. Wenn ich die Abtastrate (z. B. auf 8000) oder die Fenstergröße (z. B. auf 2048) ändere, wird der erste Teil immer noch korrekt als 440 identifiziert, der zweite Teil liegt jedoch irgendwo bei 892. Das Problem wird für unharmonische Töne wie diese noch schlimmer produziert von einer Gitarre oder einem Klavier.

Meine allgemeine Frage lautet: Inwiefern beeinflussen Abtastrate, Fenstergröße und Fensterfunktion die Frequenzschätzung von FFT-Peaks? Meine Annahme war, dass eine einfache Erhöhung der Auflösung des Spektrums die Genauigkeit der Spitzenfrequenzschätzung erhöhen würde, aber dies ist eindeutig nicht meine Erfahrung (Null-Padding hilft auch nicht). Ich gehe davon aus , dass die Wahl der Fensterfunktion wird nicht viel Wirkung haben , weil Spektralleckage sollte nicht die Spitze ändern Lage (obwohl, jetzt, wo ich darüber nachdenke, was möglicherweise Spektralleckage neben dem interpolierten Frequenzschätzung , wenn die Größen der Behälter beeinflussen könnten Die Peaks werden durch Leckage von anderen Peaks künstlich erhöht ...).

Irgendwelche Gedanken?

Antworten:


8
  1. Verwenden Sie ein Gaußsches Fenster - die Fourier-Transformation eines Gaußschen ist ein Gaußscher
  2. Skalieren Sie das Spektrum logarithmisch, um Peaks hervorzuheben und die Gaußschen Peaks in parabolische Peaks umzuwandeln
  3. Verwenden Sie die parabolische Interpolation, um die wahren Peaks zu finden.

Beachten Sie, dass, wie in §D.1 erwähnt, die Größe der Gaußschen Fenstertransformation genau eine Parabel auf einer dB-Skala ist. Infolgedessen ist die quadratische spektrale Spitzeninterpolation unter dem Gaußschen Fenster genau . Natürlich müssen wir in der Praxis die unendlich langen Schwänze des Gaußschen Fensters irgendwie entfernen, aber dies führt nicht zu einer großen Abweichung von einer Parabel, wie in Abb. 3.30 gezeigt.

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

Geben Sie hier die Bildbeschreibung ein

Ich schätze 1000.000004 Hz für eine 1000-Hz-Wellenform folgendermaßen: https://gist.github.com/255291#file_parabolic.py

Wenn Sie Probleme haben, zeichnen Sie das Spektrum auf und verwenden Sie Ihre Augen, um zu sehen, warum es nicht funktioniert.


2
Vielen Dank! Das macht durchaus Sinn. Das Protokoll eines Gaußschen ist eine Parabel, daher ist die parabolische Interpolation der Peaks in einem Protokollspektrum mit Gaußschen Fenstern nahezu genau. Nachdem ich dies implementiert habe, erhalte ich konsistente FFT-Spitzenfrequenzschätzungen für verschiedene Abtastraten und Fenstergrößen. Huzzah!
Willpett

@ will.pett: Vielleicht wurde das Problem mehr durch "Quinns First Estimator" als durch die FFT verursacht?
Endolith

Ich glaube nicht, dass die Interpolationsmethode völlig schuld war, da die quadratische Interpolation auch bei bestimmten Fensterfunktionen und Abtastraten zu schlechten Ergebnissen führte. Ich denke, es war die Kombination der oben genannten Parameter, die wichtig war. Ich habe nicht die richtige Fensterfunktion verwendet und mein Spektrum nicht logarithmisch transformiert. Ich wette, das Wichtigste war die Log-Transformation. Wahrscheinlich Standardprotokoll, das mir einfach nicht bekannt war.
Willpett

@ Endolith, danke, bekam es (Fragen können folgen)
Denis

3

Erstens sind die Spitzenfrequenzschätzung und die Tonhöhenschätzung zwei verschiedene Dinge. Tonhöhe ist ein psychoakustisches Phänomen. Menschen können eine Tonhöhe hören, selbst wenn die Grundfrequenz vollständig fehlt oder im Vergleich zu den meisten anderen Spitzen relativ schwach ist, wie bei den tiefen Tönen, die von einigen Instrumenten erzeugt werden.

Zweitens entspricht die Verwendung eines Fensters auf einer FFT der Verwendung eines rechteckigen Fensters, das Ihr Spektrum mit der Sinc-Funktion faltet. Bei der Sinc-Funktion sind viele Buckel weit vom Peak entfernt, die für alle Frequenzen angezeigt werden, die in der FFT-Länge nicht genau periodisch sind (auch als "spektrale Leckage" bekannt). All dieser Energieverlust von einer starken Frequenz stört die Positionsschätzung anderer Frequenzspitzen. Eine besser geeignete Fensterfunktion (Hamming oder von Hann) könnte daher dazu beitragen, diese Interferenz zwischen Spitzen zu verringern.

Eine längere FFT verringert die Delta-Frequenz zwischen Bin-Zentren, was die Interpolation und damit die Genauigkeit der Frequenzschätzung für stationäre Spektren erhöhen sollte. Wenn die FFT jedoch so lang ist, dass sich das Spektrum innerhalb des FFT-Fensters ändert, werden alle diese geänderten Frequenzen in einer längeren FFT zusammen verwischt.


1

Sie benötigen auf jeden Fall eine geeignete Fensterfunktion - die Auswirkungen der spektralen Leckage variieren erheblich, je nachdem, wie die Tonhöhenperiode und die Länge des FFT-Fensters zusammenhängen. Wenn Sie einen großen Übergang zwischen der letzten und der ersten Probe des FFT-Fensters erhalten, wird dies sehr unangenehm Verschmieren des Spektrums. Wenn Sie Glück haben und diese Diskontinuität gering ist, ist das resultierende Spektrum viel sauberer. Dies ist wahrscheinlich der Grund, warum Sie Inkonsistenzen feststellen, wenn Sie einen Ihrer Parameter wie die FFT-Größe ändern. Mit einer geeigneten Fensterfunktion erhalten Sie ein konsistentes Spektrum, wenn sich die Tonhöhe ändert.


Ich habe jetzt verschiedene Fensterfunktionen ausprobiert (Hamming, Blackman-Harris, Gauss, Weedon-Gauss) und alle liefern mir unter allen Bedingungen der Abtastrate / Fenstergröße (z. B. Schätzung der ersten Teilfrequenz bei 460, 488 und) wild ungenaue Ergebnisse Andere). Nur ein rechteckiges Fenster konnte einen Peak bei 440 Hz korrekt identifizieren. Interessanterweise ist dieser Peak bei verschiedenen Kombinationen aus Abtastrate und Fenstergröße in einem rechteckigen Fenster weitgehend unveränderlich, obwohl der zweite Teil immer noch variabel ist. Wie kann ich diese Ergebnisse mit Ihrem Rat in Einklang bringen?

Als Randnotiz verwende ich auch einen Autokorrelationsalgorithmus, um mit der FFT zu vergleichen. Diese Methode (die von der Fensterfunktion unabhängig ist) liefert ~ 440,4 Hz für den Wikipedia-Ton, während die FFT-Methode ohne Fensterfunktion fast genau 440 ergibt. Mir ist klar, dass die Autokorrelation nicht direkt die erste Teilfrequenz schätzt, sondern die psychoakustische "Tonhöhe", aber es ist immer noch interessant zu vergleichen. Beim Experimentieren mit Klaviertönen habe ich festgestellt, dass die Autokorrelationsmethode die erste Teilfrequenz im Vergleich zur FFT-Methode konsistent überschätzt.

1
Es ist schwer zu erraten, was die Probleme sein könnten, ohne den Code usw. zu sehen. Haben Sie versucht, das Leistungsspektrum zu zeichnen, um zu sehen, wie die Peaks tatsächlich mit / ohne Fensterfunktion aussehen? Dies sollte Ihnen nicht nur sagen, ob sich Ihr Fenster / FFT / usw. korrekt verhält, sondern Ihnen auch einen Einblick geben, warum Ihre Tonhöhenschätzung algo die Ergebnisse liefert, die sie liefert.
Paul R

Es ist seltsam, weil die Fensterfunktionen tatsächlich sauberere Spektren mit wenig Verschmieren erzeugen. Die Schätzungen der Spitzenfrequenzen sind jedoch nicht richtig. Wenn ich die Einstellungen verwende, die mir 440 Hz ohne Fensterung geben, und dann zu einem Hamming-Fenster wechsle, erhalte ich 444,6 Hz. Mit einem Blackman-Harris-Fenster bekomme ich 460,9 Hz und mit einem Gaußschen Fenster 446,4 Hz. Ist es möglich, dass Spitzeninterpolationsmethoden implizite Annahmen über die Fensterfunktion treffen, gegen die ich möglicherweise verstoße?
Willpett

Ich bin mit den Interpolationsmethoden in dem Artikel, auf den Sie verweisen, nicht wirklich vertraut - sie scheinen sowohl Größen- als auch Phaseninformationen zu verwenden und nicht nur Größen, aber ich hätte nicht gedacht, dass Fensterung einen signifikanten Einfluss auf die Phase haben würde.
Paul R
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.