簡體   English   中英

功率譜由numpy.fft.fft

[英]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.

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