2013-05-28 57 views
0

我是Python新手。我打算做一個離散點陣列(時間,加速度)的傅里葉變換,並繪出結果。Python - FFT導致錯誤的物理意義

我複製並粘貼示例FFT代碼,並相應地進行修改。

請參閱代碼:

import numpy as np 
import matplotlib.pyplot as plt 

# Load the .txt file in 
myData = np.loadtxt('twenty_z_up.txt') 

# Extract the time and acceleration columns 
time = copy(myData[:,0]) 

# Extract the acceleration columns 
zAcc = copy(myData[:,3]) 

t = np.arange(10080) 
sp = np.fft.fft(zAcc) 
freq = np.fft.fftfreq(t.shape[-1]) 
plt.plot(freq, sp.real) 

myData的是具有10080行和10列的矩形矩陣。

因此,扎克是從基質中提取的ROW3。

在通過Spyder的畫的情節,大部分諧波集中在0 他們都非常小。

但是我的數據是實際行走的人(包括重力)攜帶的手機的加速度。所以我期望最重要的諧波發生在2Hz左右。

爲什麼圖無感?

在此先感謝!

==============更新:我的圖表====================== Time Domain

After the above-mentioned codes

Zoomed-in

的第一時域之一:

x軸是在毫秒。

y軸爲以m/s^2,由於地球引力,它有一個直流偏移的〜10。

+1

'np.arange(256)'創建一個整數數組(例如從0到255)。當你調用't.shape [-1]'時,你會得到數組't'的長度(256)。 'np.fft'是python快速傅里葉變換模塊。 'np.fft.fft()'是模塊的快速傅里葉變換函數。您需要調用數據上的函數。 – nicholaschris

+0

@nicholaschris真棒!謝謝!然後我修改256到10080以適合我的情況。更改後可以繪製該圖。但是然後圖表沒有意義..你能幫我再檢查一次嗎? –

+1

你的意思是0附近的泛音?如果你的意思是0Hz處有能量,即DC,則這表示時域數據中的DC偏移。上傳圖片會很有用(如果您沒有足夠的鏈接到Imgur或類似的鏈接,並且有人會爲您編輯圖片,我不確定您需要多少點才能將圖片添加到問題中)。 – Blair

回答

2

做的(約)2HZ得到兩個尖峯。你的採樣週期約爲2.8毫秒(最好從我的第一幅圖中可以推斷出),給出+/- 2Hz的歸一化頻率+/- 0.056,這與你的尖峯位置有關。 fft.fftfreq默認返回歸一化的頻率(它縮放採樣週期)。您可以將d參數設置爲採樣週期,並且您將得到一個包含實際頻率的向量。

你在中間的巨大峯值顯然是直流偏移(你可以通過減去平均值來平均去除)。

+0

哇。真棒!是。確實。但是因爲我是Python的新手,請問能告訴我哪些Python語句可以用來使圖正確顯示?通過「正確顯示」,我的意思是1.移除微不足道的DC; 2.使x軸真正以赫茲刻度而不是kHz刻度... –

+1

'zAcc - = np.mean(zAcc)'去除平均值(帶有就地操作),以及'freq = np.fft。 fftfreq(t.shape [-1],d = 2.8e-3)'表示Hz的頻率(無論正確的採樣週期是多少)。此外,您使用副本,但不清楚它來自哪裏。我建議你使用複製方法而不是複製函數:'time = myData [:,0] .copy()' –

+0

太好了!現在我明白了。非常感謝你的幫助! –

1

正如其他人所說,我們需要查看數據,並將其發佈到某處。只是爲了檢查,儘量先固定在fftfreq的時間步長,然後繪製這個合成信號,然後繪製你的信號,看看他們如何比較:現在

timestep=1./50.#Assume sampling at 50Hz. Change this accordingly. 
N=10080#the number of samples 
T=N*timestep 
t = np.linspace(0,T,N)#needed only to generate xAcc_synthetic 
freq=2.#peak a frequency at 2Hz 
#generate synthetic signal at 2Hz and add some noise to it 
xAcc_synthetic = sin((2*np.pi)*freq*t)+np.random.rand(N)*0.2 
sp_synthetic = np.fft.fft(xAcc_synthetic) 
freq = np.fft.fftfreq(t.size,d=timestep) 
print max(abs(freq))==(1/timestep)/2.#simple check highest freq. 
plt.plot(freq, abs(sp_synthetic)) 
xlabel('Hz') 

,在x軸等於2,你實際上有一個物理頻率爲2Hz,並且您可能會發現您正在尋找的更明顯的峯值。此外,您可能還想看看yAcc和zAcc。

+0

我已經發布了比較圖。請幫忙。 :) –