2015-04-27 320 views
1

我有一組data。顯然具有一些週期性。我想通過使用傅立葉變換找出它的頻率並繪製出來。使用python進行傅立葉變換

這是我的一個鏡頭,但它似乎不太好。 enter image description here

這是對應的代碼,我卻不知道失敗的原因:

import numpy 
from pylab import * 
from scipy.fftpack import fft,fftfreq 
import matplotlib.pyplot as plt 
dataset = numpy.genfromtxt(fname='data.txt',skip_header=1) 
t = dataset[:,0] 
signal = dataset[:,1] 
npts=len(t) 

FFT = abs(fft(signal)) 
freqs = fftfreq(npts, t[1]-t[0]) 
subplot(211) 
plot(t[:npts], signal[:npts]) 
subplot(212) 
plot(freqs,20*log10(FFT),',') 
xlim(-10,10) 
show() 

我的問題是:由於原始數據是很週期性來看,我希望看到的是,在頻率域名的峯值非常尖銳;我怎樣才能使峯值更好看?

+0

什麼是不正確的呢?你在期待什麼? –

+0

@PaulH爲什麼峯值這麼廣泛,我看到原始數據的週期非常好。我怎樣才能讓頻率更明顯? – buzhidao

回答

4

這是一個數據分析的問題。

  • FFT工作在複數上,因此頻譜對實際數據輸入是對稱的:限制在xlim(0,max(freqs))
  • 採樣週期不好:在保持輸入點總數相同的情況下,增加週期會導致這個例子中質量最好的頻譜。

編輯。 用:

dataset = numpy.genfromtxt(fname='data.txt',skip_header=1)[::30]; 
t,signal = dataset.T 
(...) 
plot(freqs,FFT) 
xlim(0,1) 
ylim(0,30)  

頻譜是

spectum

爲了獲得最佳的光譜中,只是重新獲取了很久的時間信號(美麗的峯),用1赫茲的採樣頻率,這會給你一個[0,0.5 Hz]的頻率標度(見奈奎斯特標準)。

+0

我得到了你的第一點,你能否更詳細地解釋你的第二點?我應該將「t [1] -t [0]」替換爲「10 *(t [1] -t [0])」嗎?這也不好。 – buzhidao

+1

只是檢查我的理解。根據奈奎斯特標準,你的採樣率是$ 1 /(30 * 0.005s)= 6.67Hz $。這個採樣率保證我們可以以$ f <6.67/2 = 3.33Hz $的頻率恢復信號的信息。因此,我們應該從0到3.4Hz繪製x軸。 – buzhidao

+1

但是,我仍然不明白你選擇的魔法少點可以使圖形看起來更好,你能否在你的答案中解釋這部分。謝謝! – buzhidao