Bagaimana cara mengambil FFT dari data spasi yang tidak rata?

55

Algoritma Fast Fourier Transform menghitung dekomposisi Fourier dengan asumsi bahwa titik inputnya sama-sama diberi spasi dalam domain waktu, . Bagaimana jika tidak? Apakah ada algoritma lain yang bisa saya gunakan, atau beberapa cara saya bisa memodifikasi FFT, untuk menjelaskan apa yang secara efektif tingkat sampling variabel?tk=kT

Jika solusinya tergantung pada bagaimana sampel didistribusikan, ada dua situasi khusus yang paling saya minati:

  • Laju pengambilan sampel konstan dengan jitter: mana adalah variabel yang didistribusikan secara acak. Misalkan aman untuk mengatakan .tk=kT+δtkδtk|δtk|<T/2
  • Menjatuhkan sampel dari laju pengambilan sampel yang konstan: manatk=nkTnkZk

Motivasi: pertama-tama, ini adalah salah satu pertanyaan dengan suara lebih tinggi pada proposal untuk situs ini. Tetapi di samping itu, beberapa waktu yang lalu saya terlibat dalam diskusi tentang penggunaan FFT (ditanyakan oleh pertanyaan tentang Stack Overflow ) di mana beberapa data input dengan titik sampel tidak merata muncul. Ternyata cap waktu pada data salah, tetapi membuat saya berpikir tentang bagaimana seseorang dapat mengatasi masalah ini.

David Z
sumber

Jawaban:

40

Ada berbagai macam teknik untuk FFT non-seragam, dan yang paling efisien semua dimaksudkan untuk kasus Anda: sampel kuasi-seragam. Gagasan dasarnya adalah untuk mengoleskan sumber sampel yang tidak rata ke dalam kotak seragam yang sedikit lebih halus ("oversampled") melalui konvolusi lokal terhadap orang Gaussi. FFT standar kemudian dapat dijalankan pada grid seragam oversampled, dan kemudian konvolusi terhadap Gaussians dapat dibatalkan. Implementasi yang baik adalah sesuatu seperti kali lebih mahal daripada FFT standar dalam dimensi , di mana adalah sesuatu yang mendekati 4 atau 5.CddC

Saya sarankan membaca Mempercepat Transformasi Fourier Nonuniform oleh Greengard dan Lee.

Ada juga ada cepat, yaitu, atau lebih cepat, teknik ketika sumber dan / atau poin evaluasi jarang, dan ada juga generalisasi untuk operator integral yang lebih umum, misalnya, Operator Fourier Integral. Jika Anda tertarik pada teknik ini, saya sarankan Sparse Fourier mentransformasikan melalui algoritma kupu-kupu dan algoritma kupu - kupu cepat untuk perhitungan Fourier Integral Operator . Harga yang dibayarkan dalam teknik ini versus FFT standar adalah koefisien yang jauh lebih tinggi. Penafian: Penasihat saya menulis / menulis ulang kedua makalah itu, dan saya telah menghabiskan waktu yang cukup untuk memparalelkan teknik-teknik itu.O(NdlogN)

Poin penting adalah bahwa semua teknik di atas adalah perkiraan yang dapat dibuat akurat secara sewenang-wenang dengan mengorbankan runtimes yang lebih lama, sedangkan algoritma FFT standar tepat.

Jack Poulson
sumber
9

Dalam pemrosesan sinyal, aliasing dihindari dengan mengirimkan sinyal melalui filter low pass sebelum pengambilan sampel. Jack Poulson sudah menjelaskan satu teknik untuk FFT yang tidak seragam menggunakan Gaussians terpotong sebagai filter low pass. Salah satu fitur yang tidak nyaman dari Gaussi terpotong adalah bahwa bahkan setelah Anda memutuskan spasi grid untuk FFT (= laju pengambilan sampel dalam pemrosesan sinyal), Anda masih memiliki dua parameter bebas: Lebar Gaussian dan radius pemotongan.

Karena itu saya lebih suka fungsi "topi" dengan lebar dua sel kisi sebagai filter low pass. Ini memiliki efek bahwa pesanan Fourier nol tepat, dan bahwa pesanan Fourier rendah akan bertemu secara kuadratik. Transformasi Fourier dari fungsi "topi" mudah untuk dihitung (ini adalah kuadrat dari fungsi sinc), yang menyederhanakan pembalikan konvolusi setelah FFT. Perhatikan bahwa fungsi "topi" adalah konvolusi dari fungsi karakteristik sel unit (terpusat) dengan dirinya sendiri. Setiap tingkat konvergensi yang diinginkan dapat dicapai, dengan melilit sel unit lebih dari sekali dengan dirinya sendiri, dan menggunakan fungsi yang dihasilkan alih-alih fungsi "topi".

Thomas Klimpel
sumber
6

Jika Anda tertarik dengan perangkat lunak saya dapat merekomendasikan perpustakaan NFFT (dalam C dengan antarmuka ke MATLAB) yang dapat ditemukan di sini . Perhatikan bahwa ada juga PFFT library untuk komputasi FFT paralel dan bahkan perpustakaan PNFFT untuk FFT non-equispaces paralel oleh pengembang yang sama .

Beladau
sumber
1
Sejauh yang saya tahu, PNFFT adalah perpustakaan tercepat untuk paralel FFT 3d tidak seragam.
Jack Poulson
tautan untuk PNFFT tampaknya rusak.
Isi
2

Tambahan untuk jawaban yang diterima. Berikut ini tautan ke implementasi sumber terbuka metode Greengard dan Lee: https://finufft.readthedocs.io/en/latest/ Ini memiliki pembungkus untuk C, fortran, MATLAB, oktaf, dan python. Saya percaya FINUFFT ditulis dalam bahasa C ++.

Itu dipelihara dan digunakan di NYU Courant institute, SFU, Flatiron institute (tentu saja), University of Texas Austin dan universitas negeri Florida. Setidaknya ini yang saya tahu.

Saya sendiri menggunakan versi yang lebih lama, karena saya malas. Lihat: https://cims.nyu.edu/cmcl/nufft/nufft.html

Raibyo
sumber