2017-12-16 25 views
1

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, 아무도 파이썬에서 오버랩 창을 사용하는 방법을 설명 할 수 있습니까? 언제 사용해야합니까? 내 문제의 해결책을 찾을 때부터, 나는 항상이 방법들을보고 어떻게 사용하는지 모른다. 감사!

+1

0 Hz는 제로 주파수, 즉 일정한 신호를 의미하며 전기적 세계에서 DC 성분을 생각합니다. 이것이 측정 된 신호의 큰 구성 요소라는 것은 이상한 일이 아닙니다. 측정하는 신호에 따라 달라집니다. 원본 신호에서 평균값을 제거하고 예를 들어'scipy.signal.detrend'에서'detrend' 함수를 사용할 수도 있습니다. 코드가 올바른 일을하는지 가장 간단한 방법은 결과가 무엇인지 알 수있는 가짜 신호를주는 것입니다. – ahed87

+0

안에 실마리 고마워. 정말 도움이됩니다. –

답변

0

0Hz에서 피크가 나타나는 이유는 입력 신호가 0이 아닌 평균을 갖기 때문입니다. 이것은 신호의 DC 성분입니다. 대략 1Hz 정도의 다른 작은 피크가 신호의 주 주파수와 비슷합니다.

일반적으로 창 기능은 데이터의 작은 부분에서 전력을 계산할 때 적용됩니다.이 기능은 스펙트럼 추정에서 잡음을 줄이기 위해 결합 또는 평균화됩니다. 전체 신호에 적용해도 문제가 없지만 일반적으로 덜 사용됩니다. 이 모든 창 작업과 평균을 수동으로 수행 할 수는 있지만 실제로는 scipy.signal.welch 함수 (또는 유사)를 사용하여 PSD를 계산하는 것이 좋습니다. 그것은 당신을 위해 모든 책 관리, 윈도우 잉, 평균 처리 등을 담당합니다.

+0

실마리를 가져 주셔서 감사합니다 !! 나는 문제를 해결했다. –