音频数据 API 节拍检测

Posted

技术标签:

【中文标题】音频数据 API 节拍检测【英文标题】:Audio data API beat detection 【发布时间】:2014-01-16 20:34:15 【问题描述】:

我正在使用 Mozilla 音频数据 API,按照说明 here。

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

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

那个条件失败了,你知道为什么吗? 谢谢。

【问题讨论】:

您使用的是什么大小的 FFT?一般来说,FFT 不适合用于节拍检测,因为它缺乏时间分辨率。 嗯,FFT 的大小是什么意思?我只是认为使用这个 API 对我来说更容易,因为我没有很好的算法技能...... 这很重要。 FFT 在样本窗口上运行。根据定义,尝试使用 FFT 进行起始检测的任何算法的时间分辨率都是该窗口的周期——实际上,更小。如果您使用 1024pt FFT 进行操作,则在 44.1kHz 处的分辨率为 23ms - 换句话说,为 43 秒。实用的发病检测算法往往不是基于频域的。 【参考方案1】:

您的条件测试可能因多种原因而失败。对于阈值 1,震级的比例可能是错误的。您可能正在查看错误的震级。或者您正在测试的音乐类型的节拍可能不会改变幅度足以可靠地超过您的阈值。

存在一些关于节拍检测主题的大学研究论文,您可能会觉得阅读这些论文很有用。

【讨论】:

我会二次阅读有关该主题的学术文献。您也可以查看 Sonic Visualiser - 其中包括各种发病检测模块。使用频谱方法检测起始点的一个基本问题是,流行音乐中的许多起始点来自敲击声,这些声音往往类似于噪音——能量散布在很宽的频率范围内。

以上是关于音频数据 API 节拍检测的主要内容,如果未能解决你的问题,请参考以下文章

使用 FFT 从音频中过滤 hit-hat 节拍

AEJoy —— 表达式之音频节拍计数器JS

Android 可视化工具行为

在 Unity 中预处理音频频谱数据

SoundTouch实现音频变速变调

Android 端音频变声方案