我目前面临的问题是必须从我不知道频率的数据中猜测一个已经相当准确的频率。 我知道数据应该与
fit = A* sin^2(ω * t + φ)
有关,因为我通过其他方式知道我们正在计算拉比频率。我可以自己进行一些猜测并进行尝试,但我需要将其自动化,因为我将生成更多此类数据,这在手动猜测时需要做太多工作。
我尝试了一些 FFT 的东西,但即使在减去平均值之后,我得到的频率也太高或太低,导致拟合无法正常工作。因为我也不知道未来的数据会是什么样子(这一切都来自一个非常复杂的 ODE 解决方案,它以一种非常特定的方式在很多参数上进行了模拟)我绝对需要一个相当强大的解决方案。 我的 FFT 实现如下所示:
def find_initial_freq(data, timestep):
new_data = data-np.mean(data)
fft_data = np.fft.fft(new_data)
freqs = np.fft.fftfreq(len(data), d=timestep)
peak = np.argmax(np.abs(fft_data))
freq = freqs[peak]
print(freq)
这导致频率为 0.11,有效的猜测约为 0.35。 我做错了什么?
从this comment看来,您正在计算np.fft.fftfreq
返回的频率
f,并将其用作等式sin(ωt)中的径向频率ω。
两者有ω=2πf的关系。
然后您还需要考虑到正弦的平方会使频率加倍,因此 sin^2(ωt) 的径向频率为 2ω。
综合起来,如果您设置 ω=0.35,您应该看到频率 f=2ω/2π=ω/π,这非常接近您测量的 0.11。