18 signal-processing frequency pitch-tracking detect
在印度的IIT-Bombay有这个技术节,在那里他们有一个名为"Artbots"的活动,我们应该设计具有艺术能力的艺术机器人.我有一个关于音乐机器人的想法,它以歌曲作为输入,检测歌曲中的音符并在钢琴上播放.我需要一些方法来帮助我计算歌曲音符的音高.关于如何去做的任何想法/建议?
Gan*_*ant 14
这正是我在这里做的去年项目:)除了我的项目是关于跟踪人类歌唱音调(我没有机器人播放曲调)的一件事情
我能想到的最快的方法是使用BASS库.它包含即用型功能,可以为您提供默认录制设备的FFT数据.看看BASS附带的"livespec"代码示例.
顺便说一下,原始FFT数据不足以确定基频.您需要使用Harmonic Product Spectrum等算法来获取F0.
另一个考虑因素是音频源.如果您要进行FFT并在其上应用谐波产品频谱.您需要确保输入只有一个音频源.如果它包含多个来源,例如在现代歌曲中,则需要考虑许多频率.
谐波积谱理论
如果输入信号是音符,则其频谱应包括一系列峰值,对应于基频,谐波分量为基频的整数倍.因此,当我们对频谱进行多次压缩(下采样)并将其与原始频谱进行比较时,我们可以看到最强的谐波峰值排列.原始光谱中的第一个峰值与压缩2倍的光谱中的第二个峰值重合,这与被压缩三倍的光谱中的第三个峰值一致.因此,当各种频谱相乘时,结果将在基频处形成清晰的峰值.
方法
首先,我们通过应用Hanning窗口将输入信号分成段,其中窗口大小和跳跃大小作为输入给出.对于每个窗口,我们利用短时傅里叶变换将输入信号从时域转换到频域.一旦输入处于频域,我们就将谐波产品频谱技术应用于每个窗口.
HPS涉及两个步骤:下采样和乘法.为了进行下采样,我们通过重采样在每个窗口压缩光谱两次:第一次,我们将原始光谱压缩两次,第二次压缩三次.完成后,我们将三个光谱相乘,找到与峰值对应的频率(最大值).该特定频率表示该特定窗口的基频.
HPS方法的局限性
这种方法的一些很好的特性包括:它在计算上很便宜,对加性和乘法噪声具有合理的抵抗力,并且可以根据不同类型的输入进行调整.例如,我们可以改变要使用的压缩光谱的数量,并且我们可以用光谱加法代替光谱乘法.然而,由于人的音调感知基本上是对数的,这意味着可能比高音调更不准确地跟踪低音调.
HPS方法的另一个严重缺陷是它的分辨率仅与用于计算频谱的FFT的长度一样好.如果我们执行短而快的FFT,我们可以考虑的离散频率数量有限.为了在输出中获得更高的分辨率(因此在我们的音调输出中看到更少的颗粒度),我们需要采用更长的FFT,这需要更多的时间.
来自:http://cnx.org/content/m11714/latest/
您是否尝试过维基百科有关音高检测的文章?它包含一些您可能感兴趣的参考资料。
此外,这里还有DSP 应用程序和库的列表,您可以在其中浏览。该列表只提到了 Linux 软件包,但其中很多都是跨平台的,并且有很多源代码可以查看。
仅供参考,大多数精通 DSP 的人都可以检测单声道录音中音符的音调。检测所有音符(包括和弦等)的音高要困难得多。