36002 개 항목으로 구성된 데이터 세트가 있는데,이 데이터의 FFT 및 PSD에 포함되어있는 주파수와 주파수의 해당 전력 밀도를 알고 싶습니다.python-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 그리고 36,002 result 36002 의 결과 그럼 뭐가 문제 야? 고마워.
Btw, 아무도 파이썬에서 오버랩 창을 사용하는 방법을 설명 할 수 있습니까? 언제 사용해야합니까? 내 문제의 해결책을 찾을 때부터, 나는 항상이 방법들을보고 어떻게 사용하는지 모른다. 감사!
0 Hz는 제로 주파수, 즉 일정한 신호를 의미하며 전기적 세계에서 DC 성분을 생각합니다. 이것이 측정 된 신호의 큰 구성 요소라는 것은 이상한 일이 아닙니다. 측정하는 신호에 따라 달라집니다. 원본 신호에서 평균값을 제거하고 예를 들어'scipy.signal.detrend'에서'detrend' 함수를 사용할 수도 있습니다. 코드가 올바른 일을하는지 가장 간단한 방법은 결과가 무엇인지 알 수있는 가짜 신호를주는 것입니다. – ahed87
안에 실마리 고마워. 정말 도움이됩니다. –