Python - FFT导致错误的物理意义

时间:2013-05-28 09:09:56

标签: python numpy python-3.x matplotlib

我是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左右。

为什么图表没有意义?

提前致谢!

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

After the above-mentioned codes

Zoomed-in

第一次域名:

x轴以毫秒为单位。

y轴以m / s ^ 2为单位,由于地球引力,它的直流偏移为~10。

2 个答案:

答案 0 :(得分:2)

在(大约)2Hz时得到两个尖峰。您的采样周期约为2.8 ms(我可以从您的第一个图中推断出最佳值),给出+/- 2Hz的标准化频率+/- 0.056,这大约是您的峰值所在。默认情况下,fft.fftfreq返回标准化频率(缩放采样周期)。您可以将d参数设置为采样周期,然后您将获得包含实际频率的向量。

你中间的巨大尖峰显然是DC偏移(你可以通过减去平均值来轻易删除)。

答案 1 :(得分: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。