如何匹配同一数据集的lombscargle和FFT图?

2024-05-26 22:56:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在做一些工作,将采样不均匀的一些气体浓度的插值fft与相同数据的lomb scargle周期图进行比较。我用scipy的fft函数来计算fourier变换,然后把它的模平方,得到功率谱密度,单位是十亿分之几(ppb)的平方。在

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

因此,我做了更多的研究,发现正常化的lomb scargle能力可以是无单位的,因此我不能匹配的情节。这就引出了两个问题:

  1. 正常化lim疤痕周线的功率谱密度是什么单位(如果有的话)?

  2. 在大小和模式方面,我如何继续匹配fft图和lomb scargle图?

谢谢。在


Tags: 数据函数fft模式单位scipy功率密度
2条回答

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

简而言之,你可以计算出一个傅里叶周期图,并将其与阿谀奉承的Lomb Scargle周期图进行比较,如下所示

import numpy as np
from astropy.stats import LombScargle

def fourier_periodogram(t, y):
    N = len(t)
    frequency = np.fft.fftfreq(N, t[1] - t[0])
    y_fft = np.fft.fft(y)
    positive = (frequency > 0)
    return frequency[positive], (1. / N) * abs(y_fft[positive]) ** 2

t = np.arange(100)
y = np.random.randn(100)
frequency, PSD_fourier = fourier_periodogram(t, y)
PSD_LS = LombScargle(t, y).power(frequency, normalization='psd')

np.allclose(PSD_fourier, PSD_LS)
# True

由于天体测量是天文学中常用的工具,我认为这可能比基于上述代码片段的答案更有用。在

级数傅里叶变换的平方模被定义为能谱密度(ESD)。您需要将ESD除以序列的长度,才能将其转换为功率谱密度的估计值(PSD)。在

单位

PSD的单位是[units]**2/[frequency],其中[units]表示原始系列的单位。在

规范化

为了检查标准化是否正确,可以对白噪声的PSD进行数值积分(方差已知)。如果积分谱等于级数的方差,则归一化是正确的。但是,系数2(太低)并不错误,它可能表示PSD被规范化为双面;在这种情况下,只需乘以2,就可以得到一个正确规格化的单边PSD。在

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

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

生成平均值为0且方差为100的1乘100数组。如果采样频率为1-Hz,单边PSD理论上将从[0,0.5]Hz在200个单位**2/Hz处平坦;因此,综合频谱将为10,等于序列的方差。在

更新

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

^{pr2}$

这对我来说是:

5.26315789474 0.482185882163 0.964371764327

这向你展示了一些事情:

  1. 所要求的“奈奎斯特”频率实际上是采样频率。在
  2. 结果需要除以采样频率。在
  3. 对于双面PSD,输出是标准化的,因此乘以2可以使积分谱接近1。在

相关问题 更多 >

    热门问题