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?


@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.


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.


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).


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.