[Java] FFT-Ausgabe verstehen


Answers

Sie haben bereits einige gute Antworten, aber ich möchte hinzufügen, dass Sie vor der FFT wirklich eine Fensterfunktion auf Ihre Zeitbereichsdaten anwenden müssen, da Sie ansonsten fiese Artefakte in Ihrem Spektrum bekommen.

Question

Ich brauche Hilfe, um die Ausgabe der DFT / FFT-Berechnung zu verstehen.

Ich bin ein erfahrener Softwareingenieur und muss einige Smartphone-Beschleunigungsmesser-Messwerte interpretieren, wie z. B. die Ermittlung der Hauptfrequenzen. Leider habe ich die meisten meiner EE-Klassen vor 15 Jahren verschlafen, aber ich habe die letzten Tage über DFT und FFT gelesen (anscheinend wenig).

Bitte keine Antworten von "go take a EE class". Ich plane das tatsächlich, wenn mein Arbeitgeber mich bezahlt. :)

Also hier ist mein Problem:

Ich habe ein Signal bei 32 Hz aufgenommen. Hier ist eine 1 Sekunde Probe von 32 Punkten, die ich in Excel kartiert habe.

Ich habe dann einen FFT-Code erhalten , der in Java von der Columbia University geschrieben wurde (nachdem ich die Vorschläge in einem Beitrag über " Zuverlässige und schnelle FFT in Java " befolgt habe ).

Die Ausgabe dieses Programms ist wie folgt. Ich glaube, es läuft eine In-Place-FFT, also verwendet es denselben Puffer für Eingang und Ausgang wieder.

Before: 

Re: [0.887  1.645  2.005  1.069  1.069  0.69  1.046  1.847  0.808  0.617  0.792  1.384  1.782  0.925  0.751  0.858  0.915  1.006  0.985  0.97  1.075  1.183  1.408  1.575  1.556  1.282  1.06  1.061  1.283  1.701  1.101  0.702  ]

Im: [0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  ]

After: 

Re: [37.054  1.774  -1.075  1.451  -0.653  -0.253  -1.686  -3.602  0.226  0.374  -0.194  -0.312  -1.432  0.429  0.709  -0.085  0.0090  -0.085  0.709  0.429  -1.432  -0.312  -0.194  0.374  0.226  -3.602  -1.686  -0.253  -0.653  1.451  -1.075  1.774  ]

Im: [0.0  1.474  -0.238  -2.026  -0.22  -0.24  -5.009  -1.398  0.416  -1.251  -0.708  -0.713  0.851  1.882  0.379  0.021  0.0  -0.021  -0.379  -1.882  -0.851  0.713  0.708  1.251  -0.416  1.398  5.009  0.24  0.22  2.026  0.238  -1.474  ]

Also kann ich an dieser Stelle keine Köpfe oder Schwänze der Ausgabe machen. Ich verstehe die DFT-Konzepte, wie zum Beispiel der Realteil, der die Amplituden der Komponentenkosinuswellen ist, und der Imaginärteil, der die Amplituden der Komponentensinuswellen ist. Ich kann dieses Diagramm auch aus dem großartigen Buch " The Scientist and Engineer's Guide to Digital Signal Processing " folgen:

Also meine spezifischen Fragen sind:

  1. Wie finde ich aus der Ausgabe der FFT die "häufigsten Frequenzen"? Dies ist Teil meiner Analyse meiner Beschleunigungsmesserdaten. Soll ich die realen (Cosinus) oder imaginären (Sinus) Arrays lesen?

  2. Ich habe eine 32-Punkte-Eingabe in der Zeitdomäne. Sollte die Ausgabe der FFT nicht ein Array mit 16 Elementen für Reals und ein Array mit 16 Elementen für Imaginäre sein? Warum gibt mir das Programm echte und imaginäre Array-Ausgänge der Größe 32?

  3. Wie kann ich die Indizes in den Ausgabe-Arrays analysieren? Angesichts meiner Eingabe von 32 Samples, die mit 32 Hz abgetastet werden, gehe ich davon aus, dass ein 16-Element-Array-Ausgang seinen Index gleichmäßig auf 1/2 der Sampling-Rate (von 32 Hz) verteilen sollte. der Anordnung repräsentiert (32 Hz * 1/2) / 16 = 1 Hz?

  4. Warum hat der FFT-Ausgang negative Werte? Ich dachte, die Werte repräsentieren Amplituden einer Sinuskurve. Zum Beispiel sollte die Ausgabe von Real [3] = -1.075 eine Amplitude von -1.075 für eine Kosinuswelle der Frequenz 3 bedeuten. Ist das richtig? Wie kann eine Amplitude negativ sein?




Beachten Sie, dass die "häufigste Frequenz" auch bei einer Fensterfunktion in mehrere FFT-Bereiche gespritzt werden kann. Daher müssen Sie möglicherweise ein längeres Fenster, mehrere Fenster oder Interpolation verwenden, um die Häufigkeit von Spektralspitzen besser zu schätzen.