我有一个正在使用FFT的数据数组(大小为128)。我试图通过FFT频谱找到数据的频率。问题是公式freq = i * Fs / N似乎不起作用。我的数据非常嘈杂,我不知道这是因为我的数据嘈杂还是因为我做了其他错误的事情。以下是我的原始数据:

这是从变换中得到的光谱:

在输出数组中,我在索引4和128处得到了两个大小相等的最大峰值。数据的频率应该在1.1333 Hz左右,但当我使用公式时,我得到了5-6或完全错误的值:
freq = i * Fs / N;其中i是最大幅度峰值的数组索引,Fs是以Hz为单位的采样率,N是数据大小。
使用我的数据,您得到的freq = (4 * 11.9) / 128 = 0.37 Hz,这与预期相差很远。
如果我的计算是正确的,有什么方法可以改善我的数据吗?或者,我对频率的计算是错误的吗?
发布于 2015-11-07 03:05:21
首先让我们确保你看到的是实际的大小。FFT将返回与每个频率段相关联的复数值。这些复数值通常由两个值表示:一个用于实数部分,另一个用于虚数部分。然后,可以通过计算sqrt(real*real+imaginary*imaginary)来获得频率分量的大小。
这应该会给出一半的值和相应的频谱(以分贝表示的幅度):

如你所见,在0Hz附近有一个很强的峰值。这与您的原始数据具有较大的平均值,以及从时间0到~4.2s (这两者都大于振荡的幅度)的增加趋势是一致的。如果我们去除这些低频贡献(例如,使用截止频率约为0.25 the的高通滤波器),我们将获得以下波动数据:

具有相应的谱:

正如您所看到的,振荡频率在bin 11中可以更容易地观察到,它给出了freq = (11 * 11.9) / 128 =1 1Hz。
但是,请注意,删除低于0.25 in的这些频率分量是否是对数据的改进取决于这些频率分量是否对您的应用程序感兴趣(可能不是,因为您似乎对相对更快的波动感兴趣)。
发布于 2015-11-07 03:29:18
您需要在FFT之前去除直流偏置(所有样本的平均值),以测量接近0 Hz (或接近FFT的第0个结果框)的频率。在去除直流偏置之后、FFT之前应用窗函数(von Hann或Hamming窗)也可能有所帮助。
https://stackoverflow.com/questions/33559793
复制相似问题