FFT untuk rentang frekuensi tertentu.

11

Saya ingin mengonversi sinyal ke domain frekuensi. Rentang frekuensi yang diinginkan adalah 0.1 Hzuntuk 1 Hzdan resolusi frekuensi 0.01 Hz.

Dengan laju pengambilan sampel sebesar 30 Hz, FFT memberikan komponen frekuensi hingga 15 Hz. Meningkatkan laju pengambilan sampel memberikan resolusi frekuensi yang lebih baik. Namun, FFT memberikan rentang frekuensi yang lebih luas. Dalam kasus saya, saya hanya ingin 0.1 Hzuntuk 1 Hz, FFT memberikan hingga 15 Hz(Ekstra perhitungan).

Pertanyaan saya adalah, adakah cara standar yang dapat saya lakukan untuk menghitung domain frekuensi dari sinyal dengan rentang frekuensi tertentu dan resolusi tinggi?

NcJie
sumber
2
Kedengarannya seperti Anda ingin Zoom FFT arc.id.au/ZoomFFT.html
endolith
Jika Anda hanya melakukan DFT standar dengan laju sampling 2 Hz dan durasi 100 detik, Anda akan mendapatkan pita frekuensi dari 0 hingga 1 Hz dengan resolusi 0,01 Hz. Hanya 10% dari sampel Anda akan berada di luar band yang Anda minati. Apakah benar-benar layak untuk mengerjakan rincian algoritma "tidak terlalu standar" untuk meningkatkan efisiensi perhitungan yang relatif kecil ini?
The Photon
Kendalanya adalah, durasinya harus sesingkat mungkin. 100-an terlalu lama. Kami membutuhkan sekitar 10+ s
NcJie

Jawaban:

5

Saya pikir solusi terbaik untuk masalah Anda adalah dengan menggunakan kicauan-DFT. Ini seperti kaca pembesar untuk rentang frekuensi tertentu. Ini lebih efisien daripada implementasi langsung DFT (tanpa FFT), karena algoritma FFT dapat digunakan dengan beberapa pra-dan pasca-pemrosesan yang sesuai. Anda pada dasarnya perlu memodulasi sinyal Anda dengan sinyal kicauan, kemudian memfilter menggunakan FFT, dan kemudian lagi kicauan-memodulasi sinyal Anda untuk mendapatkan respons frekuensi yang diinginkan. Lihat di sini dan di sini untuk perincian tentang bagaimana menerapkan kicauan-DFT.

Matt L.
sumber
2

Ada juga kemungkinan menggunakan frekuensi warping (juga berfungsi sebagai kaca pembesar di mana Anda mendapatkan resolusi yang ditingkatkan dalam rentang minat freqency Anda untuk FFT ukuran yang sama dengan mengorbankan resolusi yang lebih rendah pada frekuensi yang lebih tinggi). Namun, Anda tidak menyimpan MIPS karena ukuran FFT tidak berkurang dan frekuensi warping jauh dari murah.

Jika Anda hanya ingin menghitung tempat sampah tertentu di FFT (dan dengan demikian menghemat MIPS) ada beberapa metode untuk melakukannya. Misalnya sliding DFT. Referensi dalam makalah ini memberikan penjelasan yang sangat bagus http://www.comm.utoronto.ca/~dimitris/ece431/slidingdft.pdf . Saya juga berpikir goertzel algo melakukan sesuatu yang serupa tetapi saya tidak mengetahuinya.

Lalu ada opsi downsampling sebelum FFT. Itu mungkin juga akan menghemat beberapa MIPS.

Sunting: Hanya untuk mengklarifikasi komentar mengenai algoritma Goertzel tidak berguna. Dengan langsung memasukkan nilai ke dalam ekspresi yang ditemukan di bagian bawah halaman wiki ini http://en.wikipedia.org/wiki/Goertzel_algorithm maka pendekatan Goertzel akan lebih kompleks daripada FFT ketika ukuran FFT yang dibutuhkan lebih besar dari 128 (dengan asumsi ukuran FFT adalah faktor 2 dan implementasi radix-2).

Namun, ada faktor-faktor lain yang harus diperhitungkan yang mendukung Goertzel. Hanya dengan mengutip halaman wiki: "Implementasi FFT dan platform pemrosesan memiliki dampak yang signifikan pada kinerja relatif. Beberapa implementasi FFT [9] melakukan perhitungan bilangan kompleks internal untuk menghasilkan koefisien on-the-fly, secara signifikan meningkatkan" biaya K per unit of work. "Algoritma FFT dan DFT dapat menggunakan tabel nilai koefisien pra-komputasi untuk efisiensi numerik yang lebih baik, tetapi ini membutuhkan lebih banyak akses ke nilai koefisien yang disangga dalam memori eksternal, yang dapat mengarah pada peningkatan pertikaian cache yang melawan beberapa keunggulan numerik . "

"Kedua algoritma mendapatkan sekitar 2 faktor efisiensi saat menggunakan data input bernilai nyata dan bukan kompleks. Namun, keuntungan ini wajar untuk algoritma Goertzel tetapi tidak akan tercapai untuk FFT tanpa menggunakan varian algoritma tertentu yang khusus untuk mentransformasikan real - nilai data. "

niaren
sumber
1
DFT geser sebenarnya berguna dalam konteks analisis spektrum waktu nyata, di mana urutan input sangat panjang dan spektrum perlu dihitung ulang secara berkala. Algoritma Goertzel sangat efisien jika hanya beberapa nilai DFT yang perlu dihitung. Ini tidak akan berguna untuk menyelesaikan masalah yang diberikan karena jumlah titik frekuensi yang diinginkan terlalu besar.
Matt L.
Terima kasih @MattL. untuk menunjukkan kelemahan Algoritma Goertzel.
NcJie
1

Δf=fsN
fsNN

Ns(t)fcfbx(n)s(t)x(n)=s(n/fs)

x~(n)=x(n)e-j2πk0/N
k0=fc/fsfbfb+fcf~sfbx~(n)M.=fs/fbN

s(t)M.

Deve
sumber