FFT 和加速度计数据:为啥我会得到这个输出?

Posted

技术标签:

【中文标题】FFT 和加速度计数据:为啥我会得到这个输出?【英文标题】:FFT and accelerometer data: why am I getting this output?FFT 和加速度计数据:为什么我会得到这个输出? 【发布时间】:2012-08-17 13:47:22 【问题描述】:

我在 *** 上阅读了有关对加速度计数据执行 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

【问题讨论】:

请问您为什么要将 FFT 应用于加速度计数据?至少在音频方面,人们似乎通常会在存在更好的东西时应用它。 @BjornRoche 例如,我将其应用于加速度计数据以找出肢体震颤的基本频率。它有助于分析帕金森氏症和特发性震颤等疾病。 您可能会发现这很有用。 blog.bjornroche.com/2012/07/… 另外,请考虑其他技术,例如自相关。 我还在从事一个(开源)项目,以分析从帕金森病患者那里收集的数据。我遇到了完全相同的问题,但应用窗口函数并没有太大帮助。如果您不介意查看我的代码或将您的代码发送给我,我将不胜感激:我的电子邮件是 uberscientist@gmail.com,谢谢 【参考方案1】:

低频伪影可能是由于缺少窗口。尝试应用窗口函数。

总体偏移可能是由于两种不同 FFT 实现中的不同比例因子造成的 - 我的猜测是您看到了 24 dB 的偏移,这对应于比例差异为 256 倍。

【讨论】:

我不明白你在这里说什么:“整体偏移可能是由于两种不同 FFT 实现中的不同比例因子造成的 - 我猜你看到的是 24 dB 的偏移,这对应于比例差异为 256 倍。”但是应用一个窗口函数,在我的例子中是布莱克曼窗口,效果很好。现在我正在按照@BjornRoche 建议的阅读来改进我正在做的事情。非常感谢! OK - 不同的 FFT 实现可能采用不同的缩放方法 - 有些在 FFT 中具有 N 因子,在 IFFT 中具有 1 因子,有些反之亦然,有些在两者上都有 sqrt(N)。所以如果你看到例如两个不同 FFT 之间的 N 差异因子,那么这可能就是解释。【参考方案2】:

因为左侧的所有数据都高于 0,所以对于频率分析,它是直流信号。所以在你的fft之后,它将DC信号抽象出来,非常好。对于你的场景,你只需要切断直流信号,只保留0 Hz以上的信号(交流信号),这是有道理的。

【讨论】:

以上是关于FFT 和加速度计数据:为啥我会得到这个输出?的主要内容,如果未能解决你的问题,请参考以下文章

使用 fft 加速器时的内存警告

iOS 上的 fft numpy 风格以非两个数据长度的幂加速

AVAudioRecorder 通过将 FFT 加速到频率 - 执行

加速框架 iOS - FFT 输入

FFT加速高精度乘法

为啥我会得到这个错误的输出?