在印度的IIT-Bombay有这个技术节,在那里他们有一个名为"Artbots"的活动,我们应该设计具有艺术能力的艺术机器人.我有一个关于音乐机器人的想法,它以歌曲作为输入,检测歌曲中的音符并在钢琴上播放.我需要一些方法来帮助我计算歌曲音符的音高.关于如何去做的任何想法/建议?
这正是我在这里做的去年项目:)除了我的项目是关于跟踪人类歌唱音调(我没有机器人播放曲调)的一件事情
我能想到的最快的方法是使用BASS库.它包含即用型功能,可以为您提供默认录制设备的FFT数据.看看BASS附带的"livespec"代码示例.
顺便说一下,原始FFT数据不足以确定基频.您需要使用Harmonic Product Spectrum等算法来获取F0.
另一个考虑因素是音频源.如果您要进行FFT并在其上应用谐波产品频谱.您需要确保输入只有一个音频源.如果它包含多个来源,例如在现代歌曲中,则需要考虑许多频率.
谐波积谱理论
如果输入信号是音符,则其频谱应包括一系列峰值,对应于基频,谐波分量为基频的整数倍.因此,当我们对频谱进行多次压缩(下采样)并将其与原始频谱进行比较时,我们可以看到最强的谐波峰值排列.原始光谱中的第一个峰值与压缩2倍的光谱中的第二个峰值重合,这与被压缩三倍的光谱中的第三个峰值一致.因此,当各种频谱相乘时,结果将在基频处形成清晰的峰值.
方法
首先,我们通过应用Hanning窗口将输入信号分成段,其中窗口大小和跳跃大小作为输入给出.对于每个窗口,我们利用短时傅里叶变换将输入信号从时域转换到频域.一旦输入处于频域,我们就将谐波产品频谱技术应用于每个窗口.
HPS涉及两个步骤:下采样和乘法.为了进行下采样,我们通过重采样在每个窗口压缩光谱两次:第一次,我们将原始光谱压缩两次,第二次压缩三次.完成后,我们将三个光谱相乘,找到与峰值对应的频率(最大值).该特定频率表示该特定窗口的基频.
HPS方法的局限性
这种方法的一些很好的特性包括:它在计算上很便宜,对加性和乘法噪声具有合理的抵抗力,并且可以根据不同类型的输入进行调整.例如,我们可以改变要使用的压缩光谱的数量,并且我们可以用光谱加法代替光谱乘法.然而,由于人的音调感知基本上是对数的,这意味着可能比高音调更不准确地跟踪低音调.
HPS方法的另一个严重缺陷是它的分辨率仅与用于计算频谱的FFT的长度一样好.如果我们执行短而快的FFT,我们可以考虑的离散频率数量有限.为了在输出中获得更高的分辨率(因此在我们的音调输出中看到更少的颗粒度),我们需要采用更长的FFT,这需要更多的时间.
来自:http://cnx.org/content/m11714/latest/
只需评论一下:(谐波)声音中也可能会缺少基波谐波,这不会改变可感知的音高。作为极限情况,如果您使用方波(例如C#音符)并完全抑制一次谐波,则在相同的八度音阶中,感知到的音符仍为C#。在某种程度上,我们的大脑能够在猜出音符时补偿某些谐波的缺失,即使是第一次谐波也是如此。因此,要使用频域技术检测音高,您应考虑所有谐波(傅立叶变换幅度的局部最大值),并提取其频率的某种“最大公因数”。音高检测根本不是一个小问题...
DAFX大约有30页专用于音高检测,包括示例和Matlab代码。