如何对空间不均匀的数据进行FFT?


55

快速傅立叶变换算法在以下假设条件下计算傅立叶分解:输入点在时域中均等分布,Ťķ=ķŤ。如果不是,那该怎么办?我是否可以使用另一种算法,或者以某种方式修改FFT,以说明什么是有效的可变采样率?

如果解决方案取决于样本的分发方式,那么我最感兴趣的是两种特定情况:

  • 恒定的采样速率与抖动:其中δ ķ是随机分布的变量。可以肯定地说| δ Ť ķ | < T / 2Ťķ=ķŤ+δŤķδŤķ|δŤķ|<Ť/2
  • 丢弃样品从否则恒定采样率:其中Ñ ķžķŤķ=ñķŤñķžķ

动机:首先,这是对此站点的提案投票较高的问题之一。但是此外,不久前,我参与了有关FFT使用的讨论(由Stack Overflow问题提示),其中出现了一些采样点不均匀的输入数据。原来,数据上的时间戳是错误的,但是这让我开始思考如何解决这个问题。

Answers:


40

有很多用于非均匀FFT的技术,而最高效的技术恰恰适合您的情况:准均匀样本。基本思想是通过对高斯进行局部卷积,将不均匀采样的源涂抹到稍微更细(“过度采样”)的均匀网格上。然后可以在过采样的统一网格上运行标准FFT,然后可以撤消针对高斯的卷积。好的实现大约比d维的标准FFT的贵,其中C接近4或5。CddC

我建议阅读Greengard和Lee的《加速非均匀快速傅立叶变换》

当源和/或评估点稀疏时,也存在快速(即或更快)的技术,并且还存在对更通用积分算子(例如,傅里叶积分算子)的推广。如果您对这些技术感兴趣,我建议通过蝶形算法A快速蝶形算法进行稀疏傅里叶变换,以计算傅里叶积分算子。与标准FFT相比,这些技术所付出的代价是更高的系数。免责声明:O(NdlogN我的顾问撰写/撰写了这两篇论文,而我花了很多时间来并行化这两种技术。

重要的一点是,上述所有技术都是近似值,可以以较长的运行时间为代价任意精确地得出近似值,而标准FFT算法则是精确的。


9

在信号处理中,通过在采样之前通过低通滤波器发送信号来避免混叠。杰克·普尔森(Jack Poulson)已经解释了一种使用截断的高斯滤波器作为低通滤波器的非均匀FFT技术。截断的高斯函数的一个不便之处在于,即使您已经确定了FFT的网格间距(=信号处理中的采样率),您仍然拥有两个自由参数:高斯的宽度和截断半径。

因此,我更喜欢具有两个网格单元宽度的“帽子”功能作为低通滤波器。这具有零傅立叶阶数精确的效果,并且较低的傅立叶阶数将平方收敛。“帽子”函数的傅立叶变换很容易计算(这是Sinc函数的平方),从而简化了FFT之后卷积的撤消操作。注意,“帽子”函数是(居中的)晶胞特征函数与其自身的卷积。通过使单位单元自身回旋多次,并使用结果函数代替“帽子”函数,可以实现任何所需的收敛速度。


6

如果您对软件感兴趣,我可以建议您在此处找到NFFT库(在C中,它具有MATLAB的接口)。注意,同样的开发人员还有一个用于并行FFT计算的PFFT库,甚至一个用于并行非等距FFT的PNFFT库。


1
据我所知,PNFFT是并行3d非均匀FFT最快的库。
杰克·普尔森

PNFFT的链接似乎已断开。
Foad

2

除了接受的答案。这是Greengard和Lee方法的开源实现的链接:https : //finufft.readthedocs.io/en/latest/ 它具有C,fortran,MATLAB,octave和python的包装。我相信FINUFFT是用C ++编写的。

它由纽约大学库兰特研究所,SFU,熨斗研究所(显然),德克萨斯大学奥斯汀分校和佛罗里达州立大学维护和使用。至少这些是我所知道的。

我自己使用的是旧版本,因为我很懒。请参阅:https//cims.nyu.edu/cmcl/nufft/nufft.html


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.