第一次来这里,提前对任何破碎的格式表示歉意。
我对DSP完全是新手,只有非常普通的对傅里叶变换的理解。我正在尝试为Android SDK 9构建一个可视化器应用程序,其中包括android.media.audiofx.Visualizer中的Visualizer类。 http://developer.android.com/reference/android/media/audiofx/Visualizer.html
我正在使用的方法getFft()的javadoc如下:
“返回当前播放音频内容的频率捕获。 捕获是8位幅度FFT。请注意,FFT的大小是指定捕获大小的一半,但是返回频谱的两侧,产生与捕获大小相等的字节数。”
首先,“spectrum”的“both sides”是什么意思?此输出与标准FFT有何不同?
这是byte数组的一些示例输出,getFft()被赋予了124个点以使其简单,并且我抓取了前31个bin。以下是前31个bin的振幅:
{123, -2, -23, -3, 6, -16, 15, -10, -8, -12, 9, -9, 17, -6, -18, -22, -8, 4, -5, -2, 10, -3, -11, 3, -4, -11, -8, 15, 16, 11, -12, 12}
非常感谢任何帮助或解释!
编辑:看了一堆图表之后,我发现我的问题之一是Google没有指定使用的单位。几乎所有其他测量都是以mHz为单位进行的,那么假设FFT输出也是以mHz为单位,这样公平吗?有没有可以查看Visualizer类源代码的地方,这样我就可以弄清楚内部实际发生了什么?
我继续获取了getFft()的所有输出。
93, -2, -28, -16, -21, 19, 44, -16, 3, 16, -9, -4, 0, -2, 21, 16, -3, 1, 2, 4, -3, 5, 5, 10, 6, 4, -9, 7, -2, -1, 2, 11, -1, 5, -8, -2, -1, 4, -5, 5, 1, 3, -6, -1, -5, 0, 0, 0, -3, 5, -4, -6, -2, -2, -1, 2, -3, 0, 1, -3, -4, -3, 1, 1, 0, -2, -1, -1, 0, -5, 0, 4, -1, 1, 1, -1, 1, -1, -3, 2, 1, 2, -2, 1, 0, -1, -2, 2, -3, 4, -2, -2, 0, 1, -4, 0, -4, 2, -1, 0, -3, -1, -1, -1, -5, 2, -2, -2, 0, -3, -2, 1, -5, -2, 0, 0, 0, -2, -2, -1, -1, -1, -2, 0, 3, -3, -1, 0
如果我理解正确的话,我的输出应该是从-N到0到N。-N到0应该看起来和0到N一样。但是当我查看这些幅度时,我没有看到任何镜像数据。谷歌似乎表明输出应该在频谱的两侧都从0到N。因此,我应该能够从(output.length-1)/2到output.length-1获取数据。负振幅比采样率快,正振幅比采样率慢。我理解正确吗?