簡體   English   中英

使用fftpack在對數軸上的實際數據功率譜

[英]Power spectrum of real data with fftpack on log axis

我已經閱讀了很多關於此主題的討論( 在lomb-scargle和fft之間進行比較在python中繪制功率譜Scipy / Numpy FFT頻率分析等),但是仍然無法解決 ,因此我需要一些技巧。 我有一個光子事件列表(檢測與時間),數據可在此處獲取 這些列是timecountserrors和不同能帶中的計數(您可以忽略它們)。 我知道來源的周期大約是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)')

這里產生了(無用的)情節: DFT

這是上面代碼的改進版本:

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()

在這里生成的圖(正確): FFT 最高峰是我試圖復制的峰。 預計還會出現第二個峰值,但功率會更低(的確如此)。 如果rfft代替fft (和rfftfreq代替fftfreq )相同的情節被再現(在這種情況下,頻率值,而不是在模塊中,可以使用numpy.fft.rfft

我不想阻止這個話題,所以我會在這里問:我該如何檢索峰的頻率? 在峰值旁邊繪制頻率將是很棒的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM