python-FFT和PSD计算

时间:2017-12-16 19:37:59

标签: python fft

我有一组由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个项目的结果。

result 1000 而36002的结果 result 36002 所以有什么问题?非常感谢。

是的,谁能解释如何在python中使用重叠窗口?我们什么时候应该使用它?因为当我搜索我的问题的解决方案时,我总是看到这些方法,不知道如何使用它。谢谢!

1 个答案:

答案 0 :(得分:0)

0Hz峰值的原因是您的输入信号具有非零均值。这是信号的直流分量。还有一个较小的峰值在大约1Hz左右,看起来大致是信号的主频率。

当计算小数据段中的功率时,通常应用窗口函数,然后对其进行组合或平均以减少频谱估计中的噪声。将它应用于完整信号可以很好,但这种方式不太常用。您可以手动执行所有这些窗口和平均,但我真的建议使用scipy.signal.welch函数(或类似函数)来估算PSD。它会为您完成所有的簿记,窗口,平均等操作。