Was ist der Müll am Ende meiner FFT in LTSPICE?

Warum haben FFTs Junk am Hochfrequenzende? Angenommen, ich simuliere diese Schaltung in LTSPICE:

schematisch

Simulieren Sie diese Schaltung – Mit CircuitLab erstellter Schaltplan

Wobei die LTSPICE-Sinus- und Simulationsparameter sind:

SINE(0 1 1K 0 0 0 1000)
.tran 1 startup

Dann bitte ich LTSPICE, mir eine FFT ohne Fenster und 1.000.000 Punkte zu geben:FFT

Wozu der ganze Schrott am Ende? Ich würde nur eine Spitze bei 1 kHz erwarten, keine zusätzliche bei 3 kHz usw. Tritt dies bei allen FFTs auf? Was steuert die Spitzen, die Sie nach Ihrem Fundamentalwert erhalten?

Kannst du die anderen Frequenzen wirklich lokalisieren? Sind sie alle ungerade Vielfache von 1 kHz? In diesem Fall verzerrt etwas Ihren "perfekten" Sinus, um "rechteckiger" auszusehen, und es könnte nur die numerische Genauigkeit sein, die ltspice intern verwendet.
Ich würde nicht unter -100 dB schauen, sondern mit der 3. Harmonischen beginnen, kein Fenster scheint ein Problem zu sein
Könnte etwas mit der Wellenformkomprimierung zu tun haben. Siehe diese andere Frage für weitere Details und wie Sie überprüfen können, ob dies der Fall ist. electronic.stackexchange.com/questions/338292/…
Ich kann diese Daten nicht reproduzieren, meine Version von LTspice möchte über 1e6 simulierte Punkte, um eine FFT von 1e6 Punkten zu erhalten, dh einen maximalen Zeitschritt von 1e-6.
Benötigen Sie Quasi-Peak, um das Audiospektrum für die Modulation BW anzupassen?

Antworten (3)

Die Antwort von @D.Brown ist bereits sehr gut, daher werde ich nur ein paar Kleinigkeiten hinzufügen. Der Algorithmus von LTspice ist benutzerdefiniert und akzeptiert eine Anzahl von Punkten, die keine Zweierpotenz ist. Das bedeutet nicht, dass die Auflösung nicht wichtig ist. Dennoch bedeutet 1 kHz über 1 s eine ganzzahlige Anzahl von Perioden, sodass keine Fensterung oder binomiale Glättung erforderlich ist, um das Rauschen zu reduzieren (Einstellungen im FFT-Fenster). Was @mkeith erwähnt hat, ist jedoch, dass LTspice standardmäßig eine Wellenformkomprimierung verwendet (300 Punkte pro Anzeige, IIRC), was bedeutet, dass alle anderen Punkte reduziert werden und die Auflösung der Wellenform leidet. Die Lösung dafür ist entweder ein engerer Zeitschritt oder .option plotwinsize=0, der letzte, der die Wellenformkompression eliminiert. Folgendes passiert, wenn diese Option hinzugefügt wird, aber kein Zeitschritt festgelegt wird:

Ursprünglich

Das ist wahrscheinlich das, was Sie sehen, mehr oder weniger, also wofür ist die Option? Sie simulieren eine 1 - kHz -Wellenform über einen Zeitraum von 1 s . Die Schaltung, wenn man das so nennen kann, ist eine einfache Quelle und Last, und die Quelle ist eine harmonische, eine mühselige Aufgabe für den Matrixlöser, also LTspice, wie alle SPICE-Engines, wenn es das Gefühl hat, dass die Ableitung glatt ist wird seinen Zeitschritt verdoppeln, um die Simulation nicht zu verlangsamen, und er wird ihn weiter verdoppeln, bis er eine interne Grenze erreicht, an welcher Stelle er über die Simulation fliegt. Das Ergebnis ist eine grobe Wellenform, die sich nicht einmal plotwinsizeallzu sehr verbessern lässt.

Das andere Heilmittel, der auferlegte Zeitschritt, wird nun benötigt, um die Auflösung zu verbessern. Hier das Ergebnis mit 1 μ s Zeitschritt:

10 u

Es ist besser, aber Sie führen eine FFT mit 1 Million Punkten durch, die, vielleicht nicht überraschend, 1 Million Zeitpunkte erfordert, daher sollte der maximale Zeitschritt auf 1 eingestellt werden μ s. Außerdem wird die Option numdgtauf einen Wert >7 gesetzt, was buchstäblich doppelte Genauigkeit ermöglicht:

Ultra

Es gibt immer noch ein leicht wackeliges Grundrauschen, aber der Pegel liegt jetzt unter -250 dB. Dies kommt der Maschinenpräzision nahe. Das Erstellen des Zeitschritts 1/1048576 (2^-20) verbessert die Ergebnisse nicht (Sie können es selbst überprüfen).

Am Ende hängt es davon ab, wie viel Grundrauschen Sie bereit sind zu akzeptieren. @ Tony Stewarts Kommentar ist von praktischer Sensibilität, unter 100 ~ 120 dB bedeutet weniger als 1 ~ 10 μ V auf 1V, was eine ziemliche Leistung ist.

Vielen Dank, dass Sie die Arbeit für diese Antwort investiert haben. Nebenbei bemerkt hat es mir gezeigt, dass LTspice auf macOS im Vergleich zu Windows drastisch anders abschneidet. (Ich nehme an, das ist die Windows-Version)
@loudnoises Ja, aber unter Wein, nicht dass es wichtig wäre. Ich habe hier und da ein paar Punkte in der Yahoo LTspice Group gesehen, aber da ich kein Mac-Benutzer bin, habe ich nicht darauf bestanden. Es könnte sein, dass es auch eine Frage der Einstellungen ist, die sich unter der anderen Haube verstecken, aber wirklich, ich bin mir nicht sicher.
Exzellent! Wenn ich jetzt auf die LTSPICE-Hilfedatei zurückblicke, hätte ich Folgendes bemerken sollen: „LTspice verwendet einen proprietären FFT-Algorithmus, der eine beliebige Anzahl von Datenpunkten zulässt, dh nicht auf eine Potenz von 2 beschränkt ist. Wenn Sie erwarten, FFTs Ihrer Simulation durchzuführen Daten, möchten Sie wahrscheinlich die Wellenformkomprimierung ausschalten, einen maximalen Zeitschritt festlegen und möglicherweise sogar das Wellenformdateiformat mit doppelter Genauigkeit verwenden, um das numerische Grundrauschen zu reduzieren.
@ein betroffener Bürger: Als Sie sagten: „Hier ist das Ergebnis mit einem Zeitschritt von 1 μs“, meinten Sie „Hier ist das Ergebnis mit einem Zeitschritt von 10 μs“?
@loudnoises Ich verwende die native macOS-Version. Aber ich sehe die gleichen Ergebnisse wie @ein besorgter Bürger.
@watkipet Ja, mea culpa. Das Bild zeigt, was ich eingeben wollte.
@watkipet Ah, danke für die Herausforderung, ich repliziere jetzt die Ergebnisse ganz gut. Obwohl LTspice normalerweise die wissenschaftliche Notation akzeptiert, erlaubt es dies nicht in der Anzahl der Punkte einer FFT. Im Ernst, wer will schon 1000000 abtippen.

Diese Antwort besteht aus mehreren Teilen. Ich stütze diese Antwort auf die Eigenschaften des FFT-Algorithmus. Ich bin mit der spezifischen LTSpice-Implementierung nicht vertraut, aber das von Ihnen gemeldete Verhalten ist genau das, was ich erwarten würde.

Die gebräuchlichsten FFT-Implementierungen arbeiten mit einer ganzzahligen Potenz von 2 Datenpunkten. Die meisten Implementierungen würden also Ihre 1.000.000 Datenpunkte auf 1.048.576 Datenpunkte auffüllen und die FFT darauf durchführen. Beachten Sie, dass diese Länge keine ganze Zahl von Sinuswellen ist.

Es gibt alternative Fourier-Transformationsmethoden, die die Daten unterschiedlich zerlegen. Diese werden normalerweise als Discrete Fourier Transform (DFT)-Methoden bezeichnet und sind sowohl langsamer als auch erheblich komplexer zu implementieren. In der Praxis sind sie mir so gut wie nie begegnet. Die FFT ist eine spezifische DFT-Implementierung, die erfordert, dass die Anzahl der Datenpunkte eine ganzzahlige Potenz von 2 (oder manchmal eine ganzzahlige Potenz von 4) ist.

Ich gehe also davon aus, dass LTSpice Ihre Daten auf 1.048.576 Datenpunkte auffüllt, wobei die hinzugefügten 48.576 Datenwerte am Ende eine Konstante enthalten.

Jetzt können Sie das Problem sehen: Ihr Puffer mit 1.048.576 Samples hat 1.000 Sinuswellen mit jeweils 1.000 Samples, gefolgt von 48.576 konstanten Werten. Dies kann nicht durch eine Summe von Sinuswellen mit einer Frequenz von 1 kHz dargestellt werden. Stattdessen zeigen die FFT-Ergebnisse die zusätzlichen Hochfrequenzwerte, die zur Rekonstruktion Ihres Signals benötigt werden.

Um festzustellen, ob dies das Problem ist, erstellen Sie einen Puffer mit 1.048.576 Samples, der eine Sinuswelle mit einer Periode von 1.024 Samples enthält. Die hohen Frequenzen sollten deutlich reduziert werden.

Nun zur Wirkung des Anwendens eines Fensters:

Der FFT-Algorithmus wickelt die Daten konzeptionell um, sodass auf den letzten Punkt der Eingabedaten der erste Punkt der Eingabedaten folgt. Das heißt, die FFT wird so berechnet, als ob die Daten unendlich sind, kreisförmig wiederholt, als Vektor mit der Sequenz: x[0], x[1], ..., x[1048574], x[1048575], x[ 0], x[1], ...

Dieses Umbrechen kann zu einem schrittweisen Übergang zwischen dem letzten Punkt im Datenpuffer und dem ersten Punkt führen. Dieser Stufenübergang erzeugt FFT-Ergebnisse mit großen (Neben-)Beiträgen von hohen Frequenzen. Der Zweck eines Fensters besteht darin, dieses Problem zu beseitigen. Die Fensterfunktion geht an beiden Enden auf Null, also wären in Ihrem Fall w[0] und w[999999] beide Null. Wenn die Daten mit dem Fenster multipliziert werden, werden die Werte am Anfang und am Ende Null, sodass es beim Umbruch keinen Schrittübergang gibt.

Die von Ihnen angewendete Fensterfunktion ändert den Frequenzinhalt des Puffers, Sie wählen eine Funktion, die einen akzeptablen Kompromiss darstellt. Eine Gaußsche ist ein guter Ausgangspunkt. Für jede praktische Anwendung, bei der Sie den Frequenzinhalt der Daten nicht genau steuern können, müssen Sie eine Fensterfunktion anwenden, um den aufgrund der Datenlänge implizierten Sprungübergang zu eliminieren.

Restprobleme:

Es gibt eine weitere potenzielle Quelle für hochfrequentes spektrales Rauschen in der FFT. Der Effekt nimmt mit der FFT-Länge zu und kann in einigen Fällen bei 1.000.000 Datenpunkten sichtbar sein.

Die innere Schleife des FFT-Algorithmus verwendet die Punkte um einen Kreis in der komplexen Ebene: e^(i*theta), wobei der Algorithmus 'theta' von 0 bis 2*pi in sukzessive feineren Schritten bis zur Anzahl der Punkte in der iteriert FFT. Das heißt, wenn Sie in einer der Iterationen der äußeren Schleife eine FFT mit 1.048.576 Abtastungen berechnen, berechnet die innere Schleife e^(i*theta), wobei theta = 2*pi * n/N, wobei N 1.048.576 ist , Iteration von n von 0 bis 1.048.575. Dies geschieht durch die naheliegende Methode der sukzessiven Multiplikation mit e^(i*2*pi/N).

Sie können das Problem sehen: Wenn N groß wird, kommt e^(i*2*pi/N) sehr nahe an 1 heran und wird N-mal multipliziert. Bei Gleitkommazahlen mit doppelter Genauigkeit sind die Fehler gering, aber ich denke, Sie können das resultierende Grundrauschen sehen, wenn Sie genau hinsehen. Bei Gleitkommazahlen mit einfacher Genauigkeit erzeugt die FFT-Berechnung selbst bei 1.000.000 Datenpunkten ein erhebliches Grundrauschen.

Es gibt alternative Techniken zur Berechnung von e^(i*theta), die dieses Problem beseitigen, aber die Implementierung ist komplexer. Ich musste eine solche Implementierung nur einmal erstellen.

In Bezug auf DFT versus FFT nennt es das Rechtsklickmenü in LTSPICE "FFT", während der Konfigurationsdialog es als "DFFT" bezeichnet. Wenn ich jetzt die Hilfedatei lese, sehe ich, was @a besorgter Bürger darüber erwähnt hat, dass LTSPICE eine Anzahl von Punkten akzeptiert, die keine Zweierpotenzen sind.

Möglicher Grund: -

Wenn Sie eine transiente Welle in einem Simulator zeichnen, interpoliert dieser zwischen realen Berechnungen, um die harte Arbeit zu minimieren und ein schnelleres Anzeigen des Ergebnisses auf dem Bildschirm zu ermöglichen.

Die Standardeinstellung für den maximalen Zeitschritt in LTSpice kann 100 us sein, und so haben Sie zwischen diesen Punkten interpolierte Ergebnisse, dh sie sind nicht perfekt und tragen zur Verzerrung bei, die in der FFT als Harmonische gesehen wird.

Versuchen Sie, Ihren maximalen Zeitschritt viel kleiner als den aktuellen Wert einzustellen, und sehen Sie, was passiert.