2017-03-08 5 views
1
내가 문제 푸리에 변환에서 주파수 스펙트럼을 얻는 데

... 난 일부 데이터가 비애 : dataFFT 파워 스펙트럼은

내 말은 중심이 있고, 너무 가지고하지 않는 것 나는 그것을 푸리에 변환을 플롯

... 추세의 많은 : ....

fourier transform

를 내가 좋은하지 무언가를 얻을 수

here에서 가져온 코드에서 적응으로

def fourier_spectrum(X, sample_freq=1): 
    ps = np.abs(np.fft.fft(X))**2 
    freqs = np.fft.fftfreq(X.size, sample_freq) 
    idx = np.argsort(freqs) 

    plt.plot(freqs[idx], ps[idx]) 

: 16,

여기 내 코드입니다.

일부 순진 죄 웨이브 데이터를 작동하는 것 같다

:

sin spectrum

fourier_spectrum(np.sin(2*np.pi*np.linspace(-10,10,400)), 20./400) 
그래서 제 질문은 : '비 제로 거의-사방 스펙트럼을 기대하고있어, 내가 무엇이다 잘못하고있는거야? 내가 틀린 일을하지 않는다면, 내 데이터의 어떤 기능이 이것을 일으키는 것입니까? 또한 잘못된 일을하지 않고 fft가 내 데이터에 적합하지 않은 경우 데이터에서 중요한 주파수를 추출하려면 어떻게해야합니까?

+0

너무 많은 "DC"구성 요소가있는 경우 fft의 0 빈을 플롯하지 마십시오. 또한 안구에 의해 데이터는 매우 낮은 주파수에서 강한 주파수 성분을 갖는 것처럼 보입니다 - 첫 번째 50 개 정도의 쓰레기통을보고 더 합리적인 것처럼 보일 수도 있습니다 – f5r5e5d

+0

"DC에서 큰 구성 요소를 제거하는 FFT 전에 신호의 평균을 뺍니다 "(즉, FFT의 bin 0). 또한/대안으로, FFT 출력의'log10 (abs (...))'(즉, dB 또는 데시벨)을 그려서 무슨 일이 일어나고 있는지 더 잘 이해할 수 있습니다. –

+0

또한 [periodogram] (https://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.periodogram.html)과 같은 통계적 스펙트럼 추정기와'scipy.signal'의 관련 메소드를 살펴보십시오. –

답변

0

주파수 스펙트럼에서 x 축의 단위 인 Hz를 이해하지 못했습니다. 내 샘플 간격은 1 초 정도 였고 내 기간은 하루 정도 였으므로 내 주파수 스펙트럼에서 실제로 볼 수있는 유일한 단위는 ~ 1/s (가장자리) ~ 약 1/m (근처 중간), 그리고 그보다 더 긴 기간을 갖는 것은 0과 구별 할 수 없었다. 나의 오해는 this 자습서의 그래프에서 유래했다. 여기서 x 축 단위가 역 시간과 반대가되도록 변환을 수행한다. 결과 그래프에서 적절한 "확대/축소"기능을 사용하기 위해 frequency_spectrum 플로팅 함수를 다시 작성했습니다. ...

def fourier_spectrum(X, sample_spacing_in_s=1, min_period_in_s=5): 
    ''' 
     X: is our data 
     sample_spacing_in_s: is the time spacing between samples 
     min_period_in_s: is the minimum period we want to show up in our 
      graph... this is handy because if our sample spacing is 
      small compared to the periods in our data, then our spikes 
      will all cluster near 0 (the infinite period) and we can't 
      see them. E.g. if you want to see periods on the order of 
      days, set min_period_in_s=5*60*60 #5 hours 
    ''' 
    ps = np.abs(np.fft.fft(X))**2 
    freqs = np.fft.fftfreq(X.size, sample_spacing_in_s) 
    idx = np.argsort(freqs) 
    plt.plot(freqs[idx], ps[idx]) 
    plt.xlim(-1./min_period_in_s,1./min_period_in_s) # the x-axis is in Hz