Cara menghitung secara efisien hanya koefisien rendah FFT nol-empuk

14

Saya punya algoritma yang nol pad urutan ke 4N, melakukan FFT, dan hanya menggunakan frekuensi terendah N poin dari 4N yang dihasilkan.

Ini sepertinya banyak pekerjaan yang sia-sia, ada ide bagaimana ini bisa dilakukan lebih cepat?

Mark Borgerding
sumber
@Dip. Saya akan menggunakan perpustakaan FFTW atau IMKL. Tentu saja saya bisa menggunakan perpustakaan kissfft saya, tapi itu dimulai dengan kecepatan kurang menguntungkan vs yang lain
Mark Borgerding
2
Saya menghapus komentar yang Anda respons karena saya bermaksud mengatakan penipisan-dalam-frekuensi tetapi menulis penipisan-dalam-waktu sebagai gantinya. Tapi lihat diagram kupu-kupu di sini. Jika Anda menulis beberapa kode untuk dua tahap pertama untuk -FFT untuk memperhitungkan jumlah besar nol dan melewatkan perkalian yang sesuai, Anda kemudian dapat memanggil subrutin perpustakaan FFT 4 kali untuk N -FFT di mana vektor input penuh". Tentu saja, Anda hanya membutuhkan N / 4 output dari setiap panggilan subrutin. 4N4NN/4
Dilip Sarwate

Jawaban:

2

Jika Anda hanya beberapa nampan maka yang berikut ini mungkin sangat efisien untuk Anda:
1. Cukup lakukan DFT pada setiap frekuensi yang Anda butuhkan.
2. Gunakan algoritma Goertzel untuk setiap frekuensi yang dipermasalahkan.

Yakub
sumber
Mark mengatakan dia membutuhkan bins dari 4 N , jadi 1) sepertinya bukan pilihan yang masuk akal. Algoritma Goertzel memiliki kelebihan seperti perhitungan on-line karena data diterima, penyimpanan kecil, dll, tetapi membutuhkan 2 N + 4 perkalian per bin, sementara setiap nampan dihitung sebagai evaluasi polinomial melalui aturan Horner hanya membutuhkan N multiplikasi. Jadi, 2) juga tampaknya bukan opsi yang masuk akal. N4N2N+4N
Dilip Sarwate
Anda benar, ketika membaca pertanyaan, saya entah bagaimana melewatkan detailnya. Ketika saya menjawab, saya berpikir, "Ya ampun, akan menyenangkan mengetahui berapa banyak sampah yang dia inginkan ..." Sepertinya saya harus membaca kembali pertanyaannya sebelum menjawab.
Jacob
2

Padding nol hingga panjang 4X, menghitung FFT yang lebih panjang, dan kemudian hanya menggunakan nampan 1/4 terbawah menghasilkan hasil yang hampir sama dengan interpolasi Sinc windowed dari FFT panjang asli.

Jadi cukup gunakan panjang FFT asli dan interpolasi menggunakan kernel interpolasi Sinc 3 fase dengan lebar jendela yang sesuai.

hotpaw2
sumber
0

Zero padding dalam domain waktu memberi Anda solusi frekuensi yang lebih tinggi tetapi tidak ada informasi baru, sehingga memberikan interpolasi pada domain frekuensi. Bergantung pada sifat sinyal Anda dan ketelitian yang dibutuhkan, Anda mungkin bisa mendapatkan titik frekuensi tambahan dengan FFT reguler dari titik N dan melakukan interpolasi yang sesuai (linier, spline, pchip, sinc, dll).

Hilmar
sumber
x(z)=saya=0N-1xsayazsayaxsayaN-1Nαn,0nN-1α=exp(-j2π/N)NAkar ke-satu untuk mendapatkan angka X n = x ( α n ) . Ini adalah nilai-nilai x ( z ) pada N yang berjarak sama pada titik-titik pada lingkaran unit. Yang benar - benar kita inginkan adalah nilai x ( z ) pada β n , 0 n N - 1 di mana β = exp ( - j 2 π / 4 N ) , yang merupakanNXn=x(αn)x(z)Nx(z)βn,0nN-1β=exp(-j2π/4N) menunjuk padakuadran pertamadari lingkaran unit. Saya tidak melihat bagaimana interpolasi linear, spline dll akan bekerja. Tolong jelaskan. N
Dilip Sarwate
β4=αx(β4k)x(β4k)=x(αk)
Saya menduga akan sulit untuk melakukan interpolasi yang layak lebih cepat daripada melakukan FFT yang lebih besar.
Mark Borgerding
Katakanlah Anda memiliki 128 titik FFT dan laju sampel 12800Hz. FFT 128 titik memberikan nilai pada 0Hz, 100Hz, 200 Hz, 300Hz, dll. Apa yang dilakukan zero padding adalah meningkatkan resolusi frekuensi menjadi 0 Hz, 25Hz, 50 Hz, 100Hz dll. Ini dapat dilihat sebagai masalah interpolasi. Bagi saya matematis precised Anda perlu melakukan intpolasi melingkar sinc urutan 128. Itu tentu saja tidak sepadan dengan gangguan itu, tetapi tergantung pada aplikasi dan ketelitian yang dibutuhkan interpolasi dengan urutan jauh lebih rendah akan cukup baik
Hilmar