我目前正在从事一个项目,在该项目中,我记录了手机进行周期性运动的加速器幅度,当我用python对其进行可视化并使其平滑时,这非常明显。然而;我正在尝试以编程方式获取信号(mag)的频率,到目前为止,我的所有尝试均以失败告终。 数据存储在包含几列的csv中,但是我提取了幅度列,使用低通滤波器对其进行了平滑处理,然后最终尝试在过滤后的幅度数组上使用numpy的fft函数,但是它没有给我预期的结果。
这是经过平滑处理后的可视化大小的图像:
如您所见,它是周期性的,仅通过查看就可以看出来,但是我不知道为什么FFT无法捕获到这一点。
我从numpy包和scipy中都尝试了FFT,两者都给了我相同的结果。
data = genfromtxt("data.csv", dtype=float, delimiter=',', names=True)
y = data['mag']
w = np.fft.fft(y)
freq = np.fft.fftfreq(len(w))
我从freq
获得的输出是“最高”频率为0(我不理解)的数组。如果有意义的话,我知道我记录设备中数据的采样率为20毫秒,并且我已经尝试过对原始数据以及平滑后的FFT进行测试,但是仍然没有运气。
答案 0 :(得分:1)
您的信号具有直流偏置。直流偏置与频率为0的余弦波相同(对于FFT)。该直流偏置似乎也大于信号中的周期性幅度变化。所以f = 0是预期的结果。
您至少可以尝试两种方法。您可以在频率仓0之后的FFT结果幅值中寻找下一个峰值。绘制FFT幅值,您可能会看到它。或者,您可以在执行FFT之前减去DC偏置(所有样本的均值/平均值),这将删除频率为0的大FFT结果。
请注意,FFT结果的二进制中心频率仅是FFT长度上为整数周期的频率。如果实际频率不是其中之一,则必须进行插值。正弦核内插是FFT结果数据的合适内插器。