第一次在这里对所有屠宰格式提前抱歉。
所以我对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}
非常感谢任何帮助或解释!
编辑 因此,在盯着一堆图表之后,看起来我的问题的一部分是Google没有指定正在使用的单位。几乎所有其他测量都是以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
所以,如果我理解正确,我的输出应该是从-N到0到N.-N到0应该看起来像0到N.但是当我看这些振幅时,我看不到任何镜像数据。 Google似乎表明,光谱两侧的输出应该从0到N.所以我应该能够将(output.length-1)/ 2中的数据带到output.length-1。负幅度移动得比采样率快,正幅度比采样率慢。我理解正确吗?
答案 0 :(得分:9)
如果它可以帮助任何人,我创建了一个Visualizer,它从MediaPlayer获取输出并显示可视化。它适用于普通波形和FFT数据:
https://github.com/felixpalmer/android-visualizer
它包含用于将getFft()的输出转换为具有视觉意义的内容的代码。
答案 1 :(得分:8)
FFT输出样本k的频率由下式给出:
Fk = k * Fs / N, k = 0,1,...,N-1
,其中
Fs
是时间序列输入的采样频率N
是用于计算FFT的样本数频谱的两边是指FFT输出中的正负频率。 FFT强制频率输出为periodic with a period of Fs。如果查看FFT输出,它将涵盖从0到Fs的频率。在-0.5 * Fs至0.5 * Fs的范围内观察频谱通常是有利的,而不是通过将FFT输出从0.5 * Fs - >移位。 Fs为-0.5 * Fs - >由于周期性,它们是相等的。
对于实值信号,如音频处理中的信号,负频率输出将是正频率的镜像。因此,在分析实际信号时通常只使用光谱的一侧。
另一个重点是0.5 * Fs的重要性,称为Nyquist Frequency。信号只能准确地表示高达奈奎斯特频率的频率,而高于它的任何信号都会被混叠(折叠)回频谱,导致失真。
因此,对于可视化目的,您应该担心的是FFT输出样本对应于0到Fs / 2的频率范围,因为这些是采样率为Fs的实际信号的有意义样本。