【问题标题】:Help with using FFT to determine frequency of an audio sample帮助使用 FFT 确定音频样本的频率
【发布时间】:2011-05-28 07:10:36
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 鼓的录音将包含一系列频率的音频频谱内容,这些频率会随着时间的推移而变化/演变。所以你的主题行有点误导,因为没有单一的“频率”。

标签: java signal-processing apache-commons fft frequency-analysis


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

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

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

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

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

    为了进一步阅读,有一大堆articles on drum transcription

    【讨论】:

    • 感谢您的帮助,刚刚阅读了 MFCC,我认为这听起来可行 :)
    猜你喜欢
    • 1970-01-01
    • 2016-01-14
    • 1970-01-01
    • 1970-01-01
    • 2011-08-12
    • 2012-11-11
    • 1970-01-01
    • 2013-06-30
    • 1970-01-01
    相关资源
    最近更新 更多