Audio 实时基音检测

Audio 实时基音检测,audio,signal-processing,fft,pitch,pitch-tracking,Audio,Signal Processing,Fft,Pitch,Pitch Tracking,我正在尝试对用户唱歌进行实时音高检测,但我遇到了很多问题。我尝试了很多方法,包括FFT()和autocorrelation(),但似乎找不到任何能给出好结果的方法。有谁能建议一种实时音高跟踪的方法,或者如何改进我已有的方法?在实时基音检测中,我看不到任何优秀的C/C++方法。 谢谢 尼尔 编辑:请注意,我已经检查了麦克风输入数据是否正确,并且使用正弦波时,结果或多或少都是正确的音调 编辑:抱歉,这太晚了,但目前,我正在通过从结果数组中取出值和每个索引,并将索引绘制在X轴上,将值绘制在Y轴上(两者

我正在尝试对用户唱歌进行实时音高检测,但我遇到了很多问题。我尝试了很多方法,包括FFT()和autocorrelation(),但似乎找不到任何能给出好结果的方法。有谁能建议一种实时音高跟踪的方法,或者如何改进我已有的方法?在实时基音检测中,我看不到任何优秀的C/C++方法。 谢谢

尼尔

编辑:请注意,我已经检查了麦克风输入数据是否正确,并且使用正弦波时,结果或多或少都是正确的音调


编辑:抱歉,这太晚了,但目前,我正在通过从结果数组中取出值和每个索引,并将索引绘制在X轴上,将值绘制在Y轴上(两者都除以100000或其他,我使用OpenGL)来可视化自动收集,将数据插入VST主机并使用VST插件不是我的选择。目前,它只是看起来像一些随机点。我做得对吗,或者你能给我指出一些代码,或者帮助我理解如何可视化原始音频数据和自相关数据。

你能适应乐器调谐器的任何功能吗?我的吉他调谐器非常小巧,能够很好地检测出琴弦的音高。我看到这篇参考文献在某种程度上解释了一个算法。

我在几年前做的一个项目中遇到了一个类似的麦克风输入问题,结果是由于直流偏移

在尝试FFT或使用任何其他方法之前,请确保消除任何偏差

也可能是您遇到了净空或剪裁问题


图表是诊断大多数音频问题的最佳方法。

后退一步。。。要使这项工作正常进行,您必须找到一种方法来绘制此过程的中间步骤。您试图做的事情并不是特别难,但它容易出错,而且容易出错。削波、加窗、不良布线、混叠、直流偏移、读取错误通道、奇怪的FFT频率轴、阻抗不匹配、帧大小错误。。。谁知道呢。但是,如果您可以绘制原始数据,然后绘制FFT,则所有内容都将变得清晰。

请查看开放源代码库,其中包括几种最先进的基音跟踪方法。

请查看此示例应用程序:

我意识到这个应用程序是C语言,你需要C++,我意识到这是.NET/Windows,你在MAC上…但我认为他的FFT实现可能是一个起始参考点。尝试将您的FFT实现与his进行比较。(他的是库利·图基FFT的迭代、广度优先版本)。它们相似吗


此外,您所描述的“随机”行为可能是因为您直接获取声卡返回的数据,而没有正确组合字节数组中的值。您是否要求声卡对16位值进行采样,然后给它一个字节数组来存储这些值?如果是这样,请记住返回数组中的两个连续字节构成一个16位音频样本。

我在这里问了一个类似的问题:

编辑:

包含一个用于实时基音检测的C++模块< /P>


另外,基音跟踪算法

我发现了几个实时基音跟踪的开源实现

  • 使用基于小波的算法

  • 使用改进的自相关方法

  • (piem提到;有几种算法可用)

还有一些音高跟踪器可能不是为实时而设计的,但据我所知,它们可能是可用的,也可以作为参考,将您的实时跟踪器与:

  • 是一个开源软件包,语言学家有时使用它来提取音调,您可以在

  • 还包含一个沥青提取器


实时检测器的Java代码可从以下网址获得:


它在任何运行2008年后实时Java的计算机上都运行得相当好。该项目已被放弃,任何感兴趣的方都可以接手。如果您想了解更多详细信息,请与我联系。

我知道这个答案不会让每个人都高兴,但现在开始

这东西很硬,很硬。首先,阅读尽可能多的关于FFT、自相关、小波的教程。尽管我仍在努力使用DSP,但我确实从以下几点中获得了一些见解

该课程目前尚未开课,但视频仍然可用

本论文是关于基音识别算法的开发

专门用于数字信号处理的整个站点

如果你像我一样没有做足够的数学来完全遵循教程,不要放弃,因为一些图表和例子仍然帮助我理解发生了什么

接下来是测试数据和测试。为自己编写一个库,生成用于检查算法的测试文件

1) 一个超级简单的纯正弦波发生器。假设您正在编写YAT(另一个调谐器),然后使用正弦发生器以不同的增量创建一系列440Hz左右的文件,比如420-460Hz,并查看代码的灵敏度和准确性。它能在5Hz,1Hz,更精细的频率范围内分辨吗

2) 然后升级正弦波发生器,使其向信号中添加一系列较弱的谐波

3) 接下来是谐波的真实变化。因此,对于大多数弦乐器,你会看到一系列的谐波是基频F0的简单倍数,而对于单簧管和长笛等乐器,由于空气在室内的行为方式,偶数谐波将丢失或非常微弱。对于某些仪器,F0缺失,但可根据其他谐波的分布确定。F0是人耳所感知的音调

4) 用sh故意歪曲