如何匹配相同数据集的lomb-scargle和FFT图?

时间:2013-02-18 18:42:10

标签: python fft units-of-measurement psd

我正在做一些工作,比较一段时间内某些气体浓度的插值fft,其中采用不均匀采样,并使用相同数据的lomb-scargle周期图。我使用scipy的fft函数来计算傅立叶变换,然后将其模数平方,得出我认为的功率谱密度,以十亿分之一(ppb)平方为单位。

我可以得到lomb-scargle图几乎与FFT的确切模式相匹配,但从不相同的幅度,FFT功率谱密度总是更高,即使我认为lomb-scargle功率是功率谱密度。现在我正在使用的lomb代码:http://www.astropython.org/snippet/2010/9/Fast-Lomb-Scargle-algorithm,将数据集标准化,取消平均值并除以数据方差的2倍,因此我以相同的方式对FFT数据进行归一化,但仍然没有大小匹配。

因此,我做了更多的研究,发现标准化的坟墓疤痕能力可以无法完成,因此我不能将这些情节匹配。这引出了我的两个问题:

  1. 标准化的瘢痕瘢痕周围造影的功率谱密度是多少单位(如果有的话)?

  2. 在幅度和模式方面,我如何继续将我的fft情节与我的lomb-scargle情节相匹配?

  3. 谢谢。

2 个答案:

答案 0 :(得分:5)

一系列傅立叶变换的平方模数定义为 能谱密度 (ESD)。您需要将ESD除以系列的长度,以转换为 功率谱密度 (PSD)的估计值。

单元

PSD的单位是[单位] ** 2 / [频率],其中[单位]代表原始系列的单位。

正常化

为了检查正确的归一化,可以在数值上积分白噪声的PSD(具有已知的方差)。如果积分频谱等于系列的方差,则归一化是正确的。但是,因子2(太低)不是不正确的,并且可能表明PSD被标准化为双面;在这种情况下,只需乘以2即可得到一个正确规范化的单面PSD。

使用numpy,randn函数生成高斯分布的伪随机数。例如

10 * np.random.randn(1, 100)

产生1乘100的数组,其中mean = 0且方差= 100。如果采样频率为1-Hz,理论上单侧 PSD在200单位** 2 / Hz,从[0,0.5] Hz;因此,综合频谱将为10,等于系列的方差。

更新

我修改了您链接的python代码中包含的示例,以演示正态分布的长度为20的系列的规范化,方差为1,采样频率为10:

import numpy
import lomb
numpy.random.seed(999)
nd = 20
fs = 10
x = numpy.arange(nd)
y = numpy.random.randn(nd)
fx, fy, nout, jmax, prob = lomb.fasper(x, y, 1., fs)
fNy = fx[-1]
fy = fy/fs
Si = numpy.mean(fy)*fNy
print fNy, Si, Si*2

这给了我:

5.26315789474 0.482185882163 0.964371764327

向您展示了一些内容:

  1. 要求的“奈奎斯特”频率实际上是采样频率。
  2. 结果需要除以采样频率。
  3. 输出针对双面PSD进行归一化,因此乘以2会使积分频谱接近1。

答案 1 :(得分:1)

在提出和回答这个问题之后,AstroPy项目获得了一个Lomb-Scargle方法,这个问题在文档中得到了解决:http://docs.astropy.org/en/stable/stats/lombscargle.html#psd-normalization-unnormalized

简而言之,您可以计算傅立叶周期图,并将其与星辰Lomb-Scargle周期图进行比较,如下所示

{{1}}

由于AstroPy是天文学中常用的工具,我认为这可能比基于上面提到的代码片段的答案更有用。