Python 如何应用FFT求信号的频率?

Python 如何应用FFT求信号的频率?,python,signal-processing,frequency-analysis,Python,Signal Processing,Frequency Analysis,我目前正在做一个项目,在这个项目中,我记录了一部手机做周期性运动时加速器的大小,当我用python可视化它并使其平滑时,这是非常明显的。然而我试图通过编程获得信号的频率(mag),到目前为止,我所有的尝试都失败了。 数据存储在一个csv中,其中包括几列,但我提取了震级列,用低通滤波器平滑它,然后最后尝试在过滤后的震级数组上使用numpy的fft函数,但它没有给出预期的结果 以下是平滑后我的可视化幅度图像: 正如你们所看到的,它是周期性的,你们可以通过观察它来判断,但我不知道为什么FFT不能捕捉

我目前正在做一个项目,在这个项目中,我记录了一部手机做周期性运动时加速器的大小,当我用python可视化它并使其平滑时,这是非常明显的。然而我试图通过编程获得信号的频率(mag),到目前为止,我所有的尝试都失败了。 数据存储在一个csv中,其中包括几列,但我提取了震级列,用低通滤波器平滑它,然后最后尝试在过滤后的震级数组上使用numpy的fft函数,但它没有给出预期的结果

以下是平滑后我的可视化幅度图像:

正如你们所看到的,它是周期性的,你们可以通过观察它来判断,但我不知道为什么FFT不能捕捉到它

我尝试了numpy包和scipy包中的FFT,它们都给出了相同的结果

data=genfromtxt(“data.csv”,dtype=float,delimiter=',,names=True)
y=数据['mag']
w=np.fft.fft(y)
freq=np.fft.fftfreq(len(w))

我从
freq
数组中得到的输出,“最高”频率为0,我不理解。如果相关的话,我知道我从设备记录数据的采样率是20毫秒,我已经用原始数据和平滑数据尝试了FFT,但仍然没有成功。

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

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


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

频率,而不是频率。傅里叶变换会发现不止一个被涉及和叠加。单一频率为正弦或余弦。你的例子不是这样的。第零频率是一个常数;它应该是序列中最低的项。我认为在b/c中,你的信号有一个直流分量,它不是零。你能试着把信号和它自己卷积起来,以捕捉周期,如所示吗?移除DC组件是一个很好的提示。