使用computeSpectrum()进行音高检测返回FFT值

时间:2011-06-08 17:55:05

标签: flash actionscript-3 signal-processing fft

  • 我正在使用ActionScript 3.0 for Flash Player 10.3
  • 进行开发
  • 我在加载的.mp3上使用 computeSpectrum()
  • 运行* Event.ENTER_FRAME *以获取byteArray中每个样本的快照
  • ByteArray包含512个值(每个通道256个)。这些值是FFT Spectrum,范围从0到1.
  • 我无法使用每个样本的峰值频率(正如我发现的那样!),因为最高值不一定是基频! 结果我得到了很多随机值! 当然我也得到了一些正确的,但这还不够!

我发现了自动关联 ...
有人能给我一个如何使用它的例子吗?

或链接,或者甚至是其他脚本语言的示例脚本来控制它?

问候
initcode

4 个答案:

答案 0 :(得分:7)

听起来你已经明白了如何获得FFT频谱,对吗?

spectrum http://flic.kr/p/7notw6

但是如果你正在寻找基础(绿点),你不能只使用最高峰。它不一定是根本。在我的例子中,实际基波是100 Hz,但最高峰值是300 Hz。

有许多不同的方法可以找到真正的基础,每种方法在不同的环境中都能更好地运作。 comp.dsp上的一个帖子提到“FFT,倒谱,自动/互相关,AMDF / ASDF”。

举一个简单的例子,每个红点距离它的邻居都是100赫兹,所以如果你使用峰值寻找算法然后将每个谐波和下一个谐波之间的距离平均在一起,你就会找到基本的,但是如果遗漏了任何峰值,或者包含额外的峰值,或者如果信号是对称的并且仅包含奇次谐波(1f,3f,5f),则会失败。你需要找到模式然后扔掉异常值然后平均。这可能是一种容易出错的方法。

您还可以对原始波形进行自相关。从概念上讲,这意味着将波形的副本滑过自身,并找到最适合自身的延迟(这将是一个完整的周期)。在正常实施中,we use the FFT, though, to speed it up。自相关基本上是

  • IFFT(FFT(信号)⋅FFT(信号)*)

其中*表示复共轭或时间反转。 In Python, for instance

correlation = fftconvolve(sig, sig[::-1], mode='full')

和fftconvolve()的来源相对简单:https://github.com/scipy/scipy/blob/master/scipy/signal/signaltools.py#L133

答案 1 :(得分:1)

只要没有太多的杂散频率峰值,您就可以使用谐波乘积谱方法估算频谱中泛音峰值之间的距离(频率差异)(即使某些峰值丢失),即使某些峰值丢失也是如此(噪声)。

要进行谐波产品光谱,请将FFT打印在半透明纸上,然后将其卷成圆柱体(或在软件中执行等效操作)。将气缸包裹得更紧,更紧,直到最大量的峰重叠。圆周将是对音高的良好估计。这适用于任何具有大量谐波的音乐声音,即使基音音频峰值缺失或较弱。

答案 2 :(得分:0)

答案 3 :(得分:0)

你想做什么?

我之前没有使用过computeSpectrum(),而是在我职业生涯的前半部分担任DSP工程师。

如果它符合文档的说法,那么您不需要自动相关结果。

在您的字节数组中,索引表示频率仓,索引值表示该特定频率的大小。

如果通过音高检测,您的意思是找到最强的频率,那么您需要遍历字节数组并计算每个索引的sqrt(left*left+right*right)。找到这些的最大值。最大值的索引表示最强的频率。

假设fs = 44.1kHz,而i是你的指数,那么最强的频率是

f =(i / 255)*(44100/2);

请注意,您受频率分辨率的bin间距限制。如果需要更高的分辨率,则需要插入数据。