我想要做的是,从具有周期性模式的 x-y 点列表中计算周期。凭借有限的数学知识,我知道傅立叶变换可以完成这种事情。

我正在编写 Python 代码。

我找到了一个相关的答案 here ,但它使用均匀分布的 x 轴,即 dt 是固定的,这对我来说不是这种情况。由于我不太了解它背后的数学原理,因此我不确定它是否能在我的代码中正常工作。

我的问题是,它有效吗?或者,numpy 中是否有一些方法可以完成我的工作?或者,我该怎么做?

编辑: 所有值都是 Pythonic float(即 double )

最佳答案

对于不均匀间隔的样本,您可以使用 scipy.signal.lombscargle 来计算 Lomb-Scargle periodogram 。这是一个例子,有一个信号
主频率为 2.5 rad/s。

from __future__ import division

import numpy as np
from scipy.signal import lombscargle
import matplotlib.pyplot as plt


np.random.seed(12345)

n = 100
x = np.sort(10*np.random.rand(n))
# Dominant periodic signal
y = np.sin(2.5*x)
# Add some smaller periodic components
y += 0.15*np.cos(0.75*x) + 0.2*np.sin(4*x+.1)
# Add some noise
y += 0.2*np.random.randn(x.size)

plt.figure(1)
plt.plot(x, y, 'b')
plt.xlabel('x')
plt.ylabel('y')
plt.grid()

dxmin = np.diff(x).min()
duration = x.ptp()
freqs = np.linspace(1/duration, n/duration, 5*n)
periodogram = lombscargle(x, y, freqs)

kmax = periodogram.argmax()
print("%8.3f" % (freqs[kmax],))

plt.figure(2)
plt.plot(freqs, np.sqrt(4*periodogram/(5*n)))
plt.xlabel('Frequency (rad/s)')
plt.grid()
plt.axvline(freqs[kmax], color='r', alpha=0.25)
plt.show()

该脚本打印 2.497 并生成以下图:

python - 从x-y点列表进行离散傅立叶变换-LMLPHP

python - 从x-y点列表进行离散傅立叶变换-LMLPHP

关于python - 从x-y点列表进行离散傅立叶变换,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34428886/

10-12 01:29