如何在电吉他上进行音高跟踪时检测弦乐?

时间:2013-09-09 08:46:07

标签: c# audio fft guitar pitch-tracking

嗨,我是音频相关编码的菜鸟,我正在使用音调跟踪DLL,我将尝试创建一种开源版本的视频游戏Rocksmith作为学习体验。 / p>

到目前为止,我已经设法让FFT工作,所以我可以通过使用算法检测音高频率(Hz),下表我可以设法确定八度音程(第2到第6)和音符(C到B)播放音符。

下一步是检测字符串,以便我可以确定音品。

enter image description here

我一直在考虑它,理论上我可以使用它,我会知道当用户正在播放正确的音符但游戏可能是“黑客”,因为仅仅使用Hz游戏就无法检测是否在正确的字符串中播放了音符。例如,第5弦+第1音品= C4 261.63Hz 等于第6弦+第5音品= C4 261.63Hz

让用户在错误的字符串中播放音符并将其设置为正确的可能性很低,但我认为知道该字符串会非常好,所以当他们播放错误时我可以向用户提供一些错误反馈string(就像你应该向上或向下一个字符串)。

你知道我能做些什么来检测字符串吗?在此先感谢:)

[编辑]

我们使用的吉他和琴弦会影响音色,因此分析音色似乎不是检测琴弦的简单方法:

“吉他音色的变化是由拾音器设计和位置的大量因素,吉他的自然共振和阻尼产生的,因为使用了木材(这是一种不同的木材!)和它的结构和形状,弦乐的规格和年龄,你的演奏技巧,你在哪里烦恼和拔弦,等等。“

3 个答案:

答案 0 :(得分:3)

这可能有点晚了,因为帖子已经有一年了。但这是一个解决方案,经过长时间研究音调检测吉他后我发现了这个解决方案。

这就是为什么FFT无效:

您无法使用FFT,因为结果会为您提供线性阵列,并且会以对数方式计算声音(音符之间的指数距离)。此外,FFT为您提供了一系列频率可能会导致您的频率可能无法获得精确结果的频段。

这就是我的建议:

使用dywapitchtrack。它是一个使用小波算法的库,它直接在你的波上工作,而不是像FFT那样计算大的二进制数。

  

描述:    dywapitchtrack基于定制的算法,质量非常高:    两者都非常准确(精度<0.05半音),非常低的等待时间(<23毫秒)和    错误率非常低。它已经在人声中进行了彻底的测试。    它最好被描述为动态小波算法(dywa):

下载:https://github.com/inniyah/sndpeek/tree/master/src/dywapitchtrack

使用(C ++): 将.c和.h放在您需要的位置并将其导入项目

包含头文件

//Create a dywapitchtracker Object
dywapitchtracker pitchtracker;

//Initialise the object with this function
dywapitch_inittracking(&pitchtracker);

当你的缓冲区已满(缓冲区需要44100分辨率和2的长度功率,我的是2048):

//use this function with your buffer
double thePitch = dywapitch_computepitch(&pitchtracker, yourBuffer, 0, 2048);

瞧,thePitch包含了你所需要的。 (如果有什么不清楚,请随时提问)

答案 1 :(得分:2)

由于许多潜在的强烈泛音,简单的FFT峰值估计器不是一个好的吉他音调检测器/估计器。存在更强大的音调估计算法(search stackoverflow和DSP.stackexchange)。但是如果你要求玩家在开始游戏之前对其各自乐器上的每个弦进行预表征,无论是打开还是烦恼,那么这些特征的FFT指纹可能能够区分在一些吉他上的不同琴弦上演奏的相同音符。较粗的琴弦会释放一些较高泛音中略微不同的能量比率,以及不同程度的轻微不和谐。

答案 2 :(得分:0)

其他答案似乎暗示了一种简单的音高检测方法。但是,这是你必须研究的东西。

具体来说,比较第5弦第1音品和第6弦第5音品的泛音。也就是说,只看261.63 * 2,261.63 * 3,* 4等。另外,试试看261.63 * 0.5。比较这些频率下两个信号的幅度。可能存在可以检测到的模式。