我有一些关于 FFT 的问题(实际上我相信这更多是关于 Visualizer.getFFT() 的 Android FFT 输出)。
我为 Android 创建了一个带有自己的库功能的音乐播放器,其中包括很多东西(如流派、动态播放列表和可视化)。目前,在渲染当前音频流的频谱时,我创建的可视化遇到了一些问题。
我已经阅读了以下问题(和答案)来了解 Android 的 FFT:
Android 2.3 Visualizer - 无法理解 getFft()
现在我的问题是:我从 getFFTs 系数获得的频谱似乎有些“奇怪”。我注意到,在播放歌曲时,我渲染的频谱似乎显示出很多“噪音”,因此我尝试使用一些测试声音。其中之一是简单的 8khz 声音,它应该只在图表中产生一个峰值。不幸的是,结果如下所示:
http://img4.imageshack.us/img4/4181/spectrum8khz.png
底部出现的噪声在图表的整个宽度上闪烁。高条保持在原位,仅在幅度上轻微闪烁。
当我使用从 1kHz 缓慢移动到 20kHz 的测试声音时,它看起来如下(大约 2-3kHz):
http://img846.imageshack.us/img846/7373/spectrum3khz1khz20khz.png
峰从左向右移动,每个峰的移动速度都快一点,因此随着时间的推移,峰之间的距离会逐渐增大。不可见的是,一旦峰值离开右侧屏幕(但幅度较小),它们就会返回并从右向左移动。此外,所有峰都在略大于屏幕 0.5 的位置处连接到一个大峰。
这是我用来检索数据的代码:
for (int i = 1; i < n / 2; i++) {
byte rfk = mRawSpecData[2*i];
byte ifk = mRawSpecData[2*i+1];
float magnitude = (float)Math.sqrt(rfk * rfk + ifk * ifk);
mFormattedSpecData[i-1] = magnitude / 128f;
}
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,我的 mRawSpecData …