Warum haben FFTs Junk am Hochfrequenzende? Angenommen, ich simuliere diese Schaltung in LTSPICE:
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:
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?
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:
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 plotwinsize
allzu 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:
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 numdgt
auf einen Wert >7 gesetzt, was buchstäblich doppelte Genauigkeit ermöglicht:
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.
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.
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.
Markus Müller
Tony Stewart EE75
mkeith
laute Geräusche
Tony Stewart EE75