Hallo LabVIEW- Experten und -Users,
ich habe ein kleines Problem bei der Berechnung des FFT-Spektrum mit FFT Spectrum (Mag-Phase). Ich gebe einen array mit 12500 Elemente als Zeitsignal rein und ich bekomme an beiden Ausgänge "Magnitude" und "Phase" einen array mit 6250 Elemente. Das kann ich leider nicht nachvollziehen. Normalerweise haben die FFT- und Zeit-Signale die gleichen Längen. oder? Warum bekomme ich nur ein Spektrum nur halb so lang wie das Zeitsignal.
Ich danke ganz herzlich jeder/m, die/der mir helfen kann.
Mit freundlichen Grüßen.
Wiszou
Hi!
Der FFT-Algorithmus hat die Eigenschaft, dass sogenannte "Spiegelfrequenzen" erzeugt werden, also um -pi verschobene im Frequenzbereich. Aus einem N Sample langen Vektor bekommt man mit einem "simplen" FFT-Block also nur N/2 Werte - lässt sich vielleicht nicht ganz richtig aber anschaulich über das gute alte Abtastheorem verstehen.
Wie gut die FFT von NI implementiert wurde, weiß ich nicht - aber bei Matlab z.B. bekommt man auch den vollen Vektor geliefert. Das ist notwendig, damit man entsprechende Rücktransformationen nach Filterungen machen kann - nimmt man nur N/2 Werte, sinkt die Auflösung bei jedem Transformationsschritt...
Sowas müsste aber eigentlich auch nochmal in der Hilfe erklärt sein. Im Übrigen würde ich Dir empfehlen, wen möglich ein paar mehr Samples zu nutzen (die nächste Zweierpotenz), weil eine FFT nur mit entsprechenden Sampleanzahlen funktioniert und padding nicht unbedingt zur Genauigkeit eiträgt.
Grüße,
ch
@crissyPU
Wenn wiszou etwas Anderes gefragt hätte, dann wäre Deine Antort richtig. Er hat sich aber nicht drüber gequndert, daß es zu viele Frequnezelemente sind - und davon gehst Du bei Deiner Antwort aus - sondern er wundert sich, daß es seiner Meinung nach zu wenige sind.
Deine Antwort wäre richtig, wenn a) wiszou die Funktion fft.vi benutzt hätte - hat er aber nicht . und er sich b) darüber gewundert hätte, daß es doppelt so viele Elemente sind als erwaret.
Aber ich freue mich auf jeden Fall, wenn hier nach jemand etwas von FFT versteht - die Experten sind hier eher dünn gesät.
Nun zur Antwort: Das hängt mit dem Nyquist-Theorem zusammen. Um eine Frequenz aus einem Zeitverlauf zu rekonstruieren, brauche ich mindetes zwei Punkte. Also einfachstes Beispiel: Aus einem Zeitverlauf der Dauer T, bestehend aus 4 Punkten, kann ich nur die Grundfrequenz f0=1/T und die erste Oberwelle f1=2/T rekonstruieren, aber nicht mehr. Insgesamt erhalte ich aber aus den 4 Samples nach der Fouriertransformation auch 4 Werte zurück: 2 Frequenzwerte und 2 Phasenwerte.
Hallo,
@ Lucki: Ich wäre mit deiner Antwort zufrieden, wenn ich genau die gleiche Länge des FFT-Signals hätte (6250) als ich die normale FFT Funktion benutzt habe. Die FFT-Funktion liefert mir aber einen array von 12500 Werte, also genau so lang wie die Zeitfunktion. Nur mit FFT Spektren Funktionen habe ich immer nur 6250 Werte. Komisch oder?
Viele Grüsse.
' schrieb:Hallo,
@ Lucki: Ich wäre mit deiner Antwort zufrieden, wenn ich genau die gleiche Länge des FFT-Signals hätte (6250) als ich die normale FFT Funktion benutzt habe. Die FFT-Funktion liefert mir aber einen array von 12500 Werte, also genau so lang wie die Zeitfunktion. Nur mit FFT Spektren Funktionen habe ich immer nur 6250 Werte. Komisch oder?
Viele Grüsse.
Daran ist nichts komisch.
(Mir sträubt sich das Gefieder, Deine Zahlen zu benutzen, denn FFT funktioniert immer nur mit 2^N Werten, also nicht mit 6250, worauf chrissipu schon hinwies. Aber um Dich nicht zusätzlich zu verwirren, verwende ich jetzt Deine Zahl)
Die "normale" FFT Funktion (FFT.vi) liefert auch nur 6250 Werte, nur sind die alle doppelt: einmal die Werte von 0..6250, und dann dieselben Werte nochmal von 6250..12500, gespiegelt um den Punkt 6250. (Es gibt auch eine "komplexe" FFT mit komplexen Samples, dort machen die gespiegelten Werte dann Sinn. Deine Zeitfolge ist aber reell)
Die gespiegelten Werte sollten vor der Weiterverarbeitun schlichtweg abgeschnitten werden. Oder aber man verwendet eine der mehr anwendungsgerechten Funktionen aus der Palette, die das FFT.vi als Sub-VI enthalten und wo diese Arbeit schon erledigt ist. Also z.B die von Dir benutzte Funktion "Amplituden und Phasenspektrum.vi"
Noch kleine Anmerkung zur FFT.vi:
Bei der FFT hat man eigentlich außer den positiven Frequenzen nochmals die gleich großen negativen, also um den Nullpunkt gespiegelten Frequenzen. Also in Deinem Falle wären das die Komponenten -6250...+6259. Da es aber in LV kein Arrays mit negativen Indizees gibt, mußte das notgedrungen alles in den Bereich positiver Zahlen abgebildet werden. Beispielsweise bei einem Frequenzarray von 0..255 müßten die Frequenzen nach dieser Vorschrift in die "richtigen" Frequenzen von -128..+127 transformiert werden:
[
attachment=14777]
(in anderen Fällen, wie z.B bei Deinen Zahlen wäre das allerdings nicht so zu machen).
Das ist aber alles nur von rein schöngeistigem Interesse. In der Praxis muß man nur das wissen: gespiegelte Häfte abschneiden, dann weiterarbeiten.