我已经在StackOverflow上阅读了有关在加速度计数据上执行FFT的各种帖子,但这些都没有帮助我理解我的问题。
我正在以下列方式在我的加速度计data
数组上执行this FFT实现:
int length = data.size();
double[] re = new double[256];
double[] im = new double[256];
for (int i = 0; i < length; i++) {
input[i] = data[i];
}
FFT fft = new FFT(256);
fft.fft(re, im);
float outputData[] = new float[256];
for (int i = 0; i < 128; i++) {
outputData[i] = (float) Math.sqrt(re[i] * re[i]
+ im[i] * im[i]);
}
我绘制了outputData
(左,)的内容,并使用R对我的数据执行FFT(右)。
我在这里做错了什么?我使用相同的代码执行我在其他地方看到的FFT。
编辑:按照@PaulR的建议应用窗口函数,以及@BjornRoche(http://baumdevblog.blogspot.com.br/2010/11/butterworth-lowpass-filter-coefficients.html)提供的链接,我能够解决我的问题。解决方案几乎就是该链接中描述的内容。这是我的图表:http://imgur.com/wGs43
答案 0 :(得分:3)
低频伪影可能是由于缺乏窗口造成的。尝试应用窗口函数。
整体转变可能是由于两种不同的FFT实现中的不同缩放因子 - 我的猜测是你看到24 dB的偏移,这相当于缩放的差异256倍。
答案 1 :(得分:-2)
因为左边的所有数据都高于0,所以对于频率分析,它是一个DC信号。所以在你的fft之后,它将DC信号抽象出来,它非常休。对于您的场景,您只需要切断直流信号,只需将信号保持在0 Hz(交流信号),这是有道理的。