Ci sono diverse parti in questa risposta. Baso questa risposta sulle caratteristiche dell'algoritmo FFT. Non ho familiarità con l'implementazione specifica di LTSpice, ma il comportamento segnalato è esattamente quello che mi aspetterei.
Le implementazioni FFT più comuni funzionano con una potenza intera di 2 punti dati. Quindi, la maggior parte delle implementazioni riempirebbe i tuoi 1.000.000 di punti dati fino a 1.048.576 punti dati, ed eseguirà la FFT su questo. Si noti che questa lunghezza non è un numero intero di onde sinusoidali.
Esistono metodi alternativi di trasformata di Fourier che decompongono i dati in modo diverso. Questi di solito prendono il nome di metodi di trasformazione discreta di Fourier (DFT) e sono entrambi più lenti e considerevolmente più complessi da implementare. Non li ho quasi mai incontrati in applicazioni pratiche. La FFT è un'implementazione DFT specifica che richiede che il numero di punti dati sia una potenza intera di 2 (o talvolta una potenza intera di 4).
Quindi, suppongo che LTSpice stia riempiendo i tuoi dati di 1.048.576 punti dati, i 48.576 valori di dati aggiunti alla fine contengono una costante.
Ora puoi vedere il problema: il tuo buffer di 1.048.576 campioni ha 1.000 onde sinusoidali, ognuna di 1.000 campioni, seguite da 48.576 valori costanti. Questo non può essere rappresentato da una somma di onde sinusoidali di frequenza 1kHz. Invece, i risultati FFT mostrano i valori ad alta frequenza aggiuntivi necessari per ricostruire il segnale.
Per determinare se questo è il problema, creare un buffer di 1.048.576 campioni contenente un'onda sinusoidale con periodo 1.024 campioni. Le alte frequenze dovrebbero essere considerevolmente ridotte in grandezza.
Ora, per quanto riguarda l'effetto dell'applicazione di una finestra:
L'algoritmo FFT 'avvolge' concettualmente i dati, quindi l'ultimo punto dei dati di input è seguito dal primo punto dei dati di input. Cioè, la FFT viene calcolata come se i dati fossero infiniti, ripetuti circolarmente, come un vettore con la sequenza: x [0], x [1], ..., x [1048574], x [1048575], x [ 0], x [1], ...
Questo wrapping può comportare una transizione di passaggio tra l'ultimo punto nel buffer di dati e il primo punto. Questo passaggio di transizione genera risultati FFT con grandi contributi (spuri) dalle alte frequenze. Lo scopo di una finestra è eliminare questo problema. La funzione finestra va a zero su entrambe le estremità, quindi nel tuo caso w [0] e w [999999] sarebbero entrambi zero. Quando i dati vengono moltiplicati per la finestra, i valori diventano zero all'inizio e alla fine, quindi non vi è alcuna transizione di passaggio nell'involucro.
La funzione finestra che si applica altera il contenuto di frequenza del buffer, si sceglie una funzione che presenta un compromesso accettabile. Un gaussiano è un buon punto di partenza. Per qualsiasi applicazione pratica in cui non è possibile controllare con precisione il contenuto in frequenza dei dati, è necessario applicare una funzione finestra per eliminare la transizione di fase implicita a causa della lunghezza dei dati.
Problemi residui:
Esiste un'altra potenziale fonte di rumore spettrale ad alta frequenza nella FFT. L'effetto aumenta con la lunghezza della FFT e potrebbe essere qualcosa che puoi vedere in alcuni casi in 1.000.000 di punti dati.
L'algoritmo interno dell'algoritmo FFT utilizza i punti attorno a un cerchio nel piano complesso: e ^ (i * theta), in cui l'algoritmo itera 'theta' da 0 a 2 * pi in passaggi successivamente più fini, fino al numero di punti nel FFT. Cioè, se si calcola un FFT su 1.048.576 campioni, in una delle iterazioni del loop esterno, il loop interno calcolerà e ^ (i * theta), dove theta = 2 * pi * n / N, dove N è 1.048.576 , ripetendo n da 0 a 1.048.575. Questo viene fatto dall'ovvio metodo di moltiplicarsi successivamente per e ^ (i * 2 * pi / N).
Puoi vedere il problema: quando N diventa grande, e ^ (i * 2 * pi / N) diventa molto vicino a 1, e viene moltiplicato N volte. Con la virgola mobile a precisione doppia, gli errori sono piccoli, ma penso che puoi vedere il rumore di fondo risultante se guardi attentamente. Con virgola mobile a precisione singola, a 1.000.000 di punti dati il calcolo FFT stesso produce un rumore di fondo significativo.
Esistono tecniche alternative per il calcolo di e ^ (i * theta) che eliminano questo problema, ma l'implementazione è più complessa. Ho dovuto creare una tale implementazione solo una volta.