我试图做一个用户唱歌的实时基音检测,但我运行到的问题很多。 我试过很多方法,包括FFT( FFT问题(返回随机结果) )和相关性( 自相关基音检测返回与麦克风输入随机的结果 ),但我似乎无法得到任何的方法来提供一个良好的结果。 任何人都可以提出进行实时跟踪间距或如何提高我已经有方法的方法? 我似乎无法找到实时基音检测任何优秀的C / C ++的方法。
谢谢,
尼尔。
编辑:只是要注意,我已经签了麦克风输入的数据是正确的,并且使用正弦波时,结果都或多或少正确的音高。
编辑:对不起这是迟到了,但在目前,IM通过取值出来的结果阵列的可视化autocolleration,并且每个索引,并绘制在Y轴上对X轴上的索引和值(两者都除以100000东西,和IM使用OpenGL),将数据插入到一个VST宿主,并使用VST插件是不是一种选择我。 目前,它只是看起来像一些随机点。 我是做正确,或者你可以请点我torwards一些代码,这样做,或者帮助我了解如何以可视化的原始音频数据和自相关数据。
退一步......得到这个工作,你必须想出一个办法来绘制此过程中的中间步骤。 你正在试图做的是不是特别难,但它是很容易出错和繁琐。 裁剪,窗口,坏电线,走样,DC偏移,读错的通道,古怪的FFT频率轴,阻抗不匹配,帧大小错误...谁知道。 但是,如果你可以绘制原始数据,然后绘制FFT,一切都将变得清晰。
我发现实时跟踪间距的几个开源实现
dywapitchtrack使用基于小波算法
实时C#音调追踪器使用修改后的自相关方法
aubio (由piem提到;若干算法是可用的)
也有一些间距纤夫在那里它可能不被设计用于实时的,但可能会使用这种方式为我所知道的,而且也可以作为参照来比较你的实时跟踪有用:
我知道这个答案是不会让所有人都满意,但在这里不用。
这东西是很难,很辛苦。 首先去尽量多看教程,你可以找到关于FFT,自相关,小波。 虽然我仍然与DSP挣扎我从下面的一些见解。
https://www.coursera.org/course/audio过程中没有在时刻运行,但视频仍然可用。
http://miracle.otago.ac.nz/tartini/papers/Philip_McLeod_PhD.pdf论文围绕变桨识别算法的发展。
http://dsp.stackexchange.com整个网站专门为数字信号处理。
如果你像我做的还不够数学完全按照教程,不要放弃,因为一些图表和示例仍然帮助我了解了事情的原委。
接着是测试数据和测试。 自己写的,其产生的测试文件中检查你的算法/ s到使用图书馆。
1)一种超级简单纯正弦波发生器。 所以说,你正在寻找在写YAT(然而,另一个调谐器),然后使用您的正弦发生器,创造出一系列围绕440Hz的文件从420-460Hz在不同的增量说,看你的代码是如何灵敏和准确的。 它可以解析内5HZ,1Hz的,更细的还是?
2),它增加了一系列的弱谐波信号然后升级正弦波发生器。
3)接着是对谐波现实世界的变化。 因此,虽然对于大多数弦乐器,你会看到像的,因为空气的行为在室中的偶次谐波会丢失或非常弱的方式单簧管和长笛乐器一系列的谐波的基本频率F0的简单倍数的。 而对于一些仪器F0丢失,但可以从其他谐波的分布来确定。 F0是什么人耳感知音调。
4)通过以不规则的方式向上和向下移动所述谐波峰值频率在一些故意失真投掷
问题的关键是,如果你是用已知结果创建文件,那么它更容易验证你实际上是在建立什么工作,错误一边的过程。
也有一些“库”,在那里含有的声音样本。 https://freesound.org从上述Coursera系列。 http://theremin.music.uiowa.edu/MIS.html
下一步要知道,你的麦克风是不完美的,除非你已经花了几千上美元将有一个相当可变频率响应范围。 特别是如果您正在使用低音工作再便宜麦克风,阅读你的PC或手机内置的那些,都开始在大约80-100Hz显著滚降。 对于合理的良好外部因素你可能会下降到30-40Hz。 去找你的麦克风的数据。
您还可以检查通过扬声器播放的音,然后用你最喜爱的录音麦克风会发生什么。 但是,当然,我们现在所谈论的2台频率响应曲线。
当谈到性能也有一些免费软件库外面虽然看明白的各种许可模式。
首先你的第一个尝试几次后,不要放弃。 祝您好运。
我有一个项目,我做了几年前麦克风输入一个类似的问题 - 原来是由于直流偏移。
务必在尝试FFT或任何其它方式使用的是之前删除任何偏见。
这也有可能是你正在运行到余量或裁剪的问题。
图是诊断的大多数问题与音频的最佳方式。
下面是我设计的,可以在和弦 MP3文件做实时基音检测,而在Windows上正在播放一个不同寻常的两阶段算法的C ++源代码。 这个免费的应用程序(PitchScope球员 ,在网上提供)经常用来在一个MP3录音检测一把吉他或萨克斯独奏的音符。 该算法被设计为一个MP3音乐文件中检测时间在任何给定时刻最主要的音高(音符)。 注意起始点是由最有统治力的间距在任何给定时刻的MP3录音期间显著变化(音符)准确地推断。
当一个单独的按键在钢琴压,我们听到的不只是一个声音振动的频率,但在发生不同的数学相关频率的多个声音振动的复合材料 。 该复合振动的不同频率的元件被称为谐波泛音或。 举例来说,如果我们按下钢琴上的中央C键,复合材料的高次谐波的各频率将开始以261.6赫兹的基本频率,523赫兹是第2次谐波,785赫兹是第3次谐波,1046赫兹会是四次谐波等的高次谐波以后是基本频率的整数倍,261.6赫兹(例如:2×261.6 = 523,3×261.6 = 785,4×261.6 = 1046)。 在底部相连,是吉他独奏的和弦MP3记录期间出现的实际谐波的快照。
取而代之的是FFT的,我使用的改性DFT变换,具有对数频率间隔,通过寻找具有峰值电平的频率(参见下图)首先检测这些可能的谐波 。 因为我收集了我的修改日志DFT数据的方式,我没有到窗口函数应用到信号,也没有添加和重叠。 我已经创建了DFT所以其频率信道对数位于以直接与其中谐波由音符上的吉他,萨克斯管,等产生的频率对准
现在退役,我决定叫PitchScope播放器免费示范应用程序中发布的源代码,我的音高检测引擎。 PitchScope Player可在网络上,你可以下载可执行的Windows上看到您选择的MP3文件,我在工作中的算法。 其频率满足它定义了正确的整数关系,下面链接GitHub.com将带领您到我的完整的源代码,您可以查看我如何检测谐波与自定义对数变换DFT,然后找谐音(谐波)一'沥青'。
我的基音检测算法实际上是一个两阶段过程:a)首先将ScalePitch被检测到( 'ScalePitch'有12个可能的基音值:{E,F,F#,G,G#,A,A#,B,C,C#, d,d#})b)和被确定ScalePitch后,则八度是通过检查所有谐波的4个可能的倍频候选笔记计算。 该算法被设计为一个和弦MP3文件中检测时间在任何给定时刻最主要的音高(音符)。 这通常对应于器乐独奏的音符。 有志于C ++源代码,我的两阶段的基音检测算法可能想在在GitHub.com的SPitchCalc.cpp文件中的Estimate_ScalePitch()函数来启动。 https://github.com/CreativeDetectors/PitchScope_Player
下面是一个对数DFT的图像吉他独奏3秒和弦MP3录音(我的C ++软件创建的)。 它显示了谐波如何出现在吉他上单个音符,在播放独奏。 有关此对数DFT每一个音符,我们可以看到它的多种谐波垂直延伸,因为每个谐波将具有相同的时间宽度。 音符的八度确定后,我们就知道基本的频率。
检查出aubio ,和开源库,其包括国家的最先进的几种方法,用于音调跟踪。
看看这个示例应用程序:
http://www.codeproject.com/KB/audio-video/SoundCatcher.aspx
我意识到应用程序是在C#中,你需要C ++,我意识到这是的.Net / Windows和你在Mac上......但我想他的FFT实现可能的起始参考点。 尽量把执行FFT比较了。 (他是库利 - 图基的FFT的迭代,广度优先的版本)。 他们是否相似?
另外,你所描述的可能是因为你的情况下直接从字节数组正确组装的值通过抓住你的声卡返回的数据“随机”的行为。 你问过你的声卡采样16位的值,然后给它一个字节数组存储中的值? 如果是这样,请记住,返回数组中连续两个字节组成一个16-bit的音频采样。
用于实时检测实际的Java代码,请http://code.google.com/p/freqazoid/ 。
它的工作原理相当好运行2008年后的实时Java的任何计算机上。 该项目已被删除,可以通过任何利益相关方有所回升。 如果你想了解更多详细信息,请与我联系。
我也问过这里类似的问题:
C / C ++ / OBJ - C的实时算法,以确定从声音输入注意事项(未节距)
编辑:
Performous包含一个C ++用于实时音高检测模块
同时尹音高跟踪算法
你能适应从仪器调谐器什么吗? 我兴高采烈地紧凑的吉他调谐器能够检测琴弦的音调相当不错。 我看到这参考了钢琴调音师 ,其解释的算法在一定程度上。