我需要帮助理解DFT / FFT计算的输出结果。
我是一名有经验的软件工程师,需要解释一些智能手机加速度计读数,例如查找主频率。不幸的是,我在十五年前大学时睡了大部分的电子工程课程,但我最近几天一直在阅读DFT和FFT(显然收效甚微)。
请不要回答“去上一门电子工程课程”。如果我的雇主愿意付钱,我实际上正在计划这样做。 :)
所以这就是我的问题:
我以32 Hz的采样率捕获了一个信号。 这是32个点的1秒样本,我在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个元素的数组输出应该平均分布在采样率的1/2(即32 Hz / 2 = 16 Hz),那么每个数组元素是否表示(32 Hz * 1/2)/16 = 1Hz?
为什么FFT输出具有负值?我认为这些值代表正弦波的振幅。例如,Real [3]的输出为-1.075应该意味着频率为3的余弦波振幅为-1.075。对吗?振幅怎么可能是负数?