Spektrale Leistungsdichte von JTransforms DoubleFFT_1D
-
14-11-2019 - |
Frage
Ich verwende die Java-Bibliothek Jtransforms, um eine Analyse für einen bestimmten Datensatz durchzuführen.
Ein Beispiel für die Daten lautet wie folgt:
980,988,1160,1080,928,1068,1156,1152,1176,1264
Ich verwende die Funktion DoubleFFT_1D in JTransforms.Die Datenausgabe ist wie folgt:
10952, -152, 80.052, 379.936, -307.691, 12.734, -224.052, 427.607, -48.308, 81.472
Ich habe Probleme, die Ausgabe zu interpretieren.Ich verstehe, dass das erste Element im Ausgabearray die Summe der 10 Eingänge (10952) ist.Es ist
die anderen Elemente des Ausgabearrays, die ich nicht verstehe.Letztendlich möchte ich die Leistungsspektraldichte der Eingabedaten in einem Diagramm darstellen und Beträge zwischen 0 und finden.5 Herz.
Die Dokumentation zu den jTransform-Funktionen gibt an (wobei a der Datensatz ist):
public void realForward(double[] a)
berechnet die 1D-Vorwärts-DFT von Real daten, die das Ergebnis in a belassen.Das physische Layout der Ausgabedaten ist wie folgt:wenn n gerade ist, dann
a[2*k] = Re[k], 0 <= k < n / 2 a[2*k+1] = Im[k], 0 < k < n / 2 a[1] = Re[n/2]
wenn n ungerade ist, dann
a[2*k] = Re[k], 0 <= k < (n+1)/2 a[2*k+1] = Im[k], 0 < k< (n-1)/2 a[1] = Im[(n-1)/2]
Diese Methode berechnet nur die Hälfte der Elemente der realen Transformation.Die andere Hälfte erfüllt die Symmetriebedingung.Wenn Sie das Volle wollen echte Vorwärtstransformation, verwenden Sie realForwardFull.Um die ursprünglichen Daten wiederherzustellen, verwenden Sie realInverse für die Ausgabe dieser Methode.
Rahmenbedingungen:a - zu transformierende Daten
Verwenden Sie nun die oben genannten Methoden:(da die Länge meines Datenarrays 10 beträgt, werden die Methoden "n ist gerade" verwendet.)
Re[0] = 10952
Re[1] = 80.052
Re[2] = -307.691
Re[3] = -224.052
Re[4] = -48.308
Re[5] = 12.734
Im[0] = -152
Im[1] = 379.936
Im[2] = 12.734
Im[3] = 427.607
Im[4] = 81.472
Also ein paar Fragen:Sieht diese Ausgabe korrekt aus?Es scheint mir, dass Re[0] nicht 10952 sein sollte, was die Summe aller Elemente im ursprünglichen Array ist.
Scheint, als ob die Ausgabe leicht korrigiert werden sollte:(liege ich falsch?)
Re[0] = 80.052
Re[1] = -307.691
Re[2] = -224.052
Re[3] = -48.308
Re[4] = -152
Im[0] = 379.936
Im[1] = 12.734
Im[2] = 427.607
Im[3] = 81.472
Verwenden Sie jetzt die folgende Methode, die im Forum gepostet wurde:
Um die Größe von bin k zu erhalten, müssen Sie berechnen sqrt(re * re + im * im)
, wobei re, im die Real- und Imaginärkomponenten in der FFT-Ausgabe für bin k sind.
Für Ihre spezielle FFT re[k] = a[2*k] and im[k] = a[2*k+1]
.Daher zur Berechnung des Leistungsspektrums:
for k in 0 to N/2 - 1
{
spectrum[k] = sqrt(sqr(a[2*k]) + sqr(a[2*k+1]))
}
So:
spectrum[0] = 388.278
spectrum[1] = 307.955
spectrum[2] = 482.75
spectrum[3] = 94.717
Einige Fragen.Sehen diese Daten korrekt aus?Bin ich auf dem richtigen Weg?Würden diese Spektrumsdaten dann so etwas darstellen:
388.278 at .125 Hz
307.955 at .25 Hz
482.75 at .375 Hz
94.717 at .5 Hz
Bin ich weit weg?Mein Ziel ist es, ein Leistungsspektraldichte-Balkendiagramm von 0 bis zu erstellen.5 Hz
Lösung
Ich denke, Sie müssen die Ausgabedaten wie folgt interpretieren:
10952 Re[0] = sum of all inputs = DC component
-152 Re[5] - see note about a[1] being special - there is no Im[0]
80.052 Re[1]
379.936 Im[1]
-307.691 Re[2]
12.734 Im[2]
-224.052 Re[3]
427.607 Im[3]
-48.308 Re[4]
81.472 Im[4]
Die Größen sind daher:
spectrum[0] = 10952
spectrum[1] = sqrt(80.052^2 + 379.936^2) = 388.278
spectrum[2] = sqrt(-307.691^2 + 12.734^2) = 307.427
spectrum[3] = sqrt(-224.052^2 + 427.607^2) = 482.749
spectrum[4] = sqrt(-48.308^2 + 81.472^2) = 94.717
[Tut mir leid, dass es jetzt zwei getrennte Antworten von mir gibt - ich denke, zwei verwandte Fragen wurden zusammengeführt, während ich an der neuen Antwort arbeitete]
Andere Tipps
Jeder Eintrag in der Transformation repräsentiert die (komplexe) Größe der Frequenz in der Probe.
die Leistungsdichte in einer gegebenen Frequenz ist nur die Größe der komplexen Amplitude der Transformation in dieser Frequenz.die Größe einer komplexen Zahl wird aus ihren Komponenten berechnet, und Sie sollten kein Problem damit haben, dies zu erhalten
Jede Spalte stellt Amplituden für zunehmende Frequenzen dar, beginnend mit 0 (dem ersten Eintrag), dann 2 Pi / T (wobei T die Länge Ihrer Probe ist), bis zur letzten Probe 2 * Pi * N / T (wobei N die Anzahl der Proben ist) )
es gibt andere Konventionen, bei denen die Transformation für die Frequenz -Pi * N / T bis zu Pi * N / T zurückgegeben wird und die Frequenzkomponente 0 in der Mitte des Arrays liegt
hoffe das hilft
Um die Größe von bin k zu erhalten, müssen Sie sqrt(re * re + im * im) berechnen. wheer re, im sind die Real- und Imaginärkomponenten in der FFT-Ausgabe für bin k.
Für Ihre spezielle FFT re[k] = a[2*k]
und im[k] = a[2*k+1]
.Daher zur Berechnung des Leistungsspektrums:
for k in 0 to N/2 - 1
spectrum[k] = sqrt(sqr(a[2*k]) + sqr(a[2*k+1]))