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

War es hilfreich?

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]))
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top