15

第一次来这里,对于任何被屠杀的格式提前感到抱歉。

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

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

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

首先,“光谱的两边”是什么意思?此输出与标准 FFT 有何不同?

这是字节数组的一些示例输出,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}

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

编辑: 所以在盯着一堆图表之后,我的问题的一部分似乎是谷歌没有指定正在使用的单位。几乎所有其他测量都以 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。但是当我查看这些幅度时,我看不到任何镜像数据。谷歌似乎表明输出应该是从 0 到 N 就在频谱的两边。所以我应该能够将数据从 (output.length-1)/2 获取到 output.length-1。负幅度的移动速度快于采样率,而正幅度的移动速度低于采样率。我理解正确吗?

4

2 回答 2

9

如果它对任何人有帮助,我创建了一个 Visualizer,它从 MediaPlayer 获取输出并显示可视化。它适用于正常波形和 FFT 数据:

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

它包括将 getFft() 的输出转换为视觉上有意义的代码。

于 2011-12-14T01:09:42.933 回答
8

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

Fk = k * Fs / N,    k = 0,1,...,N-1 

在哪里

  • 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 的重要性,它被称为奈奎斯特频率。一个信号只能准确地表示高达奈奎斯特频率的频率,高于它的任何信号都将被混叠(折叠)回频谱上,从而导致失真。

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

于 2011-01-19T04:55:13.313 回答