《Non-Negative Matrix Factorization for Polyphonic Music Transcription》译文
NMF(非负矩阵分解),由于其分解出的矩阵是非负的,在一些实际问题中具有非常好的解释,因此用途很广。在此,我给大家介绍一下NMF在多声部音乐中的应用。要翻译的论文是利用NMF转录多声部音乐的开山之作,浅显易懂地介绍了如何利用NMF对钢琴曲进行乐谱翻译,值得一看。论文地址:Non-Negative
Matrix Factorization for Polyphonic Music Transcription。
摘要
在本文中我们提出一种新方法用来分析由固定谐波格式的音符构成的复调乐曲片段(例如钢琴音符)。由于音符结构固定,我们可以将乐曲进行线性变换,利用非负矩阵分解来估计音符的谐波结构和每个音符出现的位置。这种方法非常简单,而且无需先验信息,只需要利用观测值即可完成估计和识别。
1. 引言
多声部音乐转录在很长一段时间内都难以解决。虽然许多基于先验知识的系统获得了很好的识别效果,但是非常非常复杂。在本文中,我们提出一种轻量级的方法,该方法和场景分析有些类似,也是数据驱动的,但是没有利用任何关于音乐结构的先验知识。我们方法的基本出发点是对冗余数据进行压缩[1],冗余压缩的思想在过去的几年发展迅速,在不少应用中取得了很好的效果。最近冗余压缩被用来解决多声部音乐转录问题[2][3],并取得了非常鼓舞人心的结果。在本文中,我们将从不同的角度出发解决同样的问题。事实上,仅仅通过对乐曲的频谱进行非负矩阵分解即可完成多声部音乐的转录。
2. 非负分解
2.1 定义和代价函数
受到Paatero关于正矩阵分解[5]的启发, Lee和Seung首先提出了非负矩阵分解(NMF)[1]。给定一个大小为M*N的非负矩阵X,NMF的目标是寻找两个非负矩阵W(M*R)和H(R*N),然后用W和H的乘积来近似表示X(其中R的维度小于M和N),并使误差最小。定义代价函数如下:
其中,表示Frobenius范数。此外,我们也可以定义另外的代价函数:
其中,表示Hadamard积(矩阵元素的点乘),同理除法也是矩阵元素的点除。这两个代价函数都满足,当时代价等于0。公式2中的函数有些类似Kullback-Liebler收敛。计算W和H的公式在附录A。
NMF也可以被解释为降置分解,使得,从而会有,其中是大小为R*M的非负矩阵,+表示Moore-Penros矩阵的逆。后面的公式可以让我们将NMF和PCA、ICA等联系起来。事实上,当代价函数为公式1时,NMF等价于PCA的一个旋转(ratation)(PCA采用同样的代价函数,但约束是正交约束)。基于这样一个事实,我们猜想NMF等价于满足Plumbley条件[6]的非负ICA分解。
用更通俗的术语来解释,NMF其实是用矩阵H的行来刻画矩阵X的行,矩阵W的列来刻画矩阵X的列。参数R则用来衡量刻画的能力。如果R=M,则可以精确分解,此时W和H没有提供更多有用信息。当我们降低R时,则W和H的元素开始描述X的主元素。如果我们选择合理的R,我们就可以对X的主元进行提取。下一节会介绍一个简单的例子。
2.2 幅度谱的NMF
给定一段音频信号:
其中,g(*)是一个周期为的门函数,是任意标量,同时远小于。然后计算这段音频的L长度幅度谱x(t)
=||DFT( [s(t) … s(t + L)])||。可以将x(t)的每一列堆在一起构成一个非负矩阵X(M*N),其中N表示总共有多少帧信号,M=L/2+1是每一帧的变换结果,表示频率。图1是一个幅度谱的矩阵X。
下面对X进行NMF分解。在做之前,我们先介绍X的几个特点。除了几个明显的线能量很大之外,其余部分能量极低,从而可以从中看出某种固定的模式。换种解释,上面的幅度谱是一个冗余度非常高的幅度谱(一个压缩工程师最期望见到的情况)。对该矩阵进行NMF分解会让我们见识到冗余是如何利用紧凑的矩阵消除的。我们采用的代价函数为公式1,R=2,分解的结果为图2。
检查分解的结果会让我们获得一些重要信息。H矩阵的两行包含两个时间序列刻画了X的横轴(每一行表示每一个频率出现的强弱信息,与X的亮线相对应)。W矩阵的每一列刻画了X的纵轴(每一列表示一个频率值,与X中的两个频率相对应)。组合H的第n行和W的第n行(图2中W是横着画的)就可以恢复出X矩阵。
在后面的章节中,我们将X变成包含音乐信号的幅度谱来进一步验证上面的想法。我们可以看到,当X是实际音乐的幅度谱时,分解出的W和H矩阵会包含音乐中出现音符的频谱以及该音符的时间信息。上面的例子也告诉我们NMF也可以处理音符重叠的情形(图1中的上下两条频谱有重叠),下面介绍实际音乐的例子。
3. 实际音乐幅度谱的分解结果
在本节,我们将展示对钢琴曲进行NMF分解的结果以及可能遇到的问题。我们首先研究不重叠的音符,然后研究重叠音符,最后对一整段多声部钢琴曲进行分解。所有的钢琴曲都来自于Keith Jarrett演奏的G小调巴赫赋格曲XVI[7],采样率44100Hz,单声道。
3.1 不重叠音符
第一个例子先看一下只有几个不重叠音符的赋格曲片段。下面的片段音符之间没有明显的重叠(延音是较弱的重叠)。
这段乐谱包含五个事件四个不同的音符。首先获得信号的幅度谱,然后选择公式1作为代价函数同时R=4进行NMF分解。DFT的长度是4096,加汉宁窗。分解结果如图3。
可以明显地看出,H矩阵的每一行表示四个音符的时间信息(哪一时刻出现,强弱变化),W矩阵的每一列是它们对应的频谱。W每一列中最低有效频率分别为193.7Hz,301.4Hz,204.5Hz和322.9Hz,分别对应音符和。与实际音符的基频相比出现偏差的原因是由于DFT频率分辨率不够所致。一般情况下,单个峰值不能识别具体的音符,但是综合考虑基频和谐波就可以确定W矩阵每一行代表哪一个音符。
做完上面的实验,很容易就会想到如果R不等于实际的音符个数会怎样。当R小于实际音符的个数时,我们没有足够的能力去区分这些音符,只能对上面的频谱进行部分分析。另一方面,我们也可以选择一个很大的R,此时根据算法选择的不同也会有不同的结果。采用公式1的NMF倾向于将主导音符的能量分散到W和H的不同行列中(使H更平均)。为了避免这种效应,我们可以将代价函数修改为:
该公式不仅可以确保我们分解出的结果可以近似表示原信号,同时也避免生成能量很低的H矩阵。公式4类似于Hoyer[8]介绍的代价函数。参数用来调节好的信号重构和低能量之间的平衡。公式4强迫NMF避免将音符的能量分散到H的多个行中,从而提高了单行的能量值,其他能量较低的行也就变成了噪音。但是利用公式4需要确定一个好的值。
如果我们不确定R的值,最便捷的方法就是选择公式2作为代价函数。这时,多出来的音符计算出的H矩阵就是一系列小的波峰,对应的W矩阵列就是一个能量很低的频谱(可以认为是静音或者环境噪音)。对前述四个音符的乐谱利用R=5进行NMF分解得到的结果如图4。
总体而言,辨识非音符的成分非常容易,在我们的分析中不是一个难题。
3.2 重叠音符
下面开始分析赋格曲的第二部分,该部分包含重叠音符:
上述乐谱有十个事件七个不同的音符。倒数第二个时刻有两个重叠音符(和)。利用公式2对上述乐谱进行R=7的NMF分解,结果如图5。
令人失望的是,虽然我们成功地进行了分解,但是获得了一个非音符的成分,同时两个重叠的音符也被当做一个成分。很容易解释,正如前面所说,NMF只是根据当前信号进行分解而不依赖于先验知识,所以每一个独立的事件都被当做一个新的成分。所以我们特别强调一点,该方法的目的不是为了提取音符,而是提取独立的事件。由于我们没有对提取音符提供足够的信息,算法只能将独立的事件看做音符。
可以通过提供更多的数据来使所有的音符都被识别成独立的事件。将前面两部分的钢琴曲合在一起我们就多了一个独立的音符,从而足够我们分辨两个重叠的音符,如图6所示。可以看出,通过增加一个独立的音符,我们可以完美地进行转录。
当钢琴曲变长时,上述过程也可以很好地扩展。图7展示了R=27时对赋格曲前7段进行分解的结果。分解收敛之后,我们删除了两个不包含音符的成分。将结果与赋格曲的乐谱进行对比,我们发现识别结果已经很好地展示了整个乐谱。出现的几个错误一是将和当成了一个成分,二是没有跟踪(可能的原因是它只出现了一次)。
4. 结论
我们在本文中提出一种基于NMF分解的多声部音频转录方法。新方法无需非常强大的计算能力和复杂的算法设计即可获得非常好的结果。但是,该方法的一个缺点是音乐片段中的音符必须具有固定的谐波格式。今后的工作将尝试利用其它表达能力更强的分解来解决该问题。
5. 引用
[1] Barlow, H.B. “Sensory mechanisms, thereduction of redundancy, and intelligence”. In Symposium on the Mechanizationof Thought Processes. National Physical Laboratory Symposium No. 10. (1959)
[2] Smaragdis, P. “Redundancy reduction forcomputational audition, a unifying approach”. Ph.D. dissertation, MAS department,Massachusetts Institute of Technology,(2001).
[3] Plumbley, M.D., S.A. Abdallah, J.P.Bello, M.E. Davies, G.Monti and M.B. Sandler. “Automatic music transcription andaudio source separation”. In Cybernetics and Systems, 33(6), pp 603-627,(2002).
[4] Lee, D.D. and H.S. Seung, “Learning theparts of objects by non-negative matrix factorization”. In Nature 401,pp788-791,(1999).
[5] Paatero, P. “Least squares formulationof robust nonnegative factor analysis”. In Chemometrics and IntelligentLaboratory Systems 37, pp23-35, (1997).
[ 6 ]Plumbley, M.D. “Conditions fornon-negative independent component analysis”. In IEEE Signal ProcessingLetters, 9(6), pp177-180, (2002).
[7] Jarrett, K. “J.S. Bach, DasWohltemperierte Klavier, Buch I”, ECM Records, CD 2, Track 8 (1988).
[8] Hoyer, P. “Non-negative sparse coding”,In Neural Networks for Signal Processing XII, Martigny, Switzerland, (2002).
《Non-Negative Matrix Factorization for Polyphonic Music Transcription》译文的更多相关文章
- 译文《最常见的10种Java异常问题》
封面:洛小汐 译者:潘潘 知彼知己,方能百战不殆. 前言 本文总结了有关Java异常的十大常见问题. 目录 检查型异常(checked) vs. 非检查型异常(Unchecked) 异常管理的最佳实践 ...
- 一文学会最常见的10种NLP处理技术
一文学会最常见的10种NLP处理技术(附资源&代码) 技术小能手 2017-11-21 11:08:29 浏览2562 评论0 算法 HTTPS 序列 自然语言处理 神经网络 摘要: 自然 ...
- 移动端App广告常见的10种形式
什么是App广告? App广告,或称In-App广告,是指智能手机和平板电脑这类移动设备中第三方应用程序内置广告,属于移动广告的子类别. App广告兴起得益于其载体—App的风行.平板电脑和大屏触 ...
- 常见的几种java排序算法
一.分类: 1)插入排序(直接插入排序.希尔排序) 2)交换排序(冒泡排序.快速排序) 3)选择排序(直接选择排序.堆排序) 4)归并排序 5)分配排序(基数排序) 所需辅助空间最多:归并排序 所需辅 ...
- java 常见的几种运行时异常RuntimeException
常见的几种如下: NullPointerException - 空指针引用异常ClassCastException - 类型强制转换异常.IllegalArgumentException - 传递 ...
- 【刷题】java 常见的几种运行时异常RuntimeException
常见的几种罗列如下: -NullPointerException - 空指针引用异常 ClassCastException - 类型强制转换异常. IllegalArgumentException - ...
- 10个关于Java异常的常见问题
这篇文章总结了十个经常被问到的JAVA异常问题: 1.检查型异常VS非检查型异常 简单的说,检查型异常是指需要在方法中自己捕获异常处理或者声明抛出异常由调用者去捕获处理: 非检查型异常指那些不能解决的 ...
- 常见 Java 异常解释(恶搞版)
常见 Java 异常解释:(译者注:非技术角度分析.阅读有风险,理解需谨慎o(╯□╰)o) java.lang ArithmeticException 你正在试图使用电脑解决一个自己解决不了的数学问题 ...
- 10 个深恶痛绝的 Java 异常。。
异常是 Java 程序中经常遇到的问题,我想每一个 Java 程序员都讨厌异常,一 个异常就是一个 BUG,就要花很多时间来定位异常问题. 什么是异常及异常的分类请看这篇文章:一张图搞清楚 Java ...
- 十个常见的Java异常出现原因
异常是 Java 程序中经常遇到的问题,我想每一个 Java 程序员都讨厌异常,一 个异常就是一个 BUG,就要花很多时间来定位异常问题. 1.NullPointerException 空指针异常,操 ...
随机推荐
- Python无法导入Cython的.pyx文件
在import 相应包之前, 添加: import pyximport pyximport.install() 即可.
- EF CodeFirst方式 Fluent Api配置
一.One-to-One Relationship[一对一关系] 两个表之间,只能由一个记录在另外一个表中.每一个主键的值,只能关联到另外一张表的一条或者零条记录.请记住,这个一对一的关系不是非常的普 ...
- MySQL操作与修改表
插入数据(insert) insert语句的3个主要组成部分: 所要插入数据的表的名称: 表终需要使用的列的名称: 需要插入到列的值. 数字型主键生成机制 数字型主键生成机制,除了随机选择数字外,还可 ...
- node.js使用node-xlsx读写数据
下面是包含了读写的样例: var xlsx = require('node-xlsx'); var fs = require('fs'); // 读取文件内容 var data = xlsx.pars ...
- SpringBoot: 配置加载顺序
在应用程序中各种配置是不可避免的,Spring中对配置的抽象(Environment)可以说是达到了极致,其中有一项尤为突出:PropertySource(配置来源),配置来源通常包括命令行参数,系统 ...
- OS模块文件操作一
1 文件操作 1.1 OS模块 l import os #引入os模块 l import os.path #引入os下的path子模块 l os ...
- CSS滚动条样式定制
效果图如下 <!DOCTYPE html> <!-- saved from url=(0061)http://www.xuanfengge.com/demo/201311/scrol ...
- [IOI2007]训练路径
Description 马克(Mirko)和斯拉夫克(Slavko)正在为克罗地亚举办的每年一次的双人骑车马拉松赛而紧张训练.他们需要选择一条训练路径. 他们国家有N个城市和M条道路.每条道路连接两个 ...
- 【BZOJ1060】【ZJOI2007】时态同步
Description 小Q在电子工艺实习课上学习焊接电路板.一块电路板由若干个元件组成,我们不妨称之为节点,并将其用数字1,2,3-.进行标号.电路板的各个节点由若干不相交的导线相连接,且对于电路板 ...
- 51 nod 1681 公共祖先 (主席树+dfs序)
1681 公共祖先 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 有一个庞大的家族,共n人.已知这n个人的祖辈关系正好形成树形结构(即父亲向儿子连边). 在另 ...