给定选择标准的复音音高检测算法?

如何解决给定选择标准的复音音高检测算法?

是否有任何已知的 pitch detection algorithms 可以检测代表复调音乐的音频中的多个特定音符?

我看到的所有和弦音乐所引用的算法,如 MUSIC 或 ESPRIT,都专注于开放式领域,您不知道音频包含哪些音高,并试图使用该算法来检测它们。可以理解,这是一个非常困难的问题。

相反,我对一个更受限制的领域感兴趣,在那里你会得到一个包含 2-6 个特定音符的列表,你需要检查这些音符是否存在于音频中。我认为这将是一个更简单的问题,虽然仍然不是微不足道的,但我很难找到有关该主题代码或学术论文。

我的领域是一个应用程序,音乐家将在其中演奏乐器上的特定音符,该程序会向他们提供反馈,表明他们正确演奏了这些特定音符。

我目前正在尝试使用一些 NodeJS 和 C++ 代码来执行此操作,而我目前的(幼稚)方法是:

  1. 计算 FFT,并根据所有标准音高的频率范围对频率进行分箱。
  2. 计算所有频率的中值幅度,以用作噪声过滤的阈值 (T)。任何幅度低于此值的频率我都会作为背景噪声忽略。
  3. 对于我正在搜索的每个音符,我计算前 3 个谐波的频率,查找每个频率的幅度,如果它们都高于平均值,那么我假设该音符存在。

这有点奏效,但我遇到的问题是校准 T 阈值。如果它太高,它就会变得过于挑剔并且不会检测到任何音符,除非它们非常响亮。如果它太低,则它的辨别力不够,会返回误报。

潜在的困难在于,对于许多乐器而言,这些音符谐波的振幅没有一致的模式。有些有一个很大的基波,每个随后的谐波迅速减少。一些低音音符几乎没有基音,而其他谐波衰减非常缓慢。因此,当我发现当我找到适合高音音符的 T 阈值时,它不适用于低音音符,反之亦然。

而且由于我使用中值幅度进行噪声过滤,当两个音符以不等的音量一起演奏时,较大的音符可能会导致较弱的音符被滤除,即使较弱的音符仍然比FFT 中的任何其他音高。很难找到任何甜蜜点。

在这种情况下,我应该使用任何信号处理或过滤技术​​来提高准确性吗?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?