簡體   English   中英

python-FFT和PSD計算

[英]python-FFT and PSD calculating

我有一組數據,由36002項組成,我想對其進行FFT和PSD以了解其包括的頻率以及該頻率的相應功率密度。

我的代碼是:

from __future__ import division
import numpy
import matplotlib.pyplot as plt

#read in the pressure p_dot and time t, they are [36002,] vector
nSteps=36002
p_dot=numpy.genfromtxt((r'E:\p_dot.dat'), delimiter=' ')[:,2]
t=numpy.genfromtxt((r'E:\t.dat'), delimiter=' ')[:,0]

T=(t[-1]-t[0])/nSteps # the interval between two data points
N=len(p_dot)//2+1 # FFT is symmetrical, so plot one half
Y=numpy.fft.fft(p_dot) # to compare with Yhann
hann=numpy.hanning(len(p_dot))
Yhann=numpy.fft.fft(hann*p_dot)
fa=1.0/T # scan frequency
X=numpy.linspace(0, fa/2, N, endpoint=True) # Nyquest frequency=fa/2
plt.close()
plt.subplot(2,1,1)
plt.plot(x,y)
plt.subplot(2,1,2)
plt.plot(X, 2.0*abs(Yhann[:N])/N)
plt.tight_layout()
plt.show()

但是結果證明是不正確的,至少我是這樣認為的。 顯然我的數據是周期性的,但FFT僅在0 Hz處有一個尖峰。 查看前1000個項目的結果。

結果1000和36002的結果結果36002怎么了? 非常感謝。

順便說一句,有人可以解釋如何在python中使用重疊窗口嗎? 而我們什么時候應該使用它呢? 因為當我搜索問題的解決方案時,我總是看到這些方法,卻不知道如何使用它。 謝謝!

0Hz出現峰值的原因是您的輸入信號的平均值非零。 這是信號的直流分量。 還有一個較小的峰值,大約在1Hz左右,看起來大約是信號的主要頻率。

當人們在數據的小片段中計算功率時,通常會應用窗口函數,然后對這些片段進行組合或求平均以減少頻譜估計中的噪聲。 可以將其應用於完整信號,但是這種方式不太常用。 您可以手動進行所有這些加窗和平均,但是我真的建議您使用scipy.signal.welch函數(或類似函數)來估計PSD。 它為您完成所有簿記,開窗,平均等工作。

暫無
暫無

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

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