gpt4 book ai didi

python - 正确使用 scipy.signal.spectral.lombscargle 的方法

转载 作者:太空狗 更新时间:2023-10-29 21:35:01 39 4
gpt4 key购买 nike

我指的是以下帖子:Using scipy.signal.spectral.lombscargle for period discovery

我意识到在某些情况下给出的答案是正确的。

sin(x) 的频率,即 1/(2* pi)

# imports the numerical array and scientific computing packages
import numpy as np
import scipy as sp
from scipy.signal import spectral

# generates 100 evenly spaced points between 1 and 1000
time = np.linspace(1, 1000, 100)

# computes the sine value of each of those points
mags = np.sin(time)

# scales the sine values so that the mean is 0 and the variance is 1 (the documentation specifies that this must be done)
scaled_mags = (mags-mags.mean())/mags.std()

# generates 1000 frequencies between 0.01 and 1
freqs = np.linspace(0.01, 1, 1000)

# computes the Lomb Scargle Periodogram of the time and scaled magnitudes using each frequency as a guess
periodogram = spectral.lombscargle(time, scaled_mags, freqs)

# returns the inverse of the frequence (i.e. the period) of the largest periodogram value
print "1/2pi = " + str(1/(2*np.pi))
print "Frequency = " + str(freqs[np.argmax(periodogram)] / 2.0 / np.pi)

打印如下。很好。我猜。我们将 lombscargle 结果除以 2pi 的原因是,我们需要将弧度转换为频率。 (f = 弧度/2pi)

1/2pi = 0.159154943092
Frequency = 0.159154943092

但是,对于以下情况,事情似乎出了问题。

sin(2x) 的频率,即 1/(pi)

# imports the numerical array and scientific computing packages
import numpy as np
import scipy as sp
from scipy.signal import spectral

# generates 100 evenly spaced points between 1 and 1000
time = np.linspace(1, 1000, 100)

# computes the sine value of each of those points
mags = np.sin(2 * time)

# scales the sine values so that the mean is 0 and the variance is 1 (the documentation specifies that this must be done)
scaled_mags = (mags-mags.mean())/mags.std()

# generates 1000 frequencies between 0.01 and 1
freqs = np.linspace(0.01, 1, 1000)

# computes the Lomb Scargle Periodogram of the time and scaled magnitudes using each frequency as a guess
periodogram = spectral.lombscargle(time, scaled_mags, freqs)

# returns the inverse of the frequence (i.e. the period) of the largest periodogram value
print "1/pi = " + str(1/(np.pi))
print "Frequency = " + str(freqs[np.argmax(periodogram)] / 2.0 / np.pi)

正在打印以下内容。

1/pi = 0.318309886184
Frequency = 0.0780862900972

似乎不正确。我错过了任何步骤吗?

最佳答案

您理所当然地期望峰值出现在 1/pi,但您正在测试的最高频率是 1/2/pi...尝试以下操作单一变化:

freqs = linspace(0.01, 3, 3000)

现在输出是预期的:

1/pi = 0.318309886184
Frequency = 0.318311478264

但请注意,如果您针对 freqs/2/np.pi 绘制 periodogram,则该图如下所示:

enter image description here

因此对于更复杂的信号,您不能仅仅依靠寻找周期图的max 来找到主频率,因为谐波可能会欺骗您。

关于python - 正确使用 scipy.signal.spectral.lombscargle 的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14518970/

39 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com