Ada beberapa bagian dari jawaban ini. Saya mendasarkan jawaban ini pada karakteristik algoritma FFT. Saya tidak terbiasa dengan implementasi LTSpice tertentu, tetapi perilaku yang Anda laporkan persis seperti yang saya harapkan.
Implementasi FFT paling umum beroperasi pada kekuatan bilangan bulat dari 2 titik data. Jadi, sebagian besar implementasi akan menambah 1.000.000 poin data Anda menjadi 1.048.576 poin data, dan melakukan FFT untuk itu. Perhatikan bahwa panjang ini bukan bilangan bulat dari gelombang sinus.
Ada metode Fourier Transform alternatif yang menguraikan data secara berbeda. Ini biasanya menggunakan metode Discrete Fourier Transform (DFT), dan keduanya lebih lambat dan jauh lebih kompleks untuk diimplementasikan. Saya hampir tidak pernah menemui mereka dalam aplikasi praktis. FFT adalah implementasi DFT spesifik yang membutuhkan jumlah titik data menjadi kekuatan integer 2 (atau terkadang kekuatan integer 4).
Jadi, saya berasumsi bahwa LTSpice adalah padding data Anda ke 1.048.576 poin data, yang ditambahkan nilai data 48.576 pada akhirnya berisi konstanta.
Sekarang Anda dapat melihat masalahnya: buffer Anda dari 1.048.576 sampel memiliki 1.000 gelombang sinus, masing-masing 1.000 sampel, diikuti oleh 48.576 nilai konstan. Ini tidak dapat diwakili oleh sejumlah gelombang sinus frekuensi 1kHz. Sebagai gantinya, hasil FFT menunjukkan nilai frekuensi tinggi tambahan yang diperlukan untuk merekonstruksi sinyal Anda.
Untuk menentukan apakah ini masalahnya, buat buffer dari 1.048.576 sampel yang mengandung gelombang sinus dengan periode 1.024 sampel. Frekuensi tinggi harus sangat dikurangi besarnya.
Sekarang, tentang efek penerapan jendela:
Algoritma FFT secara konseptual 'membungkus' data, sehingga titik terakhir dari data input diikuti oleh titik pertama dari data input. Yaitu, FFT dihitung seolah-olah data tidak terbatas, diulang secara melingkar, sebagai vektor dengan urutan: x [0], x [1], ..., x [1048574], x [1048575], x [ 0], x [1], ...
Pembungkus ini dapat menghasilkan transisi langkah antara titik terakhir di buffer data dan titik pertama. Transisi langkah ini menghasilkan hasil FFT dengan kontribusi besar (palsu) dari frekuensi tinggi. Tujuan jendela adalah untuk menghilangkan masalah ini. Fungsi jendela menjadi nol di kedua ujungnya, jadi dalam kasus Anda, w [0] dan w [999999] keduanya akan menjadi nol. Ketika data dikalikan dengan jendela, nilainya menjadi nol di awal dan akhir, sehingga tidak ada transisi langkah di bungkus.
Fungsi jendela yang Anda terapkan mengubah konten frekuensi buffer, Anda memilih fungsi yang menyajikan tradeoff yang dapat diterima. Gaussian adalah titik awal yang baik. Untuk aplikasi praktis di mana Anda tidak dapat secara tepat mengontrol konten frekuensi dari data, Anda harus menerapkan fungsi jendela untuk menghilangkan transisi langkah yang tersirat karena panjang data.
Masalah residual:
Ada sumber potensial kebisingan spektral frekuensi tinggi di FFT. Efeknya meningkat dengan panjang FFT, dan itu mungkin sesuatu yang dapat Anda lihat dalam beberapa kasus pada 1.000.000 titik data.
Algoritma lingkaran dalam FFT menggunakan titik-titik di sekitar lingkaran di bidang kompleks: e ^ (i * theta), di mana algoritma ini mengulangi 'theta' dari 0 hingga 2 * pi dalam langkah-langkah yang lebih baik berturut-turut, hingga jumlah titik dalam FFT. Yaitu, jika Anda menghitung FFT pada 1.048.576 sampel, di salah satu iterasi loop luar, loop dalam akan menghitung e ^ (i * theta), di mana theta = 2 * pi * n / N, di mana N adalah 1.048.576 sampel , iterasi n dari 0 hingga 1.048.575. Ini dilakukan dengan metode yang jelas untuk dikalikan berturut-turut dengan e ^ (i * 2 * pi / N).
Anda dapat melihat masalahnya: ketika N menjadi besar, e ^ (i * 2 * pi / N) menjadi sangat dekat dengan 1, dan dikalikan N kali. Dengan floating point presisi ganda, kesalahannya kecil, tapi saya pikir Anda bisa melihat lantai kebisingan yang dihasilkan jika Anda perhatikan dengan seksama. Dengan floating point presisi tunggal, pada 1.000.000 titik data, perhitungan FFT itu sendiri menghasilkan tingkat kebisingan yang signifikan.
Ada beberapa teknik alternatif untuk komputasi e (i * theta) yang menghilangkan masalah ini, tetapi implementasinya lebih kompleks. Saya hanya perlu membuat implementasi seperti itu sekali.