Seberapa pentingkah menggunakan kekuatan 2 saat menggunakan FFT?

8

Inilah masalahnya. Saya memiliki data array 2D, kolom pertama mewakili data waktu dan kolom kedua mewakili data respons sinusoidal, berdasarkan data waktu. Saya menerapkan fft dan saya mendapatkan frekuensi saya (yang saya mulai dengan) di tempat sampah tertentu seperti yang saya harapkan dan saya menemukan amplitudo dan sudut fase dari tempat sampah itu. Sekarang masalahnya adalah saya memiliki pengaturan yang sama tetapi dengan lebih banyak titik data, saya menerapkan fft lagi dan perubahan nomor bin (yang normal dan itu yang saya harapkan), amplitudo sama tetapi sudut fase berbeda) pertama apakah ini normal? kedua, pendekatan apa yang harus saya ambil? Terima kasih

PS: tak satu pun dari set up (disebutkan di atas) memberikan data panjang daya 2, katakan yang pertama memberikan 1620 poin data dan yang kedua memberikan 1745 poin data, jadi harus mengambil kekuatan berikutnya 2 untuk keduanya dari awal?

perempuan sihir tua buruk
sumber

Jawaban:

5

Perpustakaan FFT modern, seperti FFTW dan Apple's Accelerate framework dapat melakukan FFT non-power-of-2 dengan sangat efisien, selama semua pembagi utama dari panjang komposit cukup kecil (2,3,5, dll.)

Kekuatan 2 menjadikannya lebih mudah (sekitar 1 halaman kode sumber) jika Anda harus mengkodekan FFT Anda sendiri karena alasan tertentu, atau sebaliknya dibatasi untuk panjang program maksimal (atau gerbang FPGA, dll.)

Untuk pengukuran fase, mungkin lebih mudah untuk melakukan pergeseran gigi (pra-putar data dengan N / 2) untuk mereferensikan fase FFT ke pusat jendela data, di mana rasio kerataan / keanehan, dan dengan demikian fase tidak akan berubah atau bergantian dengan nomor nampan (untuk fase yang sama di tengah jendela data itu) bahkan untuk sinyal yang non-periodik dalam panjang FFT, saat Anda memvariasikan panjangnya.

hotpaw2
sumber
Hai hotpaw2, maaf saya lupa menyebutkan bahwa saya menggunakan matlab FFT, apakah ada bedanya? Terima kasih lagi.
lamia
Matlab dapat menggunakan pustaka FFT modern, seperti FFTW, secara internal. Periksa dokumentasi matlab untuk versi Anda.
hotpaw2
Juga, @ hotpaw2, saya sudah menggunakan fftshift ...
lamia
Dengan fftshift, letakkan data windows center di mana Anda ingin mengukur fase. Atau hitung fase dari pusat mundur dalam waktu menggunakan estimasi frekuensi yang baik.
hotpaw2
5

Tidak ada yang secara inheren 'ajaib' tentang melakukan kekuatan 2 DFT, selain fakta bahwa melakukan kekuatan 2 DFT memungkinkan seseorang untuk melakukan DFT di HAI(NlHaig(N)) dari pada HAI(N2). Jadi kekuatan 2 DFT, ( Algoritma yang melakukan ini dikenal sebagai FFT), memungkinkan Anda untuk hanya mempercepat perhitungan DFT Anda dengan faktor yang sangat besar.

Saya menerapkan fft lagi dan perubahan nomor bin (yang normal dan di mana saya harapkan), amplitudo sama tetapi sudut fasa berbeda) pertama apakah ini normal?

Jika Anda melakukan DFT lebih besar dari vektor data Anda, pada dasarnya Anda akan melakukan interpolasi dalam domain frekuensi. Dengan demikian, puncak baru Anda mungkin bukan puncak setara lama yang pertama kali Anda deteksi, sebelum Anda mengambil DFT yang lebih besar. Dan karena tidak sama, Anda pada dasarnya memilih basis eksponensial kompleks (sinus plus kosinus) yang berbeda kali ini, artinya Anda kemungkinan memiliki nilai fase yang berbeda, ya.

PS: tak satu pun dari set up (disebutkan di atas) memberikan data panjang daya 2, katakan yang pertama memberikan 1620 poin data dan yang kedua memberikan 1745 poin data, jadi harus mengambil kekuatan berikutnya 2 untuk keduanya dari awal?

Ya, jika Anda ingin mengambil kekuatan 2 FFT, maka Anda cukup memilih kekuatan FFT 2 panjang berikutnya yang lebih besar dari panjang catatan data Anda.

saya tidak selalu ingin atau tidak ingin mengambil kekuatan 2 FFT (kinerja waktu bukan masalah saya sama sekali), lebih tepatnya, apakah saya perlu?

Anda tidak boleh mengambil FFT dengan panjang kurang dari panjang catatan Anda, kecuali jika Anda ingin membuang data. Pertanyaan "Seberapa besar kebutuhan FFT saya", dengan asumsi panjang FFT lebih besar dari panjang catatan data Anda, kemudian dengan cepat menjadi ketergantungan aplikasi. Biasanya Anda bisa lolos dengan panjang FFT sama dengan panjang catatan Anda. Namun, terkadang Anda ingin memilih puncak dari FFT yang 'lebih halus'. Dalam hal ini, Anda dapat mengambil panjang FFT yang lebih besar, (2 kali lebih banyak, 3 kali lebih banyak, 10 kali lebih banyak, dll), dan Anda akan menginterpolasi puncak Anda dalam domain frekuensi. Namun, tidak ada angka ajaib. Ingatlah bahwa rincian hasil FFT Anda selalufsN.

Tarin Ziyaee
sumber
Terima kasih user4619 untuk jawabannya, saya tidak selalu ingin atau tidak ingin mengambil kekuatan 2 FFT (kinerja waktu bukan masalah saya sama sekali), lebih seperti, apakah saya perlu?
lamia
Juga, @ user4619, karena Anda menyebutkan bahwa ya sudut fase bisa berubah, mana yang harus saya percayai yang memberi saya jawaban yang benar? (saya tidak tahu sudut fase sebelum tangan atau amplitudo, saya hanya tahu frekuensi sebelum tangan) ... terima kasih
lamia
@lamia Power-of-2 hanya untuk masalah kecepatan. Hanya itu saja. Tidak ada yang ajaib tentang hal itu sebaliknya. Tentang sudut fase - ingat bahwa meskipun sudut fase Anda berubah, begitu juga frekuensi puncak Anda. Jika Anda melakukan FFT 1000 poin, Anda memilih nampan frekuensi 100 sebagai puncak, dan menemukan sudut fase-nya. Itu betul. Kemudian Anda melakukan FFT 343212 poin, dan memilih frekuensi 34321 sebagai puncak, dan memiliki sudut fase yang berbeda. Itu masih benar. "Fase" adalah fungsi frekuensi. (Jika Anda merasa
terbantu,
@lamia Juga lihat hasil edit saya.
Tarin Ziyaee
Terima kasih banyak untuk penjelasan yang Anda berikan :)
lamia
3

Menampilkan jawaban @ user4619:

Menggunakan IPython, yang mirip dengan Matlab

In[1]: fft(arange(2**22))
1 loops, best of 3: 354 ms per loop

In[2]: fft(arange(4*1000*90*12)) # close to 2**22
# equal to 2*2 * 2*5*2*5*2*5 * 3*3*2*5 * 2*2*3
1 loops, best of 3: 295 ms per loop

In[2]: fft(arange(2**22+1))
1 loops, best of 3: 14 s per loop

Jika Anda menggunakan bilangan prima, agak penting (faktor 50!). Jika Anda menggunakan angka yang memiliki faktor rendah, tidak penting. Tetapi melakukannya dengan hanya bilangan prima hanya melakukannya lebih cepat - itu tidak mengubah jawaban sama sekali.

Scott
sumber