2

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

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

注意:我也尝试过使用自相关,但它似乎不适用于鼓组中的样本

任何关于如何确定击打什么鼓的帮助或替代建议将不胜感激

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

4

2 回答 2

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 包。(它们一定存在。我只是不知道它们。)相对而言,鼓的转录比大多数其他乐器组更容易,所以我很乐观地认为这会奏效。

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

于 2010-12-20T16:52:22.403 回答
0

当我使用 DFT 编写程序时,我让它为每个频率创建一个频率和幅度数组。然后我可以找到最大的振幅,并将它们与音符进行比较,从而很好地掌握演奏的内容。如果您知道鼓的大致频率,您应该能够做到这一点。

于 2017-02-07T23:24:02.603 回答