帮助使用 FFT 来确定音频样本的频率

Mad*_*dog 2 java signal-processing fft apache-commons frequency-analysis

我目前正在开发打击乐教程程序。该程序要求我可以确定正在播放什么鼓,为此我将分析鼓录音的频率并查看频率是否在给定范围内。

到目前为止,我一直在为 FFT 使用 Apache math commons 实现(http://commons.apache.org/math/),但我的问题是,一旦我执行了 FFT,我如何使用结果数组来计算频率包含在信号中?

注意:我也尝试过使用自相关进行试验,但它似乎不适用于来自架子鼓的样本

任何有关如何确定正在击中的鼓的帮助或替代建议将不胜感激

编辑:自从写这篇文章以来,我发现了一个很棒的在线课程,关于在 Java 中实现 FFT 以进行时间/频率变换在 Java 中的频谱分析

Ste*_*joa 5

在音乐信息检索领域,人们经常使用称为梅尔频率倒谱系数(MFCC)的相关度量。

对于信号的任何 N 样本段,进行 FFT。那些得到的 N 个样本被转换成一组 MFCC,例如包含 12 个元素(即系数)。这个 12 元素向量用于对乐器进行分类,包括使用哪个鼓。

要进行监督分类,您可以使用支持向量机(SVM) 之类的东西。LIBSVM是一个常用的库,它具有 Java 兼容性(和许多其他语言)。您可以使用这些 MFCC 及其相应的仪器标签来训练 SVM。然后,您通过提供查询 MFCC 向量对其进行测试,它会告诉您它是哪种仪器。

所以基本程序,总结一下:

  1. 得到 FFT。
  2. 从 FFT 获取 MFCC。
  3. 使用 MFCC 和仪器标签训练 SVM。
  4. 使用查询信号的 MFCC 查询 SVM。

检查执行这些操作的 Java 包。(它们一定存在。我只是不认识它们。)相对而言,鼓转录比大多数其他乐器组更容易,所以我很乐观这会奏效。

为了进一步阅读,有一大堆关于鼓转录文章