Bitte nehmen Sie folgendes an:
- Die Frequenz der Grundschwingung eines Signals wurde unter Verwendung der FFT und einiger Frequenzschätzungsverfahren geschätzt und liegt zwischen zwei Bin-Zentren
- Die Abtastfrequenz ist fest eingestellt
- Rechenaufwand ist kein Thema
Wie lässt sich bei Kenntnis der Frequenz der entsprechende Spitzenwert der Grundsignale am genauesten abschätzen?
Eine Möglichkeit könnte darin bestehen, das Zeitsignal auf Null zu setzen, um die FFT-Auflösung so zu erhöhen, dass die Bin-Mitte näher an der geschätzten Frequenz liegt. In diesem Szenario bin ich mir nicht sicher, ob ich so viel Zero-Pad ausführen kann, wie ich möchte, oder ob dies einige Nachteile hat. Ein anderes ist, welches Bin-Zentrum ich nach dem Null-Auffüllen als das auswählen soll, von dem ich den Spitzenwert erhalte (weil man die interessierende Frequenz möglicherweise auch nach dem Null-Auffüllen nicht genau trifft).
Ich frage mich jedoch auch, ob es eine andere Methode gibt, die möglicherweise bessere Ergebnisse liefert, z. B. einen Schätzer, der die Spitzenwerte der beiden umgebenden Bin-Zentren verwendet, um den Spitzenwert bei der interessierenden Frequenz zu schätzen.
imax
ist der FFT-Peak) gibt Ihnen genaue ErgebnisseAntworten:
Der erste Algorithmus, der in den Sinn kommt, ist der Goertzel-Algorithmus . Dieser Algorithmus geht normalerweise davon aus, dass die interessierende Frequenz ein ganzzahliges Vielfaches der Grundfrequenz ist. In diesem Artikel wird jedoch der (verallgemeinerte) Algorithmus auf den Fall angewendet, an dem Sie interessiert sind.
Ein weiteres Problem ist, dass das Signalmodell falsch ist. Es nutzt
2*%pi*(1:siglen)*(Fc/siglen)
. Es sollte verwendet werden,2*%pi*(0:siglen-1)*(Fc/siglen)
damit die Phase korrekt ausgegeben wird.Ich denke auch, dass es ein Problem mit der Frequenz gibt
Fc=21.3
, die sehr niedrig ist. Niedrigfrequente reelle Signale neigen dazu, eine Vorspannung aufzuweisen, wenn es um Probleme bei der Phasen- / Frequenzschätzung geht.Ich habe auch eine Grobgittersuche nach der Phasenschätzung durchgeführt, die dieselbe Antwort liefert wie der Goertzel-Algorithmus.
Unten sehen Sie eine grafische Darstellung, die die Abweichung in beiden Schätzungen (Goertzel: blau, Coarse: rot) für zwei verschiedene Frequenzen zeigt:
Fc=21.3
(durchgehend) undFc=210.3
(gestrichelt). Wie Sie sehen können, ist die Vorspannung für die höhere Frequenz viel geringer.Die Kurve Achse ist die Anfangsphase, die sich von 0 auf 2 π ändert .x 2π
quelle
Wenn Sie mehrere benachbarte FFT-Bins verwenden möchten, nicht nur 2, kann die fensterbasierte Sinc-Interpolation zwischen den Ergebnissen der komplexen Bins abhängig von der Breite des Fensters eine sehr genaue Schätzung ergeben.
Windowed-Sinc-Interpolation ist häufig in hochwertigen Audio-Upsamplern zu finden, sodass Artikel zu diesem Thema über geeignete Interpolationsformeln mit Fehleranalyse verfügen.
quelle
[1] JL Flanagan und RM Golden, "Phase vocoder", Bell Systems Technical Journal, vol. 45, S. 1493–1509, 1966.
[2] K. Dressler, „Sinusförmige Extraktion unter Verwendung einer effizienten Implementierung einer FFT mit mehreren Auflösungen“, in Proc. 9. Int. Conf. über digitale Audioeffekte (DAFx-06), Montreal, Kanada, September 2006, S. 247–252.
quelle
Eine Methode besteht darin, das Maximum zu finden und eine Parabel darüber anzupassen und dann das Maximum des Parabolas als Frequenz- und Größenschätzung zu verwenden. Hier können Sie alles darüber lesen: https://ccrma.stanford.edu/~jos/sasp/Sinusoidal_Peak_Interpolation.html
quelle
Vor ein paar Jahren hatte ich große Schwierigkeiten mit diesem Problem.
Ich habe diese Frage gestellt:
/programming/4633203/extracting-precise-frequences-from-fft-bins- using-phase-change-between-frames
Am Ende habe ich die Berechnungen von Grund auf neu durchgeführt und eine Antwort auf meine eigene Frage gepostet.
Ich bin überrascht, dass ich im Internet keine ähnliche Ausstellung finden konnte.
Ich werde die Antwort hier noch einmal posten. Beachten Sie, dass der Code für ein Szenario entwickelt wurde, in dem ich mein FFT-Fenster um das Vierfache überlappe.
π
Dieses Puzzle benötigt zwei Schlüssel, um es freizuschalten.
Der erste Schlüssel ist zu verstehen, wie das Überlappen des FFT-Fensters eine Rotation in der Bin-Phase einführt.
Der zweite Schlüssel stammt aus Grafik 3.3 & 3.4 hier (Dank an Stephan Bernsee für die Erlaubnis, die Bilder hier zu kopieren).
Grafik 3.3:
Grafik 3.4:
Code:
quelle
Mit diesem Python-Code erhalten Sie ein sehr genaues Ergebnis (ich habe es für viele Noten verwendet und Fehler von weniger als 0,01% des Halbtons erhalten) mit parabolischer Interpolation (Methode erfolgreich von McAulay Quatieri, Serra usw. in Harmonic + Residual verwendet) Trenntechniken)
quelle
Die Frequenzen, mit denen Sie es zu tun haben (21,3 Hz, abgetastet bei 8 kHz), sind sehr niedrig. Da es sich um reelle Signale handelt, weisen sie für ** jede ** Frequenz eine Verzerrung in der Phasenschätzung auf.
Dieses Bild zeigt eine grafische Darstellung der Vorspannung (
phase_est - phase_orig
) fürFc = 210.3;
(in Rot) gegenüber der Vorspannung fürFc = 21.3;
. Wie Sie sehen, ist der Versatz für den21.3
Fall viel wichtiger .Eine weitere Option ist die Reduzierung Ihrer Abtastrate. Die grüne Kurve zeigt die Abweichung
Fs = 800
von8000
.quelle
goertzel = atan(imag(y(2)),real(y(2)))*180/%pi + 90;
. :-) Werde noch ein bisschen graben. Beobachten Sie diesen Raum.p
durch ersetzen, erhaltenp2 = (abs(y(3)) - abs(y(1)))/(2*(2*abs(y(2)) - abs(y(3)) - abs(y(1)))); phase2 = y0 - 0.25*(ym1-yp1)*p2;
Sie VIEL bessere Antworten - auch fürFc=210
. Ich bin mir nicht sicher, ob die aktuelle Version vonp
Ihnen etwas Sinnvolles bringt. Die Interpolationsformel dient zur Interpolation der AMPLITUDE einer Parabel,p
interpoliert aber die gerade ... ungerade Phase .p = (yp1 - ym1)/(2*(2*y0 - yp1 - ym1))
) manchmal falsch ist, wenn Sie PHASES anstelle von Amplituden verwenden. Dies liegt daran, dass die Phasen um die Grenze von +/- 180 Grad springen können . Alles, was benötigt wird, um es für die Phase zu reparieren, ist, diese Linie zu meinerp2
obigen Berechnung zu ändern .