flash - 使用 computeSpectrum() 进行音调检测返回 FFT 值

标签 flash actionscript-3 signal-processing fft

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

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

    或者链接,或者甚至来自其他脚本语言的示例脚本来掌握它?

    问候
    初始化代码

    最佳答案

    听起来您已经了解如何获得 FFT 频谱,对吗?

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

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

    有很多不同的方法可以找到真正的基本原理,每种方法在不同的环境中都可以更好地发挥作用。 comp.dsp 上的一个线程提到“FFT、倒谱、自动/互相关、AMDF/ASDF”。

    举一个简单的例子,每个红点与其相邻点的距离为 100 Hz,因此如果您使用寻峰算法,然后将每个谐波与下一个谐波之间的距离平均在一起,您将找到基波,但这会如果任何一个峰值被遗漏,或者包含额外的峰值,或者如果信号是对称的并且只包含奇次谐波(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

    关于flash - 使用 computeSpectrum() 进行音调检测返回 FFT 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6283104/

    相关文章:

    android - 如何在安卓模拟器上安装 adobe flash

    iphone - 如何触发“相机”应用之类的明亮闪光?

    flash - AS3 - bitmapData 边缘 alpha 透明度问题

    actionscript-3 - AS3滚动条内容公式

    actionscript-3 - AS3 - 距离下一帧/屏幕绘制还有多长时间

    javascript - Flash 与 (Ex)Canvas 与 SVG/VML

    actionscript-3 - Flash 站点架构 - 一个 swf 还是多个?

    objective-c - 在缓冲区中添加2个正弦波会产生噪声

    c - 从麦克风插头获取原始信号

    c - 有没有人知道如何用 Kiss-fft API 替换 fftw 中的这些 API?