1

我是 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 是从矩阵中提取的第 3 行。

在 Spyder 绘制的图中,大部分谐波集中在 0 附近。它们都非常小。

但我的数据实际上是步行者携带手机的加速度(包括重力)。所以我预计最重要的谐波发生在 2Hz 附近。

为什么图表是无意义的?

提前致谢!

==============更新:我的图表====================== 时域

在上述代码之后

放大

第一时域一:

x 轴以毫秒为单位。

y 轴以 m/s^2 为单位,由于地球重力,它的 DC 偏移量约为 10。

4

2 回答 2

2

确实会在(大约)2Hz 处获得两个尖峰。您的采样周期约为 2.8 毫秒(我可以从您的第一个图中推断出最好的结果),给 +/-2Hz 的归一化频率为 +/-0.056,这大约是您的尖峰所在的位置。fft.fftfreq默认情况下返回归一化频率(缩放采样周期)。您可以将d参数设置为采样周期,您将得到一个包含实际频率的向量。

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

于 2013-05-29T07:52:57.353 回答
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')

现在,在等于 2 的 x 轴上,您实际上具有 2Hz 的物理频率,并且您可能会发现您正在寻找的更明显的峰值。此外,您可能还想看看 yAcc 和 zAcc。

于 2013-05-28T23:48:03.873 回答