Düzensiz aralıklı verilerin FFT'sini nasıl alabilirim?


55

Hızlı Fourier Dönüşümü algoritması, giriş noktalarının zaman alanına eşit aralıklarla yerleştirildiği varsayımı altında bir Fourier ayrışması hesaplar, . Ya onlar değilse? Değişken bir örnekleme oranının ne kadar etkili olduğunu hesaplamak için kullanabileceğim başka bir algoritma veya FFT'yi değiştirebilecek bir yol var mı?tk=kT

Çözüm, örneklerin nasıl dağıtıldığına bağlıysa, en çok ilgilendiğim iki özel durum vardır:

  • Jitter ile sabit örnekleme hızı: burada rastgele dağıtılmış bir değişkendir. Söylemek güvenli olduğunu varsayalım . δ t k | δ t k | < T / 2tk=kT+δtkδtk|δtk|<T/2
  • Örnekleri başka bir sabit örnekleme hızından : buradan kZktk=nkTnkZk

Motivasyon: her şeyden önce bu, bu site için teklife verilen yüksek oylu sorulardan biriydi . Ancak ek olarak, bir süre önce eşit olmayan şekilde örneklenmiş noktalara sahip bazı girdi verilerinin ortaya çıktığı FFT kullanımı ( Yığın Taşması ile ilgili bir soru sorulduğunda) hakkında bir tartışmaya katıldım . Verilerdeki zaman damgalarının yanlış olduğu ortaya çıktı, ancak birinin bu sorunu nasıl çözebileceğini düşündürdü.

Yanıtlar:


40

Üniform olmayan FFT için çok çeşitli teknikler vardır ve en verimli olanların hepsi tam da sizin durumunuz içindir: yarı üniforma örnekleri. Temel fikir, Gaussianlara karşı yerel konvolüsyonlar olsa da, dengesiz bir şekilde örneklenen kaynakları biraz daha ince ("aşırı örneklenmiş") düzgün bir ızgaraya sürmek. Ardından, örneklenen üniform ızgara üzerinde standart bir FFT çalıştırılabilir ve daha sonra Gausslara karşı evrişim giderilebilir. İyi uygulamaları gibi bir şey standart FFT kat daha daha pahalı d boyutları, Cı- 4 yakın bir şey ya da 5.CddC

Greengard ve Lee tarafından Düzensiz Hızlı Fourier Dönüşümünü Hızlandırma'yı okumanızı tavsiye ederim .

Ayrıca mevcut hızlı, örneğin, veya daha hızlı, kaynakları ve / veya değerlendirme noktaları seyrek ve örneğin daha genel yekpare operatörleri, Fourier İntegral Operatörler için genelleme da vardır teknikleri. Bu tekniklerle ilgileniyorsanız , Fourier Integral Operators hesabı için Sparse Fourier dönüşümünü kelebek algoritması ve Hızlı kelebek algoritması ile öneririm . Bu tekniklerde standart FFT'lere göre ödenen fiyat çok daha yüksek bir katsayıdır. Sorumluluk reddi: Danışmanım bu iki makaleyi yazdı / yazdı ve bu teknikleri paralel hale getirmek için çok fazla zaman harcadım.O(NdlogN)

Önemli bir nokta olduğunu tüm standart FFT algoritması tam ise yukarıdaki tekniklerin uzun çalışma süreleri pahasına keyfi bir hassasiyet elde edilebilir yaklaşımlar vardır.


9

Sinyal işlemede, örneklemeden önce düşük geçişli bir filtreden bir sinyal gönderilerek takma işleminden kaçınılır. Jack Poulson zaten kesilmiş Gauss'ları düşük geçişli filtreler olarak kullanan tek tip olmayan FFT için bir teknik açıkladı. Kesilmiş Gaussian'ların uygunsuz bir özelliği, FFT için ızgara aralığına karar verdikten sonra bile (= sinyal işlemede örnekleme hızı), hala iki serbest parametrenizin olması: Gaussian'ın ve kesme yarıçapının genişliği.

Bu nedenle düşük geçiş filtresi olarak iki ızgara genişliğine sahip "şapka" işlevini tercih ederim. Bu, sıfırıncı Fourier sırasının kesin olduğu ve alt Fourier sırasının dörtlü olarak birleşeceği etkisine sahiptir. "Şapka" işlevinin Fourier dönüşümü hesaplamak kolaydır (bu, sinc işlevinin karesidir), FFT'den sonra evrişeyi geri almayı basitleştirir. "Şapka" işlevinin, (merkezlenmiş) birim hücrenin karakteristik işlevinin kendisiyle birlikte dönüştüğünü unutmayın. İstenen herhangi bir yakınsama hızı, birim hücrenin kendisiyle bir defadan fazla kıvrılması ve "şapka" fonksiyonu yerine elde edilen fonksiyon kullanılarak gerçekleştirilebilir.


6

Yazılımda ilgileniyorsanız ben bulunabilir (MATLAB'a bir arayüz ile C) nfft kütüphanesini tavsiye edebilir burada . Paralel FFT hesaplaması için bir PFFT kütüphanesi ve aynı geliştiricilerin paralel olarak eşit olmayan FFT'ler için bir PNFFT kitaplığı olduğunu da unutmayın .


1
Bildiğim kadarıyla, PNFFT paralel 3d tek tip FFT'ler için en hızlı kütüphanedir.
Jack Poulson

PNFFT için link kopmuş görünüyor.
Foad

2

Kabul edilen cevaba eklenmesi. Greengard'ın ve Lee'nin yönteminin açık kaynaklı bir uygulamasına bir link: https://finufft.readthedocs.io/en/latest/ C, fortran, MATLAB, oktav ve python sarmalayıcıları var. FINUFFT’in C ++ dilinde yazıldığını düşünüyorum.

NYU Courant Enstitüsü, SFU, Flatiron Enstitüsü (Açıkçası), Texas Austin Üniversitesi ve Florida Eyalet Üniversitesi'nde tutulmakta ve kullanılmaktadır. En azından bunlar benim bildiğimler.

Kendimi eski bir sürüm kullanıyorum, çünkü tembelim. Bakınız: https://cims.nyu.edu/cmcl/nufft/nufft.html


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.