我目前正在开发一个打击乐教程程序。该程序要求我可以确定正在演奏的鼓,为此,我将分析鼓记录的频率,并查看频率是否在给定的范围内。
到目前为止,我一直在使用用于快速傅立叶变换的Apache math实现(http://commons.apache.org/math/),但我的问题是,一旦我完成了快速傅立叶变换,我如何使用结果数组来计算信号中包含的频率?
注意:我也尝试过使用自相关,但它似乎不能很好地使用鼓包中的样本
任何关于如何确定击鼓的帮助或替代建议都将不胜感激。
编辑:自从写了这篇文章以来,我发现了一个很棒的在线课程,关于在java中为时间/频率转换Spectrum Analysis in Java实现快速傅立叶变换
发布于 2010-12-21 00:52:22
在音乐信息检索领域,人们经常使用一个相关的度量,称为mel频率倒谱系数(MFCC)。
对于任何N个采样的信号段,取FFT。这些得到的N个样本被转换成一组MFCC,例如,包含12个元素(即,系数)。此12元素向量用于对仪器进行分类,包括使用哪个鼓。
要进行监督分类,可以使用支持向量机(SVM)之类的工具。LIBSVM是一个具有Java兼容性(以及许多其他语言)的常用库。您可以使用这些MFCC及其相应的仪器标签来训练SVM。然后,您通过提供一个查询MFCC向量来测试它,它将告诉您它是哪种仪器。
所以,总结一下,基本步骤是:
检查执行这些操作的Java包。(它们必须存在。我只是不认识他们。)相对而言,鼓转录比大多数其他乐器组更容易,所以我乐观地认为这将会奏效。
为了进一步阅读,这里有一大堆articles on drum transcription。
发布于 2017-02-08 07:24:03
当我使用DFT编写程序时,我让它为每个频率创建一个频率和振幅数组。然后我可以找到最大的振幅,并将它们与音符进行比较,从而很好地掌握演奏的内容。如果你知道鼓的大致频率,你应该能够做到这一点。
https://stackoverflow.com/questions/4490633
复制相似问题