首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >检测基波频率

检测基波频率
EN

Stack Overflow用户
提问于 2009-01-12 14:19:22
回答 10查看 22.1K关注 0票数 19

在印度的孟买有一个科技节,在那里他们有一个叫做“艺术机器人”的活动,在那里我们应该设计具有艺术能力的艺术机器人。我有一个关于音乐机器人的想法,它将一首歌作为输入,检测歌曲中的音符,并在钢琴上播放。我需要一些方法来帮助我计算这首歌音符的音高。有没有关于如何做的想法/建议?

EN

回答 10

Stack Overflow用户

发布于 2009-01-12 15:34:31

这正是我在这里做的最后一年的项目:)除了一件事,我的项目是跟踪人类歌声的音调(并且我没有机器人来演奏曲调)

我能想到的最快的方法是利用BASS library。它包含随时可用的功能,可以为您提供来自默认记录设备的FFT数据。看看BASS附带的"livespec“代码示例。

顺便说一句,原始的FFT数据不足以确定基频。你需要像这样的算法来获得F0。

另一个考虑因素是音频源。如果你要做快速傅立叶变换,并在上面应用谐波产品频谱。您需要确保输入只有一个音频源。如果它包含多个源,例如在现代歌曲中,将有许多频率需要考虑。

谐波乘积谱理论

如果输入信号是一个音符,那么它的频谱应该由一系列峰值组成,这些峰值对应于基频,其中谐波分量是基频的整数倍。因此,当我们多次压缩频谱(下采样),并将其与原始频谱进行比较时,我们可以看到最强的谐波峰值排列在一起。原始频谱中的第一个峰值与经二倍压缩的频谱中的第二个峰值重合,这与经三倍压缩的频谱中的第三个峰值重合。因此,当不同的频谱相乘时,结果将在基频上形成清晰的峰值。

方法

首先,我们通过应用汉宁窗口将输入信号划分为多个段,其中窗口大小和跳数大小作为输入。对于每个窗口,我们利用短时傅立叶变换将输入信号从时域转换到频域。一旦输入在频域中,我们将谐波乘积谱技术应用于每个窗口。

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

HPS方法的限制

这种方法的一些好的特点包括:计算成本低,对加性和乘性噪声有合理的抵抗力,并且可以对不同类型的输入进行调整。例如,我们可以改变要使用的压缩光谱的数量,并且我们可以用光谱相加来代替光谱乘法。然而,由于人类的音调感知基本上是对数的,这意味着低音调可能比高音调更不准确。HPS方法的另一个严重缺陷是,它的分辨率仅与用于计算频谱的FFT长度一样好。如果我们执行短而快的FFT,我们可以考虑的离散频率的数量是有限的。为了在我们的输出中获得更高的分辨率(因此在我们的音调输出中看到更少的颗粒),我们需要更长的FFT,这需要更多的时间。

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

票数 14
EN

Stack Overflow用户

发布于 2009-01-13 01:53:47

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

DAFX有大约30页专门用于基音检测,并提供了示例和Matlab代码。

票数 5
EN

Stack Overflow用户

发布于 2009-03-20 17:06:30

自相关- http://en.wikipedia.org/wiki/Autocorrelation

过零http://en.wikipedia.org/wiki/Zero_crossing (此方法用于廉价的吉他调谐器)

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/435533

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档