[英]Python - FFT leads to wrong physical meanings
我是Python的新手。 我打算對付離散點(時間,加速度)的數組進行傅立葉變換,並將結果繪制出來。
我復制並粘貼示例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列的矩形矩陣。
因此,zAcc是從矩陣中提取的row3。
在Spyder繪制的圖中,大多數諧波都集中在0附近。它們都非常小。
但是我的數據實際上是步行者攜帶的手機的加速度(包括重力)。 因此,我希望最明顯的諧波發生在2Hz左右。
為什么圖無意義?
提前致謝!
=============更新:我的圖表======================
第一次域:
x軸以毫秒為單位。
y軸的單位為m / s ^ 2,由於地球重力,它的DC偏移約為10。
您確實會在(大約)2Hz處獲得兩個尖峰。 您的采樣周期約為2.8 ms(從我的第一幅圖中可以推斷出的效果最好),使+/- 2Hz的歸一化頻率為+/- 0.056,這大約是您的峰值所在。 默認情況下, fft.fftfreq
返回歸一化的頻率(縮放采樣周期)。 您可以將d
參數設置為采樣周期,然后將獲得一個包含實際頻率的向量。
您在中間的巨大尖峰顯然是DC偏移量(您可以通過減去均值來輕松消除)。
正如其他人所說,我們需要查看數據,並將其發布到某個地方。 僅檢查一下,嘗試首先將時間步長固定為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')
現在,在等於2的x軸上,您實際上具有2Hz的物理頻率,並且您可能會發現要尋找的更明顯的峰。 此外,您可能還想看看yAcc和zAcc。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.