Warum haben FFTs am Hochfrequenzende Müll? Angenommen, ich gehe, um diese Schaltung in LTSPICE zu simulieren:
simulieren Sie diese Schaltung - Schema erstellt mit CircuitLab
Wo 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:
Wofür ist der ganze Müll am Ende? Ich würde nur eine Spitze bei 1 kHz erwarten, keine zusätzliche bei 3 kHz usw. Passiert dies allen FFTs? Was steuert die Spitzen, die Sie nach Ihrem Fundament erhalten?
Antworten:
@ D.Browns Antwort 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 ohne Zweierpotenz. Dies bedeutet nicht, dass die Auflösung nicht wichtig ist. 1kHz über 1s bedeutet jedoch eine ganzzahlige Anzahl von Perioden, sodass keine Fensterung oder Binomialglättung erforderlich ist, um das Rauschen zu reduzieren (Einstellungen im FFT-Fenster). Was jedoch @mkeith erwähnt hat, ist, dass LTspice standardmäßig eine Wellenformkomprimierung (300 Punkte pro Anzeige, IIRC) verwendet, was bedeutet, dass alle anderen Punkte reduziert werden und die Auflösung der Wellenform leidet. Die Lösung hierfür ist entweder ein engerer Zeitschritt oder
.option plotwinsize=0
der letzte, der die Wellenformkomprimierung eliminiert. Folgendes passiert, wenn diese Option hinzugefügt wird, aber kein Zeitschritt festgelegt wird:Dies ist wahrscheinlich das, was Sie mehr oder weniger sehen. Wofür ist also 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ühsame Aufgabe für den Matrixlöser verdoppelt seinen Zeitschritt, um die Simulation nicht zu verlangsamen, und verdoppelt ihn weiter, bis ein internes Limit erreicht ist. An diesem Punkt fliegt er über die Simulation. Das Ergebnis ist eine grobe Wellenform, die sich nicht einmal
plotwinsize
zu stark verbessern kann.numdgt
Es gibt immer noch ein leicht wackeliges Grundrauschen, aber der Pegel liegt jetzt unter -250 dB. Dies kommt der Maschinenpräzision nahe. Wenn Sie den Zeitschritt 1/1048576 (2 ^ -20) ausführen, werden die Ergebnisse nicht verbessert (Sie können dies selbst überprüfen).
quelle
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 gängigsten 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 ausführen. Beachten Sie, dass diese Länge keine ganzzahlige Anzahl von Sinuswellen ist.
Es gibt alternative Fourier-Transformationsmethoden, die die Daten unterschiedlich zerlegen. Diese Methoden werden normalerweise als DFT-Methoden (Discrete Fourier Transform) bezeichnet und sind sowohl langsamer als auch erheblich komplexer zu implementieren. Ich bin ihnen in praktischen Anwendungen fast nie begegnet. Die FFT ist eine spezifische DFT-Implementierung, bei der die Anzahl der Datenpunkte eine ganzzahlige Potenz von 2 (oder manchmal eine ganzzahlige Potenz von 4) betragen muss.
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 Abtastwerten hat 1.000 Sinuswellen mit jeweils 1.000 Abtastwerten, 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 erforderlich sind.
Um festzustellen, ob dies das Problem ist, erstellen Sie einen Puffer mit 1.048.576 Abtastwerten, der eine Sinuswelle mit einer Periode von 1.024 Abtastwerten enthält. Die hohen Frequenzen sollten in ihrer Größe erheblich reduziert werden.
Nun zum Effekt der Anwendung eines Fensters:
Der FFT-Algorithmus "umschließt" die Daten konzeptionell, 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 ein Vektor mit der Sequenz: x [0], x [1], ..., x [1048574], x [1048575], x [ 0], x [1], ...
Diese Umhüllung kann zu einem schrittweisen Übergang zwischen dem letzten Punkt im Datenpuffer und dem ersten Punkt führen. Dieser Schrittübergang erzeugt FFT-Ergebnisse mit großen (Stör-) Beiträgen von hohen Frequenzen. Der Zweck eines Fensters besteht darin, dieses Problem zu beseitigen. Die Fensterfunktion geht an beiden Enden auf Null. In Ihrem Fall wären also 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 beim Umbruch kein Schrittübergang stattfindet.
Die Fensterfunktion, die Sie anwenden, ändert den Frequenzinhalt des Puffers. Sie wählen eine Funktion aus, die einen akzeptablen Kompromiss darstellt. Ein Gaußscher 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 impliziten Schrittübergang aufgrund der Datenlänge zu eliminieren.
Restprobleme:
Es gibt eine weitere mögliche Quelle für hochfrequentes spektrales Rauschen in der FFT. Der Effekt nimmt mit der FFT-Länge zu und kann in einigen Fällen an 1.000.000 Datenpunkten auftreten.
Die innere Schleife des FFT-Algorithmus verwendet die Punkte um einen Kreis in der komplexen Ebene: e ^ (i * theta), wobei der Algorithmus 'Theta' in aufeinanderfolgend feineren Schritten von 0 bis 2 * pi bis zur Anzahl der Punkte in der wiederholt FFT. Das heißt, wenn Sie eine FFT für 1.048.576 Abtastwerte in einer der Iterationen der äußeren Schleife berechnen, berechnet die innere Schleife e ^ (i * Theta), wobei Theta = 2 * pi * n / N, wobei N 1.048.576 ist iteriert n von 0 auf 1.048.575. Dies geschieht durch die offensichtliche Methode der sukzessiven Multiplikation mit e ^ (i * 2 * pi / N).
Sie können das Problem sehen: Wenn N groß wird, wird e ^ (i * 2 * pi / N) sehr nahe an 1 und es wird N-mal multipliziert. Mit Gleitkomma mit doppelter Genauigkeit sind die Fehler gering, aber ich denke, Sie können das resultierende Grundrauschen sehen, wenn Sie genau hinschauen. Mit Gleitkomma mit einfacher Genauigkeit erzeugt die FFT-Berechnung selbst bei 1.000.000 Datenpunkten ein signifikantes 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.
quelle
Möglicher Grund: -
Wenn Sie eine transiente Welle in einem Simulator zeichnen, interpoliert sie zwischen realen Berechnungen, um die harte Arbeit zu minimieren und ein schnelleres Ergebnis auf dem Bildschirm anzuzeigen.
Die Standardeinstellung für den maximalen Zeitschritt in LTSpice ist möglicherweise 100 us. Zwischen diesen Punkten haben Sie also Ergebnisse interpoliert, dh sie sind nicht perfekt und tragen zu Verzerrungen bei, die in der FFT als Harmonische angesehen werden.
Versuchen Sie, Ihren maximalen Zeitschritt so einzustellen, dass er viel kleiner als der aktuelle ist, und sehen Sie, was passiert.
quelle