[英]power spectrum by numpy.fft.fft
無論我如何更改數據,通過以下代碼繪制的圖形只是ZERO周圍的峰值。 我的數據只是一列,記錄了某種信號的每個時間點。 time_step
是我應該根據數據中兩個相鄰點的間隔定義的值嗎?
data=np.loadtxt("timesequence",delimiter=",",usecols=(0,),unpack=True)
ps = np.abs(np.fft.fft(data))**2
time_step = 1
freqs = np.fft.fftfreq(data.size, time_step)
idx = np.argsort(freqs)
pl.plot(freqs[idx], ps[idx])
pl.show()
正如其他人暗示你的信號必須有一個大的非零組件。 0(DC)處的峰值表示信號的平均值。 這來自傅里葉變換本身。 該余弦函數cos(0)* ps(0)表示信號平均值的度量。 其他傅里葉變換分量是幅度變化的余弦波,其在這些值處顯示頻率成分。
請注意,靜止信號不會有大的直流分量,因為它們已經是零均值信號。 如果您不需要大型直流分量,那么您應該計算信號的平均值並從中減去值。 無論您的數據是0,...,999還是1,...,1000,甚至1000,...,2000,您都將獲得0Hz的峰值。 唯一的區別在於峰值的大小,因為它測量的是平均值。
data1 = arange(1000)
data2 = arange(1000)+1000
dataTransformed3 = data - mean(data)
data4 = numpy.zeros(1000)
data4[::10] = 1 #simulate a photon counter where a 1 indicates a photon came in at time indexed by array.
# we could assume that the sample rate was 10 Hz for example
ps1 = np.abs(np.fft.fft(data))**2
ps2 = np.abs(np.fft.fft(data))**2
ps3 = np.abs(np.fft.fft(dataTransformed))**2
figure()
plot(ps1) #shows the peak at 0 Hz
figure()
plot(ps2) #shows the peak at 0 Hz
figure()
plot(ps3) #shows the peak at 1 Hz this is because we removed the mean value but since
#the function is a step function the next largest component is the 1 Hz cosine wave.
#notice the order of magnitude difference in the two plots.
這是一個簡單的示例,顯示輸入和輸出的峰值,如您所期望的那樣:
import numpy as np
from scipy.fftpack import rfft, irfft, fftfreq
time = np.linspace(0,10,2000)
signal = np.cos(5*np.pi*time)
W = fftfreq(signal.size, d=time[1]-time[0])
f_signal = rfft(signal)
import pylab as plt
plt.subplot(121)
plt.plot(time,signal)
plt.subplot(122)
plt.plot(W,f_signal)
plt.xlim(0,10)
plt.show()
我使用rfft
因為很可能你的輸入信號來自物理數據源,因此是真實的。
如果您使數據全部正面:
ps = np.abs(np.fft.fft(data))**2
time_step = 1
那么很可能你會創建一個大的“DC”或0 Hz組件。 因此,如果您的實際數據與該組件相比幅度很小,則它將通過自動縮放功能從繪圖中消失。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.