当前位置:  开发笔记 > 人工智能 > 正文

检测基频

如何解决《检测基频》经验,为你挑选了2个好方法。

在印度的IIT-Bombay有这个技术节,在那里他们有一个名为"Artbots"的活动,我们应该设计具有艺术能力的艺术机器人.我有一个关于音乐机器人的想法,它以歌曲作为输入,检测歌曲中的音符并在钢琴上播放.我需要一些方法来帮助我计算歌曲音符的音高.关于如何去做的任何想法/建议?



1> Gant..:

这正是我在这里做的去年项目:)除了我的项目是关于跟踪人类歌唱音调(我没有机器人播放曲调)的一件事情

我能想到的最快的方法是使用BASS库.它包含即用型功能,可以为您提供默认录制设备的FFT数据.看看BASS附带的"livespec"代码示例.

顺便说一下,原始FFT数据不足以确定基频.您需要使用Harmonic Product Spectrum等算法来获取F0.

另一个考虑因素是音频源.如果您要进行FFT并在其上应用谐波产品频谱.您需要确保输入只有一个音频源.如果它包含多个来源,例如在现代歌曲中,则需要考虑许多频率.

谐波积谱理论

如果输入信号是音符,则其频谱应包括一系列峰值,对应于基频,谐波分量为基频的整数倍.因此,当我们对频谱进行多次压缩(下采样)并将其与原始频谱进行比较时,我们可以看到最强的谐波峰值排列.原始光谱中的第一个峰值与压缩2倍的光谱中的第二个峰值重合,这与被压缩三倍的光谱中的第三个峰值一致.因此,当各种频谱相乘时,结果将在基频处形成清晰的峰值.

方法

首先,我们通过应用Hanning窗口将输入信号分成段,其中窗口大小和跳跃大小作为输入给出.对于每个窗口,我们利用短时傅里叶变换将输入信号从时域转换到频域.一旦输入处于频域,我们就将谐波产品频谱技术应用于每个窗口.

HPS涉及两个步骤:下采样和乘法.为了进行下采样,我们通过重采样在每个窗口压缩光谱两次:第一次,我们将原始光谱压缩两次,第二次压缩三次.完成后,我们将三个光谱相乘,找到与峰值对应的频率(最大值).该特定频率表示该特定窗口的基频.

HPS方法的局限性

这种方法的一些很好的特性包括:它在计算上很便宜,对加性和乘法噪声具有合理的抵抗力,并且可以根据不同类型的输入进行调整.例如,我们可以改变要使用的压缩光谱的数量,并且我们可以用光谱加法代替光谱乘法.然而,由于人的音调感知基本上是对数的,这意味着可能比高音调更不准确地跟踪低音调.

HPS方法的另一个严重缺陷是它的分辨率仅与用于计算频谱的FFT的长度一样好.如果我们执行短而快的FFT,我们可以考虑的离散频率数量有限.为了在输出中获得更高的分辨率(因此在我们的音调输出中看到更少的颗粒度),我们需要采用更长的FFT,这需要更多的时间.

来自:http://cnx.org/content/m11714/latest/


这如何处理真实工具的不和谐性?从你想要的越高,谐波越来越尖锐.

2> Federico A. ..:

只需评论一下:(谐波)声音中也可能会缺少基波谐波,这不会改变可感知的音高。作为极限情况,如果您使用方波(例如C#音符)并完全抑制一次谐波,则在相同的八度音阶中,感知到的音符仍为C#。在某种程度上,我们的大脑能够在猜出音符时补偿某些谐波的缺失,即使是第一次谐波也是如此。因此,要使用频域技术检测音高,您应考虑所有谐波(傅立叶变换幅度的局部最大值),并提取其频率的某种“最大公因数”。音高检测根本不是一个小问题...

DAFX大约有30页专用于音高检测,包括示例和Matlab代码。

推荐阅读
牛尾巴2010
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有