用于确定音频样本的密钥的算法

Ale*_*lex 53 algorithm audio analysis sampling audio-processing

我有兴趣确定音频样本的音乐键.算法如何(或可能)试图逼近音乐音频样本的关键字?

Antares Autotune和Melodyne是两款完成此类工作的软件.

任何人都可以给出一些关于这将如何工作的外行的解释?通过分析和弦进行的频谱等,以数学方式推断出歌曲的关键.

这个话题让我很感兴趣!

编辑 - 从为这个问题做出贡献的每个人中找到了精彩的资源和丰富的信息.

尤其来自:the_mandrill和DanielBrückner.

the*_*ill 59

值得注意的是,这是一个非常棘手的问题,如果你没有信号处理的背景(或者有兴趣了解它),那么你将面临非常令人沮丧的时间.如果你期望在这个问题上抛出几个FFT,那么你就不会走得太远.我希望你有兴趣,因为它是一个非常迷人的领域.

最初存在音调识别的问题,对于使用诸如自相关或谐波和频谱的方法(例如参见Paul R的链接)的简单单声道乐器(例如语音)而言,这是相当容易的.但是,你经常会发现这会产生错误的结果:你通常会得到你所期望的音高的一半或两倍.这被称为音高周期倍频倍频程误差,并且它主要是因为FFT或自相关假设数据随时间具有恒定特性而发生.如果你有一个人类演奏的乐器,总会有一些变化.

有些人将识别的问题作为首先进行音调识别然后从音高序列中找到键的问题.如果除了单声道音高序列之外还有其他任何东西,这是非常困难的.如果你确实有单声道音高序列,那么它仍然不是确定键的明确方法:例如,如何处理彩色音符,或者确定它是主音还是小音.因此,您需要使用类似于Krumhansl的关键查找算法的方法.

因此,考虑到这种方法的复杂性,另一种方法是同时查看正在播放的所有音符.如果你有和弦,或者有多种乐器,那么你将会有很多正弦波一起播放的光谱汤.每个单独的音符由多个谐波组成一个基频,因此A(440Hz)将由440,880,1320处的正弦曲线组成...此外,如果你演奏E(参见此图表的音高)那么这就是659.25 几乎是赫兹A的一倍半(实际上是1.498).这意味着A的每个三次谐波都与E的每个二次谐波一致.这就是和弦听起来令人愉快的原因,因为它们共享谐波.(顺便说一下,西方和谐发挥作用的全部原因是由于命运的怪癖,2的力量7的第12根接近1.5)

如果你超越这个第5区间的主要,次要和其他和弦,那么你会发现其他比率.我认为许多关键的发现技术将枚举这些比率,然后填充信号中每个谱峰的直方图.因此,在检测到和弦A5的情况下,您可能会在440,880,659,1320,1760,1977找到峰值.对于B5,它将是494,988,741等.因此,创建一个频率直方图,并为每个信号中的正弦峰值(例如来自FFT功率谱)增加直方图条目.然后,对于每个键AG,在您的直方图中计算出箱子,并且具有最多条目的箱子最有可能是您的钥匙.

这只是一个非常简单的方法,但可能足以找到一个弹奏或持续和弦的关键.您还必须将信号切割成小间隔(例如20ms)并分析每个信号以建立更稳健的估计.

编辑:
如果您想进行实验,那么我建议下载像OctaveCLAM这样的软件包,这样可以更容易地显示音频数据并运行FFT和其他操作.

其他有用的链接:

  • 一个好的音调检测算法不应该检测和弦或确定"主要或次要".它应该是检测个别笔记.这就是具有绝对投球能力的耳朵的工作原理(我有能力+音乐教育) - 我没有听到"C大调和弦".我听到C + E + G然后确定它确实是C大调和弦.即使你坐在钢琴键盘上或按下随机键的组合(如C + Cis + D + F + + G + Bes + B),我仍然能够为每个音符命名,尽管它不会是"和弦" .这是因为(我的)耳朵不会对和弦或音调起作用.它在笔记上运作. (3认同)
  • @SigTerm:问题并不像你说的那么明确。当有多种乐器演奏时(特别是管弦乐乐谱),根本不可能听到每个音符,但听到和弦却很容易。从信号处理的角度来看,这个问题是不明确的,因为你有几个乐器演奏相同的音高,或者以(几乎)其整数倍的音高。因此,来自每个仪器的信号不是正交的。我认为 Tangian 的一篇论文表明,复杂的音调与和弦无法区分。(参见上面的链接) (2认同)

Dan*_*ner 18

在大学里,我一直致力于将复音CD录音转录成两年多的分数.这个问题非常困难.与该问题相关的第一篇科学论文可以追溯到20世纪40年代,直到今天,对于一般情况没有可靠的解决方案.

你通常阅读的所有基本假设都不完全正确,而且大多数都是错误的,除了非常简单的场景之外,它们都无法用于所有事情.

泛音的频率不是基频的倍数 - 存在非线性效应,因此高部分偏离预期频率 - 而不仅仅是几赫兹; 找到你预期的第6个部分并不罕见.

傅里叶变换对音频分析不起作用,因为人们感兴趣的频率是对数间隔的,而傅里叶变换产生线性间隔的频率.在低频时,你需要高频率分辨率来分离相邻的音高 - 但这会产生糟糕的时间分辨率,并且你会失去快速连续播放单独音符的能力.

录音(可能)包含重建乐谱所需的所有信息.我们音乐感知的很大一部分发生在我们的耳朵和大脑中.这就是为什么一些最成功的系统是具有大型知识库的专家系统,这些知识库关于(西方)音乐的结构,其仅依赖于信号处理的一小部分来从音频记录中提取信息.

当我回到家时,我将浏览我读过的论文并挑选20或30个最相关的论文并在此处添加.我真的建议你在决定实施之前先阅读它们 - 如前所述,大多数常见的假设都有些不正确,你真的不想在实施和测试时重新发现所有发现和分析超过50年的东西.

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


现在您可以查看Constant Q变换,Cepstrum和Wigner(-Ville)分布.还有一些关于如何从短时傅立叶光谱相位的频移中提取频率的好文章 - 这允许使用非常短的窗口尺寸(用于高时间分辨率),因为频率可以精确地确定几倍大1000倍比基础傅里叶变换的频率分辨率.

所有这些变换都比普通的傅里叶变换更适合音频处理的问题.为了改善基本变换的结果,请看一下能量重新分配的概念.


bta*_*bta 6

您可以使用傅立叶变换计算音频样本的频谱.从此输出中,您可以使用特定音符频率值将其转换为样本中听到的音符列表.选择在一系列样本中每个样本听到的最强音符应该为您提供一个体面的不同音符的地图,您可以将其与不同的音阶进行比较,以获得包含该音符组合的可能音阶列表.

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

样本量可能在这里很重要.理想情况下,每个样本都是一个音符(这样你就不会在一个样本中得到两个和弦).如果您过滤并专注于低频,您可以使用通常与打击乐器相关的音量峰值("点击"),以确定歌曲的节奏并将您的算法"锁定"到音乐的节拍.从长度为半拍的样本开始,然后从那里进行调整.准备丢弃一些没有大量有用数据的样本(例如在幻灯片中间拍摄的样本).


JAB*_*JAB 5

据我在本文中可以看出,各种键都有自己的共同频率,因此它可能会分析音频样本以检测最常见的音符和和弦.毕竟,你可以拥有多个具有相同锐利和平面配置的键,区别在于键开始的音符,因此是这些键的和弦,所以看起来重要的音符和和弦出现的频率是多少.唯一可以解决这种问题的真正方法.我并不认为你可以在不遗漏大量信息的情况下得到外行人对实际数学公式的解释.

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