实时音高检测

29

对于用户歌唱的实时音高检测,FFT自相关 得不到好的结果。我找不到C / C++方法。

麦克风输入数据是正确的,当使用正弦波时,结果或多或少是正确的音高。我通过从结果数组中取值,并将每个索引绘制在X轴上,将值绘制在Y轴上(两者都除以100,000,我使用OpenGL,不使用VST插件)。它看起来像随机点。如何可视化原始音频和自相关数据?


2
我怀疑你一直在“错误地做”。你是否解决了其他问题中的根本问题?整个“随机结果”的事情听起来像是你还没有把那些方法搞对。 - dmckee --- ex-moderator kitten
2
这个问题在我看来与“摇滚乐队”游戏中用于人声的音高检测非常相似 - 而且他们似乎已经成功地让它工作了。这让我相信一定有方法可以解决它。只是通过阅读维基百科上关于音高检测的文章,似乎这不是一个简单的问题。如果您找到了一个好的方法,我们希望您能在这里发布答案! - Mike Dinescu
9
为了进行调试,请尝试吹口哨。吹口哨的声音包含一个非常强的频率和很少的泛音。如果您还没有这样做,您也应该可视化FFT的输出。 - Thomas
1
我必须同意Thomas关于可视化的观点。绘制图形是了解分析声音特性的好方法。 - avakar
1
...或者在自相关的情况下,计算每个可能周期的相关系数。 - avakar
显示剩余8条评论
12个回答

0

以下是一些实现音高检测的开源库:

  • WORLD:语音分析/合成工具包。如果您的源信号是声音,这个工具包特别适用。
  • aubio:音频特征提取库。实现了许多音高检测算法。
  • Pitch detection:C++实现的一组音高检测算法。
  • dywapitchtrack:高质量的音高检测算法。
  • YIN:在单个C++源文件中实现的YIN算法的另一个实现。

0

你能从乐器调音器中借鉴一些东西吗?我那款小巧玲珑的吉他调音器能够相当准确地检测弦的音高。我看到了这个关于钢琴调音器的参考资料,其中部分解释了算法。


我尝试过从一些吉他调音器代码(使用FFT)中进行调整,但结果却是五花八门的。 - Niall

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接