我想要做的是,从具有周期性模式的xy点列表中,计算周期.凭借我有限的数学知识,我知道傅立叶变换可以做到这一点.
我正在编写Python代码.
我在这里找到了一个相关的答案,但是它使用了均匀分布的x轴,即dt
固定,这对我来说并非如此.由于我不太了解它背后的数学,我不确定它是否能在我的代码中正常工作.
我的问题是,它有效吗?或者,是否有一些方法numpy
可以完成我的工作?或者,我该怎么办?
编辑:所有值都是Pythonic float
(即双精度)
对于间距不均匀的样本,可以使用scipy.signal.lombscargle
计算Lomb-Scargle周期图.这是一个例子,信号的主频为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
并生成以下图表: