Android 2.3 Visualizer - 理解getFft()的麻烦

ebo*_*yen 15 android signal-processing fft visualizer android-sdk-2.3

第一次在这里如此抱歉任何屠宰格式.

所以我对DSP是全新的,所以我对傅里叶变换只有非常全面的了解.我正在尝试为Android SDK 9构建一个可视化应用程序,其中包括android.media.audiofx.Visualizer中的Visualizer类 http://developer.android.com/reference/android/media/audiofx/Visualizer.html

方法getFft()的javadoc,这是我使用的状态:

"返回当前正在播放的音频内容的频率捕获.捕获是一个8位幅度的FFT.请注意,FFT的大小是指定捕获大小的一半,但是频谱的两侧都返回,产生的字节数相等捕获大小."

首先,"光谱的双方"是什么意思?该输出与标准FFT有何不同?

这是字节数组的一些示例输出,getFft()给出了124点以保持简单,我抓住了前31个分档.以下是前31个箱子的大小:

{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}
Run Code Online (Sandbox Code Playgroud)

任何帮助或解释将不胜感激!

编辑: 因此,在盯着一堆图表后,看起来我的问题的一部分是谷歌没有指定使用的是哪个单位.几乎所有其他测量都是以mHz进行的,假设FTT输出也是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
Run Code Online (Sandbox Code Playgroud)

因此,如果我理解正确,我的输出应该是从-N到0到N.-N到0应该看起来像0到N.但是当我看这些幅度时,我没有看到任何镜像数据.Google似乎表明,光谱两侧的输出应该从0到N. 所以我应该能够将(output.length-1)/ 2中的数据带到output.length-1.负幅度移动得比采样率快,正幅度比采样率慢.我理解正确吗?

phe*_*cks 9

如果它可以帮助任何人,我已经创建了一个Visualizer,它从MediaPlayer获取输出并显示可视化.它适用于普通波形和FFT数据:

https://github.com/felixpalmer/android-visualizer

它包含用于将getFft()的输出转换为具有视觉意义的内容的代码.


Jas*_*n B 8

FFT输出样本k的频率由下式给出:

Fk = k * Fs / N,    k = 0,1,...,N-1 
Run Code Online (Sandbox Code Playgroud)

哪里

  • Fs 是时间序列输入的采样频率
  • N 是用于计算FFT的样本数

频谱的两边是指FFT输出中的正负频率.FFT强制频率输出是周期性的,周期为Fs.如果查看FFT输出,它将涵盖从0到Fs的频率.通过将FFT输出从0.5*Fs - > Fs移位到-0.5*Fs - > 0来查看-0.5*Fs到0.5*Fs范围内的频谱通常是有利的,因为它们因周期性而相等.

对于实值信号,如音频处理中的信号,负频率输出将是正频率的镜像.因此,在分析实际信号时通常只使用光谱的一侧.

另一个重点是0.5*Fs的重要性,称为奈奎斯特频率.信号只能准确地表示高达奈奎斯特频率的频率,并且其上方的任何信号将被混叠(折叠)回到频谱上,从而导致失真.

因此,对于可视化目的,您应该担心的是FFT输出样本对应于0到Fs/2的频率范围,因为这些是具有采样率Fs的实际信号的有意义的样本.