2014-01-16 84 views
0

我正在使用Mozilla音频数据API,按照说明here音频数据API节拍检测

上面的代码在FFT算法中使用了Float32Array。它似乎保留了后来储存在magnitude中的频率变化。我想制定一个条件来确定这个数字是否大于1,如下所示:

if (magnitude > 1) { 
    beat = true; 
} else { 
    beat = false; 
} 

该条件失败,您有什么想法为什么? 谢谢。

+0

您使用的FFT大小是多少?一般来说,FFT对于节拍检测来说是一个糟糕的选择,因为它缺乏时间分辨率。 – marko

+0

嗯你是什么意思的FFT的大小?我只是认为使用这个API对我来说更容易,因为我没有很好的算法技能...... – keepthepeach

+0

这是一件大事。 FFT在采样窗口上运行。根据定义,任何试图用FFT进行起始检测的算法的时间分辨率都是这个窗口的周期 - 在实践中,更少。如果您使用1024pt FFT进行操作,那么分辨率为23ms的44.1kHz - 换言之,即43秒。实际的发病检测算法往往不是基于频域的。 – marko

回答

0

由于各种原因,您的条件测试可能会失败。当阈值为1时,幅度的大小可能是错误的。您可能看错了幅度。或者您正在测试的音乐类型可能会有跳动,但幅度不会超过您的阈值。

有关节拍检测主题的大学研究论文,您可能会发现有用的阅读。

+0

我会再次读这方面的学术文献。您也可以结帐出声波显像管 - 它包含了各种起始检测模块。频谱方法检测发音的一个基本问题是,流行音乐中的许多发音都来自撞击声音,这些声音倾向于类似噪音 - 能量在各种频率上发生碰撞。 – marko