[英]Power spectrum of real data with fftpack on log axis
我已經閱讀了很多關於此主題的討論( 在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 )
我不想阻止這個話題,所以我會在這里問:我該如何檢索峰的頻率? 在峰值旁邊繪制頻率將是很棒的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.