19

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

4

10 回答 10

14

这正是我作为我去年的项目在这里所做的:) 除了我的项目是关于跟踪人类歌声的音高的一件事(而且我没有机器人来演奏曲调)

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

顺便说一句,原始 FFT 数据不足以确定基频。您需要诸如谐波乘积谱之类的算法来获得 F0。

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

谐波乘积谱理论

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

方法

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

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

HPS 方法的局限性

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

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

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

于 2009-01-12T15:34:30.607 回答
5

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

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

于 2009-01-13T01:53:46.987 回答
3

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

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

于 2009-03-20T17:06:29.527 回答
2

试试YAAPT 音高跟踪,它可以检测时域和频域中的基频。您可以从链接下载 Matlab 源代码,并使用频谱处理部分在 FFT 输出中查找峰值。

Python 包http://bjbschmitt.github.io/AMFM_decompy/pYAAPT.html#

于 2012-07-10T06:44:06.133 回答
1

要从复音音乐中提取旋律的基频,您可以尝试使用 MELODIA 插件:http ://mtg.upf.edu/technologies/melodia

提取歌曲中所有乐器的 F0(多 F0 跟踪)或将它们转录成音符是一项更加艰巨的任务。旋律提取和音乐转录仍然是开放的研究问题,因此无论您使用哪种算法/工具,都不要期望获得完美的结果。

于 2013-01-24T14:22:44.440 回答
1

只是一个想法 - 但您是否需要处理数字音频流作为输入?

如果不是,请考虑使用音乐的符号表示(例如 MIDI)。然后,音符的音高将被明确说明,您可以非常轻松地合成与音高、节奏和许多其他音乐参数相对应的声音(和动作)。

如果您需要分析数字音频流(mp3、wav、实时输入等),请记住,虽然简单单声道声音的音高检测非常先进,但复音音高检测是一个未解决的问题。在这种情况下,您可能会发现我对这个问题的回答很有帮助。

于 2009-03-06T16:11:08.467 回答
1

你试过维基百科关于音高检测的文章吗?它包含一些您可能会感兴趣的参考资料。

此外,这里列出了 DSP 应用程序和库,您可以在其中四处寻找。该列表仅提及 Linux 软件包,但其中许多是跨平台的,并且您可以查看大量源代码。

仅供参考,在单声道录音中检测音符的音高对于大多数精通 DSP 的人来说是触手可及的。检测所有音符的音高,包括和弦等,要困难得多。

于 2009-01-12T14:34:44.593 回答
1

如果您尝试检测和弦录音的音符(同时有多个音符),祝您好运。这是一个非常棘手的问题。我不知道有什么方法可以听,比如说,弦乐四重奏的录音,并有一个算法将四个声音分开。(也许是小波?)如果一次只有一个音符,那么有几种音高跟踪算法,其中许多在其他评论中提到。

您要使用的算法将取决于您正在听的音乐类型。如果你想让它拾起人们唱歌,那么有很多专门为语音设计的优秀算法。(大部分研究都在那儿。)如果你想选择特定的乐器,你就必须更有创意。语音算法可以很简单,因为人类歌声的范围通常被限制在 100-2000 Hz 左右。(说话范围要窄得多)。然而,钢琴的基本频率从大约 27 Hz 开始。到 4200 Hz,因此您正在处理通常被音高检测算法忽略的更宽范围。

大多数仪器的波形会相当复杂,有很多谐波,所以像计算零点或只取自相关这样的简单方法是行不通的。如果您大致知道要查看的频率范围,则可以进行低通滤波,然后进行零计数。我认为您最好使用更复杂的算法,例如另一个用户提到的谐波产品频谱,或 YAAPT(“另一个音高跟踪算法”)或类似的东西。

最后一个问题:有些乐器,尤其是钢琴,会出现缺少基本音和不和谐的问题。缺失的基本原理可以通过音高跟踪算法来处理……事实上它们必须如此,因为基本原理经常在电子传输中被切断……尽管你可能仍然会遇到一些八度音阶错误。然而,如果有人在钢琴的最低八度音阶中弹奏一个音符,不和谐会给你带来麻烦。正常的音高跟踪算法不是为处理不和谐而设计的,因为人声并没有明显的不和谐。

于 2015-09-14T02:24:35.093 回答
0

你基本上需要一个频谱分析仪。您可能能够对模拟输入的录音进行 FFT,但这在很大程度上取决于录音的分辨率。

于 2009-01-12T14:38:22.543 回答
0

我立刻想到了什么:

  • 过滤掉非常低的频率(鼓,低音线),
  • 滤除高频(谐波)
  • 快速傅里叶变换,
  • 在 FFT 输出中寻找旋律的峰值

我不确定这是否适用于非常复音的声音 - 也许在谷歌上搜索“FFT、分析、旋律等”。将返回有关可能出现的问题的更多信息。

问候

于 2009-01-12T14:42:49.913 回答