我已经阅读了许多有关此主题的讨论(在lomb-scargle和fft之间进行比较,在python中绘制功率谱,Scipy / Numpy FFT频率分析等),但仍然无法解决,因此我需要一些技巧。我有一个光子事件列表(检测与时间),数据可在此处获取。柱子是time
,counts
,errors
,和不同能量带的计数(你可以忽略它们)。我知道来源有一个周期性8.9 days = 1.3*10^-6 Hz
。我想绘制功率谱密度,以显示该频率下的峰值(可能在对数x轴上)。如果我可以避免图的一半(对称),那也很好。到目前为止,这是我的代码,到目前为止还没有:
import numpy as np
from scipy.fftpack import fft, rfft, fftfreq
import pylab as plt
x,y = np.loadtxt('datafile.txt', usecols = (0,1), unpack=True)
y = y - y.mean() # Removes the large value at the 0 frequency that we don't care about
f_range = np.linspace(10**(-7), 10**(-5), 1000)
W = fftfreq(y.size, d=x[1]-x[0])
plt.subplot(2,1,1)
plt.plot(x,y)
plt.xlabel('Time (days)')
f_signal = fft(y)
plt.subplot(2,1,2)
plt.plot(W, abs(f_signal))
plt.xlabel('Frequency (Hz)')
这里产生了(无用的)情节:
这是上面代码的改进版本:
import pyfits
import numpy as np
from scipy.fftpack import fft, rfft, fftfreq
import pylab as plt
x,y = np.loadtxt('data.txt', usecols = (0,1), unpack=True)
y = y - y.mean()
W = fftfreq(y.size, d=(x[1]-x[0])*86400)
plt.subplot(2,1,1)
plt.plot(x,y)
plt.xlabel('Time (days)')
f_signal = fft(y)
plt.subplot(2,1,2)
plt.plot(W, abs(f_signal)**2)
plt.xlabel('Frequency (Hz)')
plt.xscale('log')
plt.xlim(10**(-6), 10**(-5))
plt.show()
此处产生的图(正确):最高峰是我试图复制的峰。预计还会出现第二个峰值,但功率更低(实际上的确如此)。如果rfft
使用代替fft
(和rfftfreq
代替fftfreq
),则复制相同的图(在这种情况下,可以使用numpy.fft.rfft代替模块的频率值)
我不想阻止这个话题,所以我会在这里问:我该如何检索峰的频率?在峰值旁绘制频率会很棒。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句