Welche Bedeutung haben meine Fourier-Transformationsergebnisse?

Ich habe mit Fourier-Transformationen experimentiert und würde gerne einige der Ergebnisse verstehen, die ich sehe.

Ich habe einen Simulator geschrieben, der einen Datenstrom mit einer Länge von 1/120 Sekunden erzeugt, der in Intervallen von 33,92 nS abgetastet wird. Die Daten stellen eine Halbsinuswelle dar, die von einem Wechselrichter erzeugt wird. Ich habe diesen Strom mit seinem eigenen negativen Inversen verkettet, um eine einzelne perfekt symmetrische 60-Hz-Sinuswelle mit einer Länge von 491.352 Samples zu erzeugen.

Geben Sie hier die Bildbeschreibung ein

Ich habe dann eine FFT der Ergebnisse mit numpy durchgeführt . Die meisten Ergebnisse machten für mich Sinn: Die FFT hatte die gleiche Länge wie das Originalsignal. Diskrete Fourier-Ergebnisse sind symmetrisch zur Grundwelle, also habe ich halb so viele "Bins" (etwa 246.000), um Harmonische darzustellen. Der niedrigste Frequenzanteil im Originalsignal beträgt 60 Hz. Laut Nyqist kann das ursprüngliche Signal keine höheren Frequenzen als 1/(2*33,92 nS) = 14,74 MHz darstellen, was auch die ungefähr 246.000 Harmonischen von 60 Hz sind. Somit stellt jedes Bin eine Harmonische der 60-Hz-Grundwelle dar, ohne übersprungene Bins. Wenn ich versuchte, fünf volle Sinuswellen statt nur einer zu transformieren, waren vier von fünf Bins Null, was Sinn macht; diese Bins stellen Teilharmonische dar, die bedeutungslos sind.

Zurück zu meiner Einzelwellen-FFT: Jeder Eintrag mit geradem Index (Index von Null) meiner FFT-Ergebnisse ist Null. Jeder ungerade Eintrag ist ungleich Null, wobei Index 1 bei weitem der größte ist. Dies ist sinnvoll, wenn 1 die Grundwelle ist, da die geradzahligen Harmonischen in einer symmetrischen Sinuswelle nicht auftauchen. Aber warum ist der erste Eintrag in den FFT-Ergebnissen nicht der Grundlegende?

Danach habe ich einen LC-Filter angewendet, indem ich die FFT-Ergebnisse durchlaufen und jeden Bin mit der Filterverstärkung bei dieser Frequenz multipliziert habe. Dann habe ich eine inverse FFT durchgeführt, die mir das gefilterte Zeitbereichssignal lieferte. Das Ergebnis hat sowohl Real- als auch Imaginärteile. Die reale Komponente und die imaginäre Komponente sehen, wenn sie getrennt betrachtet werden, jeweils so aus, wie ich das Zeitbereichssignal erwartet hatte: eine besser aussehende Sinuswelle als ich begonnen hatte, um 90 Grad relativ zueinander verschoben.

Geben Sie hier die Bildbeschreibung ein

Aber die Größe ist ziemlich konstant, anstatt auf der ganzen Linie eine Sinuswelle zu sehen. Das ist überhaupt nicht das, was ich erwartet hatte. Welche Bedeutung hat dieses Ergebnis?

Ein paar Plots würden es einfacher machen, dem zu folgen.
Speichert numpy eine komplexe Zahl in jedem Array-Element? Bei den C-Implementierungen, mit denen ich bisher gearbeitet habe, musste man immer aufpassen, wo der reelle und komplexe Teil im Array landet.
IIRC, numpy bietet mehrere verschiedene FFTs an. Nimmt zum Beispiel an, rfft(...)dass die Zeitbereichsdaten realwertig sind, sodass die negativen Frequenzterme nicht berechnet und gespeichert werden müssen. Es wäre hilfreich, genau zu wissen, welche FFT-Routine Sie verwenden.
@ThePhoton Ich verwende fft()
@Arsenal numpy speichert komplexe Zahlen, ja.

Antworten (2)

Aber warum ist der erste Eintrag in den FFT-Ergebnissen nicht der Grundlegende?

Typischerweise speichert der 0-te Eintrag den DC-Term. In einigen Schemata könnte der [N/2]-te Eintrag der DC-Term sein und der [N/2+1]-te Eintrag wäre der Fundamentalwert.

Ich habe einen LC-Filter angewendet, indem ich die FFT-Ergebnisse durchlaufen und jeden Bin mit der Filterverstärkung bei dieser Frequenz multipliziert habe. Ich habe dann eine inverse FFT gemacht, ... Das Ergebnis hat sowohl reale als auch imaginäre Komponenten.

Haben Sie den Phaseneffekt des Filters berücksichtigt? Sie sollten mit einem komplexen Wert multiplizieren, der sowohl den Amplituden- als auch den Phasengang des LC-Filters berücksichtigt.

Selbst dann erhalten Sie aufgrund endlicher Genauigkeitsprobleme oft immer noch imaginäre Komponenten ungleich Null im invers transformierten Zeitbereichssignal. Aber normalerweise sind diese sehr klein, zum Beispiel in der Größenordnung von 10 15 × die realen Komponenten. Diese werden normalerweise behandelt, indem man sie einfach ignoriert (nur den Realteil des Ergebnisses nimmt). Einige Tools bieten sogar eine eingebaute Funktion ( Chopzum Beispiel Mathematica), um diese Artefakte zu eliminieren.

Aha! Ich habe den Phaseneffekt des Filters tatsächlich nicht berücksichtigt!

Der erste Eintrag [1] in der FFT ist Ihre Grundwelle, aber der nullte Eintrag [0] ist DC!

Eine Standard-FFT hat die gleiche Anzahl von Ausgangsabtastwerten wie Eingangsabtastwerten, und sie sind alle komplex.

Die Ergebnisse sind nicht unbedingt symmetrisch zu DC. Im Sonderfall eines reinen Realeingangs sind sie jedoch komplex konjugiert um DC, was für die ganze Welt symmetrisch aussieht, wenn Sie die Leistung nehmen, oder das Vorzeichen des Imaginärteils nicht bemerken. Die meisten FFT-Pakete verfügen über einen speziellen „Echteingabe“-Modus, der Verarbeitungszeit und Array-Größe spart, indem nur die +ve-Hälfte der Ergebnisse erzeugt wird, wenn eine echte Eingabe gegeben wird.

Als Sie die inverse FFT zurückführten, verwendeten Sie vermutlich nur die +ve-Hälfte der Frequenzkoeffizienten. Dadurch erhalten Sie ein analytisches Signal im Zeitbereich. So beschreiben Sie einen Sinus und einen Kosinus im rechten Winkel mit einem konstanten Modul. Das reale Eingangssignal hat sowohl +ve- als auch -ve-Frequenzkomponenten, die die FFT trennt.

Wenn Sie stattdessen die FFT unter Verwendung des gesamten Frequenzspektrums invertieren, indem Sie entweder eine vollständige Komplex-zu-Vollkomplex-FFT durchführen, um die Frequenzkoeffizienten zu erhalten, oder indem Sie sie komplex konjugieren und durch Null reflektieren, rekonstruieren Sie Ihre ursprüngliche Echtzeit-Wellenform (mit etwas Fummelei). 1e-15s herumschlagen, wo wegen endlicher Genauigkeit Nullen sein sollten). Die IFFT des +ve-Halbspektrums erzeugt das Ergebnis, das Sie gesehen haben, die IFFT der -ve-Hälfte erzeugt ein ähnliches Signal mit den Kosinussen in Phase, aber den Sinussen in umgekehrter Phase, sodass die resultierende Summe reiner Kosinus und null Sinus ist.