Apa sampah di akhir FFT saya di LTSPICE?

8

Mengapa FFT memiliki sampah di ujung frekuensi tinggi? Misalkan saya pergi untuk mensimulasikan rangkaian ini di LTSPICE:

skema

mensimulasikan rangkaian ini - Skema dibuat menggunakan CircuitLab

Di mana parameter sinus dan simulasi LTSPICE adalah:

SINE(0 1 1K 0 0 0 1000)
.tran 1 startup

Lalu saya meminta LTSPICE untuk memberi saya FFT tanpa jendela dan 1.000.000 poin: FFT

Untuk apa semua sampah pada akhirnya? Saya harapkan hanya satu lonjakan pada 1KHz, bukan tambahan pada 3KHz, dll. Apakah ini terjadi pada semua FFT? Apa yang mengendalikan paku yang Anda dapatkan setelah fundamental Anda?

watkipet
sumber
Bisakah Anda benar-benar menunjukkan frekuensi lain? Apakah mereka semua kelipatan ganjil 1 kHz? Dalam hal ini, ada sesuatu yang mengganggu Anda "sempurna" sinus agar terlihat lebih "persegi panjang", dan mungkin saja akurasi numerik yang digunakan ltspice secara internal.
Marcus Müller
1
Saya tidak akan melihat di bawah -100dB tetapi mulai dengan harmonik ke-3, tidak ada jendela yang tampaknya menjadi masalah
Tony Stewart Sunnyskyguy EE75
1
Bisa ada hubungannya dengan kompresi bentuk gelombang. Lihat pertanyaan lain ini untuk perincian lebih lanjut dan cara memeriksa apakah itu masalahnya. electronics.stackexchange.com/questions/338292/…
mkeith
Saya tidak dapat mereproduksi data ini, versi LTspice saya ingin lebih dari 1e6 poin simulasi untuk mendapatkan FFT 1e6 poin, yaitu langkah waktu maksimum 1e-6.
loudnoises
Apakah Anda memerlukan kuasi puncak untuk mencocokkan spektrum audio untuk modulasi BW ??
Tony Stewart Sunnyskyguy EE75

Jawaban:

4

@ D. Jawaban Brown sudah sangat bagus, jadi saya hanya akan menambahkan beberapa hal kecil. Algoritma LTspice adalah khusus dan menerima sejumlah poin non-kekuatan-dua. Ini tidak berarti bahwa resolusi itu tidak penting. Namun, 1kHz lebih dari 1s berarti jumlah periode integer, jadi tidak perlu untuk windowing atau pemulusan binomial untuk mengurangi noise (pengaturan di jendela FFT). Namun, apa yang @mkeith sebutkan, dan itu adalah, secara default, LTspice menggunakan kompresi bentuk gelombang (300 poin per tampilan, IIRC), yang berarti bahwa setiap titik lain berkurang dan resolusi bentuk gelombang berkurang. Solusi untuk ini adalah timestep yang lebih ketat, atau .option plotwinsize=0, yang terakhir menghilangkan kompresi bentuk gelombang. Inilah yang terjadi ketika opsi ini ditambahkan, tetapi tidak ada catatan waktu yang dikenakan:

standar

Mungkin ini yang Anda lihat, kurang lebih, jadi untuk apa pilihannya? Anda mensimulasikan bentuk gelombang 1 kHz selama periode 1 detik . Sirkuit, jika dapat disebut itu, adalah sumber dan beban sederhana, dan sumbernya adalah harmonik, tugas yang mudah untuk pemecah matriks, jadi LTspice, seperti semua mesin SPICE, jika terasa turunannya halus, ia akan menggandakan timestepnya untuk tidak memperlambat simulasi, dan itu akan terus menggandakannya sampai batas internal mencapai, pada titik mana ia akan terbang di atas simulasi. Hasilnya adalah gelombang kasar, yang bahkan tidak plotwinsizedapat meningkatkan terlalu banyak.

Obat lain, timestep yang diberlakukan, sekarang diperlukan untuk meningkatkan resolusi. Berikut hasil dengan 1 s timestep:μ

10u

Ini lebih baik, tetapi Anda melakukan FFT 1 juta poin, yang membutuhkan, mungkin tidak mengejutkan, 1 juta poin waktu, sehingga catatan waktu maksimum harus ditetapkan ke 1 s. Selain itu, opsi diatur ke nilai> 7 yang, menurut buku ini, memungkinkan presisi ganda:μnumdgt

sangat

Masih ada lantai kebisingan yang sedikit goyah, tetapi levelnya sekarang kurang dari -250dB. Ini mendekati presisi alat berat. Membuat catatan waktu 1/1048576 (2 ^ -20) tidak meningkatkan hasil (Anda dapat memeriksa sendiri).

Pada akhirnya, itu tergantung pada seberapa banyak lantai kebisingan yang Anda bersedia terima. Komentar @Tony Stewart adalah sensibilitas praktis, di bawah 100 ~ 120dB berarti kurang dari 1 ~ 10 V ke 1V, yang merupakan pencapaian yang cukup.μ

warga negara yang peduli
sumber
Terima kasih telah mengerjakan pekerjaan untuk jawaban ini. Sebagai tambahan, telah menyoroti bagi saya bahwa LTspice melakukan secara drastis berbeda pada MacOS dibandingkan dengan Windows. (Saya berasumsi ini adalah versi Windows)
loudnoises
@ suara keras Ya, meskipun di bawah Wine, bukan itu yang penting. Saya telah melihat beberapa poin, di sana-sini, di Yahoo LTspice Group, tetapi karena saya bukan pengguna Mac, saya tidak memaksakannya. Bisa jadi itu juga masalah pengaturan, tersembunyi di bawah kap yang berbeda, tapi sungguh, saya tidak yakin.
warga negara yang peduli
Luar biasa! Sekarang, melihat kembali file bantuan LTSPICE, saya seharusnya memperhatikan ini: "LTspice menggunakan algoritma FFT eksklusif yang memungkinkan jumlah titik data acak, yaitu, tidak terbatas pada kekuatan 2. Ketika Anda berharap untuk melakukan FFT dari simulasi Anda data, Anda mungkin ingin mematikan kompresi gelombang, menetapkan langkah waktu maksimum, dan bahkan mungkin menggunakan format file gelombang presisi ganda untuk mengurangi lantai kebisingan numerik. "
watkipet
@ seorang warga negara yang peduli: Ketika Anda menyatakan, "Inilah hasilnya dengan timestep 1μs", maksud Anda, "Inilah hasilnya dengan timestep 10μs"?
watkipet
@loudnoises Saya menggunakan versi asli macOS. Tapi saya melihat hasil yang sama dengan @a warga yang peduli.
watkipet
15

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.

D. Brown
sumber
Mengenai DFT versus FFT, menu klik kanan di LTSPICE menyebutnya "FFT" sementara dialog configure menyebutnya "DFFT". Sekarang, membaca file bantuan, saya melihat apa yang disebutkan oleh warga negara yang peduli tentang LTSPICE menerima jumlah poin yang tidak berdaya dua.
watkipet
0

Kemungkinan alasan: -

Ketika Anda menggambar gelombang transient di dalam simulator, ia menginterpolasi antara perhitungan nyata sehingga meminimalkan kerja keras yang dilakukan dan memungkinkan hasil yang lebih cepat ditampilkan di layar.

Pengaturan default untuk timestep maksimum di LTSpice mungkin 100 us dan jadi di antara titik-titik ini Anda memiliki hasil yang diinterpolasi, yaitu mereka tidak sempurna dan berkontribusi terhadap distorsi yang terlihat sebagai harmonik dalam FFT.

Coba tetapkan timestep maksimum Anda menjadi jauh lebih kecil dari apa yang sekarang dan lihat apa yang terjadi.

Andy alias
sumber