用于确定audio样本的关键字的algorithm

我有兴趣确定audio样本的音乐键。 一个algorithm怎么会(或者可能)如何去逼近音乐audio样本的关键?

Antares Autotune和Melodyne是做这种事情的两个软件。

任何人都可以给一些外行人的解释,说明这将如何工作? 通过分析和弦进行的频谱等来math推断歌曲的关键。

这个话题让我很感兴趣!

编辑 – 从每个对这个问题作出贡献的人都能find丰富的信息

尤其来自the_mandrill和DanielBrückner。

值得注意的是,这是一个非常棘手的问题,如果你没有信号处理的背景知识(或者有兴趣了解它),那么你将面临一个非常令人沮丧的时间。 如果你期望在这个问题上抛出一些FFT,那么你将不会走得太远。 我希望你确实有兴趣,因为这是一个非常吸引人的地方。

最初存在音高识别的问题,对于简单的单声道乐器(例如话音),使用诸如自相关或谐波总和谱(例如参见Paul R的链接)的方法,这是合理容易的。 但是,你会经常发现这样做的结果是错误的:你会经常得到你所期望的一半或两倍的音调。 这被称为音调周期倍增倍频程误差 ,主要是因为FFT或自相关假定数据具有恒定的特性。 如果你有一个人玩的乐器,总会有一些变化。

有些人把关键识别问题作为先做音高识别再从音调序列中找出关键的问题。 如果除了单音序列之外还有其他的东西,这是非常困难的。 如果你确实有一个音调的单音序列,那么它仍然不是一个明确的确定关键的方法:例如,如何处理色彩音符,或者确定它是主要还是次要的。 所以你需要使用类似于Krumhansl的关键发现algorithm的方法 。

所以,考虑到这种方法的复杂性,另一种方法是同时查看所有正在播放的音符。 如果你有和弦或不止一种乐器,那么你将会有很多正弦曲线的乐谱。 每个单独的音符由多个谐波构成一个基本频率,所以A(在440Hz)将由440,880,1320处的正弦曲线组成。此外,如果播放E(参见这个音高图 ),那么它就是659.25 Hz, 几乎是A的1.5倍(实际是1.498)。 这意味着A的每个三次谐波与E的每一个二次谐波都重合。这就是和弦听起来很愉快的原因,因为它们共享谐波。 (顺便说一下,西方和谐作品的全部理由是由于“权力七”的第十二个根数接近1.5的命运怪癖)

如果你超越这个五音阶到大音阶,小音阶和其他和弦,那么你会发现其他比例。 我认为许多关键的发现技术将列举这些比率,然后填充信号中每个谱峰的直方图。 因此,在检测和弦A5的情况下,您可能希望在440,880,659,1320,1760,1977处find峰值。对于B5,它将是494,988,741等。因此,创build频率直方图,并且对于每个信号中的正弦波峰值(例如来自FFT功率谱)会增加直方图的input。 然后,对于每个关键字AG,计算直方图中的分箱,input最多的分箱最有可能是您的密钥。

这只是一个非常简单的方法,但可能足以find一个被打动或持续的和弦的关键。 你还必须把信号分成很小的时间间隔(比如20ms),然后分析每个信号来build立一个更稳健的估计。

编辑:
如果你想实验,我会build议下载一个像Octave或CLAM这样的软件包,这样可以更容易地显示audio数据并运行FFT和其他操作。

其他有用的链接:

  • 我关于音高识别的一些方面的博士论文 – math有点沉重,但是第二章是(我希望)对audioaudiobuild模的不同方法
  • http://en.wikipedia.org/wiki/Auditory_scene_analysis – Bregman的听觉场景分析虽然不是在谈论音乐,但关于我们如何看待复杂场景的一些有趣的发现
  • 丹·埃利斯在这个和类似的领域做了一些很棒的论文
  • 基思·马丁有一些有趣的方法

我曾经在复音CD录音的问题上工作了两年多。 问题非常严重。 与这个问题有关的第一批科学论文可追溯到20世纪40年代,直到今天,一般情况下还没有可靠的解决scheme。

你通常所读的所有基本假设都不完全正确,大部分都是错误的,以致于对于一切而言都是不可用的,只是非常简单的情况。

泛音的频率不是基频的倍数 – 存在非线性效应,因此高频部分偏离预期频率 – 而不仅仅是几赫兹; find你期望的第七个部分并不罕见。

傅里叶变换在audio分析中效果不好 ,因为人们感兴趣的频率是对数间隔的,而傅里叶变换产生线性间隔的频率。 在低频时,需要高频率分辨率来分隔相邻的音高 – 但是这会产生不好的时间分辨率,并且会失去快速连续播放单独音符的能力。

录音确实(可能) 包含重build乐谱所需的全部信息。 我们音乐感知的很大一部分发生在我们的耳朵和大脑中。 这就是为什么一些最成功的系统是拥有大量关于(西方)音乐结构的知识库的专家系统,这些系统只依靠信号处理的一小部分从audiologging中提取信息。

当我回到家时,我会浏览我已阅读的文件,并select20或30个最相关的文件,并将其添加到这里。 我真的build议在你决定实施某些东西之前,先阅读它们,正如大多数常见的假设有些不正确,而你实际上不希望重新发现在实施和testing过程中发现并分析超过50年的所有东西。

这是一个很难的问题,但也很有趣。 我真的很想听听你的尝试,以及它的运作效果。


现在你可以看看恒定Q变换,倒谱和Wigner(-Ville)分布。 还有一些关于如何从短时傅立叶频谱的相位中提取频率的优秀论文 – 这允许使用非常短的窗口尺寸(用于高时间分辨率),因为频率可以以几十倍的精确度来确定比底层傅里叶变换的频率分辨率要高。

所有这些转换都比普通的傅里叶变换更适合audio处理的问题。 为了改善基本转型的结果,我们看一下能源再分配的概念。

据我从这篇文章中可以看出,各种各样的键都有自己的共同频率,所以它可能会分析audio样本来检测最常见的音符和和弦是什么。 毕竟,你可以有多个具有相同的锐利和平面configuration的键,不同之处在于键的开始,因此和弦是这样的键,所以看起来重要的音符和弦出现的频率是唯一真正的办法就是可以把这种事情弄清楚。 我真的不认为你可以得到一个外行人对实际的math公式的解释,而不会留下大量的信息。

请注意,这是来自一个绝对没有这方面经验的人,他的第一次曝光就是这个答案中的文章。

您可以使用傅里叶变换来计算audio采样的频谱。 在此输出中,您可以使用特定音符的频率值将其转换为样本中听到的音符列表。 选取每个样本在一系列样本上听到的最强音符应该会给您一张体面的使用的不同音符的地图,您可以将它们与不同的音阶进行比较,以获得包含该音符组合的可能音阶列表。

为了帮助决定使用哪个特定的音阶,请记下最常听到的音符(不是双关语)。 在西方音乐中,音阶的根源通常是最常见的音符,其次是第五,然后是第四。 您还可以查找诸如普通和弦 , 琶音或进度等模式 。

样本量在这里可能很重要。 理想情况下,每个样本将是一个单一的音符(这样你就不会在一个样本中得到两个和弦)。 如果过滤掉并专注于低频率,则可以使用通常与打击乐器相关的音量尖峰(“喀嚓”),以确定歌曲的速度,并将您的algorithm“locking”到音乐节拍。 从长度为半拍的样本开始,从那里调整。 准备扔掉一些没有大量有用数据的样本(例如在幻灯片中间取样)。

这是一个复杂的话题,但是确定单个键(单个音符)的简单algorithm如下所示:

对包含笔记的样本的一部分进行4096个样本(具体大小取决于您的分辨率要求)进行傅里叶变换。 确定频谱中的功率峰值 – 这是音符的频率。

如果你有一个和弦,不同的“乐器/效果”或者非谐音音乐模式,事情会变得越来越紧密。

首先你需要一个基音检测algorithm (例如自相关 )。

您可以使用您的基音检测algorithm来提取多个短时间窗口的基音。 之后,您将需要查看采样的音调最适合哪个音乐键。

如果您现在需要对一堆歌曲进行分类,那么就会像Mechanical Turk那样将这个问题集中在一起。

分析关键与分析球场不是一回事。 不幸的是,关键的整个概念有些模棱两可,不同的定义通常倾向于分享补品的概念,即中心音调/和弦。 即使存在一个好的自动转录系统,也没有可靠的确定密钥的algorithm。