第一次在这里,很抱歉任何屠宰格式。

因此,我是DSP的新手,因此我对傅立叶变换只有非常一般的了解。我正在尝试为Android SDK 9构建一个可视化器应用程序,其中包括Android.media.audiofx的可视化器类。http://developer.android.com/reference/android/media/audiofx/visalizer.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中?是否有一个地方可以看到可视化器类的源代码,所以也许我可以弄清楚引擎盖下到底发生了什么?

我继续抓住了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。负幅度的移动速度快于采样率,正幅度的移动速度比采样速率慢。我正确理解了吗?

有帮助吗?

解决方案

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的意义,称为 Nyquist频率. 。信号只能准确地表示频率到Nyquist频率,其上方的任何内容都会被混合(折叠)回到频谱中,从而导致失真。

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

其他提示

如果它帮助任何人,我已经创建了一个可视化器,该可视化器从媒体播放器中获取输出并显示可视化。它可以与普通波形和FFT数据一起使用:

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top