Wie verteilt sich die Energie nicht aufgelöster Spektrallinien in einer FFT?

Wenn meine FFT beispielsweise eine schlechte Auflösung von 170 Hz hat (die Datensequenzlänge ist aufgrund von Latenzbeschränkungen klein) und ich versuche, eine Sinuskurve im Bereich von 150 bis 250 Hz zu erkennen, ist diese FFT dann gut genug?

Ich habe das Gefühl, wenn die Sinuskurve in der Nähe von 170 Hz (150-200 Hz) liegt, zeigt mein Frequenzbin bei 170 Hz eine Zunahme der Größe, die ich zur Erkennung verwenden kann. Was aber, wenn bei 250 Hz eine Sinuskurve vorhanden ist? Wird seine Energie zwischen dem 170-Hz-Bin und dem 340-Hz-Bin verteilt? Und wenn ja, in welchem ​​Verhältnis? (Vielleicht kann ich in diesem Fall eine gewichtete Summe verwenden, um dies zu erkennen)

Ich würde wetten, dass sqrt(A^2 + B^2) funktionieren würde
Vergessen Sie auch nicht die Phasenkomponente. Wenn eine Sinuskurve außerhalb der Mittenfrequenz des Bins liegt, hat sie eine Phase, die sich von einem FFT-Fenster zum nächsten verschiebt (rotiert). Ich denke, dass Sie durch "Uwrapping" der Phase und deren Analyse die Frequenz der Sinuskurve genau erhalten können. Ich habe einfach keine praktische Umsetzungserfahrung in dem Bereich, um den Code "blind ausspucken" zu können.
Nehmen wir zum Beispiel an, wir nehmen 8 Fenster pro Sekunde und haben einen 100-Hz-Bin, und es gibt eine reine Sinuskurve in der Nähe von 100 Hz (ohne andere Sinuskurven in der Nähe, die sich in denselben Bin vermischen würden). Angenommen, der 100-Hz-Bin-FFT-Wert hat eine Phase, die sich in jedem Fenster um –45 Grad ändert. Über die 8 Fenster in einer Sekunde summiert sich dies also auf -365 Grad. Was sagt das also aus? Das Signal fällt gegenüber 100 Hz jede Sekunde um einen Zyklus zurück, sodass seine Frequenz 99 Hz beträgt.
Das sind großartige Informationen, Kaz, aber zum Glück brauche ich nicht die genaue Frequenz, ich muss nur wissen, ob eine Sinuskurve vorhanden ist oder nicht. Meine Hauptsorge ist also, ob die Überwachung eines einzelnen Bins (bei 170 Hz) ausreicht.
Wie sich die Energie ausbreitet, wird durch die Fensterfunktion bestimmt, die Sie auf Ihre Daten anwenden, bevor Sie die FFT durchführen. Weitere Informationen finden Sie hier: en.wikipedia.org/wiki/Window_function
Was versuchen Sie zu erkennen? Möchten Sie nur wissen, ob die 170-Hz-Komponente vorhanden ist, oder möchten Sie ihre Amplitude genau messen oder in der Lage sein, sie von anderen, nahegelegenen Frequenzen aufzulösen?
Worauf setzen Sie das um? Wenn Sie nur versuchen, das Vorhandensein einer Frequenzkomponente zu erkennen, wäre es sinnvoller, einen Goertzel-Algorithmus als FFT zu verwenden. Es ist weniger rechenintensiv und Sie können eine bessere Auflösung erzielen. Unabhängig vom Fenster haben Sie spektrale Lecks, und mit einem gewünschten Bereich, der schmaler als Ihre Bins ist, haben Sie keine Chance, mit einer FFT aussagekräftige Ergebnisse zu erzielen.
@MattYoung, ich habe den Goertzel-Algorithmus nicht verwendet, aber laut Wikipedia berechnet er nur einzelne Bins der DFT. OP sagte, seine Datensequenzlänge sei durch Latenzprobleme begrenzt, daher ist mir nicht klar, wie Goertzel die Auflösung verbessern kann - wenn dies möglich ist, sollten Sie eine Antwort hinzufügen.

Antworten (1)

Wie The Photon sagt, wie sich die Energie ausbreitet, wird durch die von Ihnen verwendete Fensterfunktion bestimmt. Hier ist ein Auszug aus The Scientist and Engineer's Guide to Digital Signal Processing , Kapitel 9 (gegen Ende):

Fensterfunktionen

Ihre Wahl der Fensterfunktion hängt weitgehend von dem Signal ab, das Sie zu messen versuchen. Benötigen Sie eine hohe Frequenzauflösung? Benötigen Sie eine genaue Amplitudenmessung? Es ist nicht möglich, alles auf einmal zu optimieren.

Aus Ihren Kommentaren geht hervor, dass das Flat-Top-Fenster am besten geeignet ist. Nochmal aus der Anleitung:

Dies führt uns zu dem in Abb. 9-5d gezeigten Flat-Top-Fenster. Bei manchen Anwendungen muss die Amplitude einer spektralen Spitze sehr genau gemessen werden. Da das Frequenzspektrum der DFT aus Samples gebildet wird, gibt es keine Garantie dafür, dass ein Sample genau an der Spitze eines Peaks auftritt. Höchstwahrscheinlich wird die nächste Probe leicht außermittig sein, was einen Wert ergibt, der niedriger als die wahre Amplitude ist. Die Lösung besteht darin, ein Fenster zu verwenden, das eine spektrale Spitze mit einer flachen Spitze erzeugt, wodurch sichergestellt wird, dass eine oder mehrere der Proben immer den richtigen Spitzenwert haben. Wie in Abb. 9-5d gezeigt, ist der Nachteil dafür eine sehr breite Hauptkeule, was zu einer schlechten Frequenzauflösung führt.

Ich erwarte, irgendwo im Bereich von 150 bis 250 Hz eine Sinuskurve zu sehen (sie kann irgendwo im Bereich liegen). Meine FFT-Bins sind jedoch bei 0, 170, 340 ... usw. Das Erhöhen meiner Frequenzauflösung ist aufgrund von Latenzanforderungen, die die Datenlänge einschränken, keine Option. Ich wollte nur wissen, ob die Überwachung eines Frequenzbins, dh des 170-Hz-Bins, zur Erkennung ausreicht. Ich brauche keine genaue Amplitudenmessung, sondern nur die Erkennung der Sinuskurve mithilfe einer Entscheidungsregel vom Schwellenwerttyp. Die Frage ist, ob meine Sinuskurve bei 250 Hz liegt, wie viel Energie im 170-Hz-Bin sichtbar wird. Ich möchte nicht vermisse es.
@ankit hört sich so an, als ob Sie das Flat-Top-Fenster wollen. Siehe Änderungen.