《Non-Negative Matrix Factorization for Polyphonic Music Transcription》译文

NMF(非负矩阵分解),由于其分解出的矩阵是非负的,在一些实际问题中具有非常好的解释,因此用途很广。在此,我给大家介绍一下NMF在多声部音乐中的应用。要翻译的论文是利用NMF转录多声部音乐的开山之作,浅显易懂地介绍了如何利用NMF对钢琴曲进行乐谱翻译,值得一看。

摘要

在本文中我们提出一种新方法用来分析由固定谐波格式的音符构成的复调乐曲片段(例如钢琴音符)。由于音符结构固定,我们可以将乐曲进行线性变换,利用非负矩阵分解来估计音符的谐波结构和每个音符出现的位置。这种方法非常简单,而且无需先验信息,只需要利用观测值即可完成估计和识别。

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).

时间: 2024-12-23 19:43:47

《Non-Negative Matrix Factorization for Polyphonic Music Transcription》译文的相关文章

《Tips for Optimizing C/C++ Code》译文

前不久在微博上看到一篇非常好的短文讲怎样对C/C++进行性能优化,尽管其面向的领域是图形学中的光线跟踪,可是还是具有普遍的意义,将其翻译成中文,希望对大家写高质量代码有帮助. 1.     牢记阿姆达尔定律:加速比== 当中表示函数func执行时间占总时间的百分比,表示对该函数加速获得的加速比. 比如,你优化一个函数TriangleIntersect(),该函数的执行时间占总时间的40%,优化之后执行时间缩短一半,则整个代码会获得25%的性能提升. 这个公式告诉我们不经常使用的代码(比如场景载入

(转)Tips for Optimizing C/C++ Code

本来要自己翻译的,随手搜索了一下,发现五天前已经有人翻译了,我就不重复发明轮子了. 转自:http://blog.csdn.net/yutianzuijin/article/details/26289257 前不久在微博上看到一篇很好的短文讲如何对C/C++进行性能优化,虽然其面向的领域是图形学中的光线跟踪,但是还是具有普遍的意义,将其翻译成中文,希望对大家写高质量代码有帮助. 1.     牢记阿姆达尔定律:   其中表示函数func运行时间占总时间的百分比,表示对该函数加速获得的加速比. 例

Socket tips: UDP Echo service - Server code

#include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <netdb.h> #include <time.h> #define BUFFER_LENGTH 1024 void ReverseMessage(char buffer[], ssiz

10 Tips for Optimizing Your Website’s Speed

转自:http://sixrevisions.com/web-development/site-speed-performance/ Web page speed and performance is very important to the user experience. If your site is too slow, you’ll not only be losing visitors, but also potential customers. Search engines lik

优化PHP代码的40条建议(转载)

[size=5][color=Red](译文)优化PHP代码的40条建议[/color][/size] 40 Tips for optimizing your php Code 原文地址:http://reinholdweber.com/?p=3 英文版权归Reinhold Weber所有,中译文作者yangyang(aka davidkoree).双语版可用于非商业传播,但须注明英文版作者.版权信息,以及中译文作者.翻译水平有限,请广大PHPer指正. 1.    If a method ca

转: 2014技术文章合辑

转自: http://www.xiaoyaochong.net/wordpress/index.php/2015/01/12/2014%E6%8A%80%E6%9C%AF%E6%96%87%E7%AB%A0%E9%9B%86%E9%94%A6/ 分布式系统 理论 A Distributed Systems Reading List 卡内基梅隆大学分布式系统阅读清单 分布式基础 网页公开课 The Space Between Theory and Practice in Distributed S

Natively Compiled Code: A Comeback?

RAD Studio and Natively Compiled Code In today's development landscape, natively compiled code is making a significant comeback. RAD Studio has always been focused on it. In today's development landscape, natively compiled code is making a significan

Matlab tips and tricks

matlab tips and tricks and ... page overview: I created this page as a vectorization helper but it grew to become my annotated Matlab reading cache. In order to motivate the DSP people out there, I am showing below how one can apply a window and scal

Socket tips: 同意socket发送UDP Broadcast

假设创建一个UDP Socket: socketHandle = socket(serverAddr->ai_family, serverAddr->ai_socktype, serverAddr->ai_protocol); 如今就用它来发送Broadcast.一定会出错的,Socket API不同意这样做.那么怎样使它支持broadcast呢?须要继续做一些设置: int broadcastPermission = 1; setsockopt(socketHandle, SOL_SO

Java性能提示(全)

http://www.onjava.com/pub/a/onjava/2001/05/30/optimization.htmlComparing the performance of LinkedLists and ArrayLists (and Vectors) (Page last updated May 2001, Added 2001-06-18, Author Jack Shirazi, Publisher OnJava). Tips: ArrayList is faster than