Cette réponse comporte plusieurs parties. Je base cette réponse sur les caractéristiques de l'algorithme FFT. Je ne connais pas l'implémentation spécifique de LTSpice, mais le comportement que vous signalez est exactement ce à quoi je m'attendrais.
Les implémentations FFT les plus courantes fonctionnent sur une puissance entière de 2 points de données. Ainsi, la plupart des implémentations remplissent vos 1 000 000 points de données à 1 048 576 points de données et effectuent la FFT à ce sujet. Notez que cette longueur n'est pas un nombre entier d'ondes sinusoïdales.
Il existe d'autres méthodes de transformation de Fourier qui décomposent les données différemment. Celles-ci portent généralement le nom de méthodes de transformation de Fourier discrète (DFT) et sont à la fois plus lentes et beaucoup plus complexes à mettre en œuvre. Je ne les ai presque jamais rencontrés dans des applications pratiques. La FFT est une implémentation DFT spécifique qui nécessite que le nombre de points de données soit une puissance entière de 2 (ou parfois une puissance entière de 4).
Donc, je suppose que LTSpice remplit vos données à 1 048 576 points de données, les 48 576 valeurs de données ajoutées à la fin contenant une constante.
Vous pouvez maintenant voir le problème: votre tampon de 1 048 576 échantillons a 1 000 ondes sinusoïdales, chacun de 1 000 échantillons, suivis de 48 576 valeurs constantes. Cela ne peut pas être représenté par une somme d'ondes sinusoïdales de fréquence 1 kHz. Au lieu de cela, les résultats FFT montrent les valeurs haute fréquence supplémentaires nécessaires pour reconstruire votre signal.
Pour déterminer si c'est le problème, créez un tampon de 1 048 576 échantillons contenant une onde sinusoïdale avec une période de 1 024 échantillons. Les hautes fréquences devraient être considérablement réduites en amplitude.
Maintenant, quant à l'effet de l'application d'une fenêtre:
L'algorithme FFT «enveloppe» conceptuellement les données, de sorte que le dernier point des données d'entrée est suivi du premier point des données d'entrée. Autrement dit, la FFT est calculée comme si les données étaient infinies, répétées circulairement, comme un vecteur avec la séquence: x [0], x [1], ..., x [1048574], x [1048575], x [ 0], x [1], ...
Cet habillage peut entraîner une transition par étapes entre le dernier point du tampon de données et le premier point. Cette transition par étapes génère des résultats FFT avec de grandes contributions (parasites) à partir des hautes fréquences. Le but d'une fenêtre est d'éliminer ce problème. La fonction de fenêtre passe à zéro aux deux extrémités, donc dans votre cas, w [0] et w [999999] seraient tous deux nuls. Lorsque les données sont multipliées par la fenêtre, les valeurs deviennent nulles au début et à la fin, il n'y a donc pas de transition par étapes au niveau de l'habillage.
La fonction de fenêtre que vous appliquez modifie le contenu fréquentiel du tampon, vous choisissez une fonction qui présente un compromis acceptable. Un gaussien est un bon point de départ. Pour toute application pratique dans laquelle vous ne pouvez pas contrôler précisément le contenu en fréquence des données, vous devrez appliquer une fonction de fenêtre pour éliminer la transition d'étape implicite en raison de la longueur des données.
Problèmes résiduels:
Il existe une autre source potentielle de bruit spectral à haute fréquence dans la FFT. L'effet augmente avec la longueur de la FFT, et cela peut être quelque chose que vous pouvez voir dans certains cas à 1 000 000 points de données.
La boucle interne de l'algorithme FFT utilise les points autour d'un cercle dans le plan complexe: e ^ (i * theta), où l'algorithme itère 'theta' de 0 à 2 * pi en étapes successivement plus fines, jusqu'au nombre de points dans le FFT. Autrement dit, si vous calculez une FFT sur 1 048 576 échantillons, dans l'une des itérations de la boucle externe, la boucle interne calculera e ^ (i * thêta), où thêta = 2 * pi * n / N, où N est 1 048 576 , itérant n de 0 à 1 048 575. Cela se fait par la méthode évidente de multiplication successive par e ^ (i * 2 * pi / N).
Vous pouvez voir le problème: lorsque N devient grand, e ^ (i * 2 * pi / N) devient très proche de 1, et il est multiplié N fois. Avec la virgule flottante double précision, les erreurs sont faibles, mais je pense que vous pouvez voir le bruit de fond résultant si vous regardez attentivement. Avec la virgule flottante simple précision, à 1 000 000 points de données, le calcul FFT produit lui-même un bruit de fond important.
Il existe des techniques alternatives pour calculer e ^ (i * theta) qui éliminent ce problème, mais la mise en œuvre est plus complexe. Je n'ai eu à créer une telle implémentation qu'une seule fois.