了解FFT输出
我需要一些帮助来理解DFT / FFT计算的输出。
我是一名经验丰富的软件工程师,需要解释一些智能手机加速度计读数,例如查找主要频率。不幸的是,十五年前,我睡遍了大部分大学EE课程,但在过去的几天里,我一直在阅读DFT和FFT(显然无济于事)。
请不要回答“去上EE课”。如果我的雇主愿意付钱给我,我实际上打算这样做。:)
所以这是我的问题:
我捕获了一个32 Hz的信号。下面是一个 1 秒的 32 点示例,我在 Excel 中绘制了该示例。
然后,我从哥伦比亚大学得到了一些用Java编写的FFT代码(在遵循了“Java中可靠和快速的FFT”帖子中的建议之后)。
该程序的输出如下所示。我相信它正在运行一个就地FFT,因此它重新使用相同的缓冲区进行输入和输出。
Before:
Re: [0.887 1.645 2.005 1.069 1.069 0.69 1.046 1.847 0.808 0.617 0.792 1.384 1.782 0.925 0.751 0.858 0.915 1.006 0.985 0.97 1.075 1.183 1.408 1.575 1.556 1.282 1.06 1.061 1.283 1.701 1.101 0.702 ]
Im: [0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ]
After:
Re: [37.054 1.774 -1.075 1.451 -0.653 -0.253 -1.686 -3.602 0.226 0.374 -0.194 -0.312 -1.432 0.429 0.709 -0.085 0.0090 -0.085 0.709 0.429 -1.432 -0.312 -0.194 0.374 0.226 -3.602 -1.686 -0.253 -0.653 1.451 -1.075 1.774 ]
Im: [0.0 1.474 -0.238 -2.026 -0.22 -0.24 -5.009 -1.398 0.416 -1.251 -0.708 -0.713 0.851 1.882 0.379 0.021 0.0 -0.021 -0.379 -1.882 -0.851 0.713 0.708 1.251 -0.416 1.398 5.009 0.24 0.22 2.026 0.238 -1.474 ]
所以,在这一点上,我不能对输出进行正面或反面的处理。我理解DFT概念,例如实部是分量余弦波的振幅,虚部是分量正弦波的振幅。我也可以按照《数字信号处理科学家和工程师指南》中的这张图:
所以我的具体问题是:
从FFT的输出中,我如何找到“最常出现的频率”?这是我对加速度计数据分析的一部分。我应该读取实(余弦)还是虚(正弦)数组?
我在时域中有一个32点输入。FFT 的输出难道不应该是实数的 16 元素数组和虚数的 16 元素数组吗?为什么程序给我32号的实数和虚数阵列输出?
与上一个问题相关,如何解析输出数组中的索引?鉴于我输入的32个样本以32 Hz采样,我的理解是,16个元素的数组输出的索引应该均匀分布到采样率(32 Hz)的1/2,所以我理解数组的每个元素表示(32 Hz * 1/2)/ 16 = 1 Hz是否正确?
为什么FFT输出有负值?我认为这些值表示正弦波的振幅。例如,Real[ 3 ] = -1.075的输出应该意味着频率为3的余弦波的幅度为-1.075。是吗?振幅怎么可能是负的?