我花了很多年研究和弦音乐的音高检测-就像检测mp3录音中吉他独奏的音符一样。我还写了关于Wikipedia的部分,简要介绍了该过程(请看下面链接中的“音高检测”小节)。
当在钢琴上按下单个键时,我们听到的不仅是声音振动的一个频率,而是在不同的数学相关频率下发生的多个声音振动的组合。这种在不同频率下的振动合成的元素称为谐波或部分谐波。例如,如果我们按钢琴上的中音C键,则复合谐波的单个频率将从261.6 Hz开始作为基频,523 Hz为第二谐波,785 Hz为第三谐波,1046 Hz是4次谐波,等等。后面的谐波是基频261.6 Hz的整数倍(例如:2 x 261.6 = 523、3 x 261.6 = 785、4 x 261.6 = 1046)。
我使用修改后的DFT对数变换,首先通过查找峰值电平的频率来检测可能的谐波(请参见下图)。由于我为修改后的Log DFT收集数据的方式,我不必对信号应用开窗功能,也不必添加和重叠。我已经创建了DFT,以便将其频率通道对数定位,以便与吉他,萨克斯风等音符产生谐波的频率直接对齐。
现在已经退休了,我决定在一个名为PitchScope Player的免费演示应用程序中发布我的音高检测引擎的源代码。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文件中任何给定时刻的最主要音高(音符)。这通常与器乐独奏的音符相对应。那些对我的2级音高检测算法的C ++源代码感兴趣的人可能希望从GitHub.com上SPitchCalc.cpp文件中的Estimate_ScalePitch()函数开始。
https://github.com/CreativeDetectors/PitchScope_Player
https://zh.wikipedia.org/wiki/Transcription_(音乐)#Pitch_detection
下图是对数DFT(由我的C ++软件创建)的图像,在多音mp3录音中吉他独奏3秒。它显示了弹奏独奏时吉他上各个音符的谐波如何出现。对于此对数DFT的每个音符,我们可以看到其多个谐波垂直延伸,因为每个谐波将具有相同的时间宽度。确定音符的八度之后,我们便知道基本音的频率。
下图演示了八度音阶检测算法,一旦确定了该音阶的ScalePitch,我就会开发该算法来选择正确的八度音阶候选音符(即正确的基本音阶)。那些希望在C ++中看到该方法的人应该转到名为FundCandidCalcer.cpp的文件内的Calc_Best_Octave_Candidate()函数,该文件包含在我在GitHub上的源代码中。