从噪声数据中获取FFT频率?

时间:2015-11-06 04:57:43

标签: java android fft frequency

我有一个数据阵列(大小为128),我正在使用FFT。我试图通过FFT频谱找到数据的频率。问题是公式<div class="col-md-12 aboutUs-ph padT10 content-ph_abt" ng-repeat="content in aboutList"> <div class="col-md-2 form-group" ng-if="content.image"> <img src="{{content.image}}" class="img-responsive" /> </div> <div class="col-md-9"> <span class="guidedTourText"><b>{{content.title}}</b></span> <br> <span>{{content.description}}</span> </div> </div> 似乎不起作用。我的数据非常嘈杂,我不知道是因为我的数据是嘈杂还是因为我做错了什么。以下是我的原始数据:

Raw Data

这是变换产生的频谱:

Spectrum

我在索引4处得到两个相等幅度的最大峰值,在输出数组中得到128。数据的频率应该在1.1333 Hz左右,但是当我使用公式时,我得到5-6或完全错误的值:

freq = i * Fs / N

其中freq = i * Fs / N; 是最大幅度峰值的数组索引,i是以Hz为单位的采样率,Fs是数据大小。

使用我的数据,你会得到N = 0.37 Hz,这与预期完全不同。

如果我的计算是正确的,有没有办法改善我的数据?或者,我对频率的计算是否不正确?

2 个答案:

答案 0 :(得分:1)

让我们首先确保您正在查看实际的幅度。 FFT将返回与每个频率仓相关联的复数值。这些复数值通常由两个值表示:一个用于实部,另一个用于虚部。然后可以通过计算sqrt(real*real+imaginary*imaginary)来获得频率分量的大小。

这应该给你一半的值和相应的光谱(用分贝表示的幅度):

enter image description here

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

enter image description here

与相应的光谱:

enter image description here

正如您所看到的,在箱11中可以更容易地观察到振荡频率,这使您freq = (11 * 11.9) / 128 = 1Hz。

但是请注意,删除这些频率成分低于0.25HZ是否是数据的改进取决于这些频率成分是否对您的应用程序感兴趣(可能不是因为您似乎对相对感兴趣更快的波动)。

答案 1 :(得分:-1)

您需要在FFT之前移除DC偏置(所有样本的平均值),以测量0 Hz附近(或FFT第0个结果仓附近)的频率。在去除直流偏置之后和FFT之前应用窗函数(von Hann或汉明窗)也可能有所帮助。