[java] Verstehen der FFT-Ausgabe


Answers

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

Question

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

Ich bin ein erfahrener Softwareentwickler und muss einige Smartphone-Beschleunigungsmesser interpretieren, wie z. B. das Auffinden der Hauptfrequenzen. Leider habe ich die meisten meiner College-EE-Klassen vor fünfzehn Jahren verschlafen, aber ich habe die letzten Tage über DFT und FFT gelesen (anscheinend ohne Erfolg).

Bitte keine Antworten von "gehen Sie eine EE-Klasse". Ich plane das eigentlich, 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 eingezeichnet habe.

Ich habe dann einen FFT-Code in Java von der Columbia University geschrieben (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, dass es eine In-Place-FFT ausführt, so dass es den gleichen Puffer für Eingabe und Ausgabe wiederverwendet.

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  ]

An diesem Punkt kann ich also die Ausgabe nicht als Kopf oder Zahl ausgeben. Ich verstehe die DFT-Konzepte, wie zum Beispiel, dass der reelle Teil die Amplituden der Komponenten-Kosinuswellen und der imaginäre Teil die Amplituden der Komponenten-Sinuswellen sind. Ich kann dieses Diagramm auch aus dem großen Buch " The Scientist and Engineer's Guide to Digital Signal Processing " folgen:

Also meine spezifischen Fragen sind:

  1. Wie finde ich vom Ausgang der FFT die "am häufigsten auftretenden 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 im Zeitbereich. Sollte die Ausgabe der FFT nicht ein Array mit 16 Elementen für Real und ein Array mit 16 Elementen für das Imaginäre sein? Warum gibt mir das Programm reale und imaginäre Array-Ausgänge der Größe 32?

  3. Bezogen auf die vorherige Frage, wie analysiere ich die Indizes in den Ausgabe-Arrays? Angesichts meiner Eingabe von 32 Samples bei 32 Hz ist mein Verständnis, dass eine 16-Element-Array-Ausgabe sollte ihren Index gleichmäßig auf die halbe Sampling-Rate (von 32 Hz) verteilt haben, so habe ich richtig verstanden, dass jedes Element des Arrays repräsentiert (32 Hz * 1/2) / 16 = 1 Hz?

  4. Warum hat die FFT-Ausgabe negative Werte? Ich dachte, dass die Werte Amplituden einer Sinuskurve darstellen. 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 "am häufigsten auftretende Frequenz" auch bei einer Fensterfunktion in mehrere FFT-Bins gesplittert werden kann. Daher müssen Sie möglicherweise ein längeres Fenster, mehrere Fenster oder eine Interpolation verwenden, um die Häufigkeit von spektralen Peaks besser abschätzen zu können.




Links