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.