如何应用FFT来查找信号的频率?

问题描述 投票:0回答:1

我目前正在开展一个项目,在这个项目中,我记录了加速器手机周期性运动的幅度,当我在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原始数据和平滑,但仍然没有运气。

python signal-processing frequency-analysis
1个回答
1
投票

您的信号具有直流偏置。直流偏置与频率为0的余弦波相同(对于FFT)。此直流偏置似乎也大于信号中的周期性幅度变化。所以f = 0是预期的结果。

你可以尝试至少两件事。您可以在频率仓0之后查找FFT结果幅度中的下一个峰值。绘制FFT幅度,您可能会看到它。或者,您可以在执行FFT之前减去DC偏置(所有样本的平均值/平均值),这将消除频率bin 0处的大FFT结果。

请注意,FFT结果的bin中心频率只是FFT长度中整数周期的频率。如果实际频率不是其中之一,则必须进行插值。 Sinc核插值是FFT结果数据的合适插值器。

© www.soinside.com 2019 - 2024. All rights reserved.