我是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为单位,由于地球引力,它的直流偏移为~10。
答案 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。