首页> 中国专利> 一种基于GPU的多声部音乐旋律提取方法

一种基于GPU的多声部音乐旋律提取方法

摘要

本发明提出一种利用GPU对多声部音乐进行旋律提取的并行化方法,该方法有三大步骤:步骤一,在GPU上对音乐数据进行频谱变换和音高显著值计算;步骤二,在CPU上利用音高显著值构造音高轨迹,然后求取音高轨迹的相关特征,并利用这些特征进行语音检测;步骤三,对剩余的语音轨迹进行倍频删除和异常值删除,最终获得多声部音乐的旋律轨迹。本发明立足于多声部音乐,但是可以更好地应用在不含背景音的音乐和语音中。利用GPU进行旋律提取,将提取时间由秒级降到毫秒级,从而达到实时应用的标准。此外,它显著降低了提取所需要的硬件资源,同时提高了算法的开发进度,使该方法在商业应用和科学研究领域均具有广泛地实用价值和应用前景。

著录项

  • 公开/公告号CN103247286A

    专利类型发明专利

  • 公开/公告日2013-08-14

    原文格式PDF

  • 申请/专利权人 北京航空航天大学;

    申请/专利号CN201310106172.2

  • 发明设计人 肖利民;姚光超;郑尧;阮利;

    申请日2013-03-28

  • 分类号G10H1/00(20060101);

  • 代理机构11324 北京金恒联合知识产权代理事务所;

  • 代理人李强

  • 地址 100191 北京市海淀区学院路37号

  • 入库时间 2024-02-19 20:03:36

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2015-09-23

    授权

    授权

  • 2013-09-11

    实质审查的生效 IPC(主分类):G10H1/00 申请日:20130328

    实质审查的生效

  • 2013-08-14

    公开

    公开

说明书

技术领域

本发明提出了一种音乐旋律提取的加速方法,具体涉及一种利用GPU对多声部音乐 进行旋律提取的并行化方法。属于计算机科学的并行化应用领域。

背景技术

给定一首多声部音乐,旋律提取的任务是自动从中提取出音乐的旋律轨迹。现在最 常用的旋律轨迹是音乐的基频(F0)序列。当前大部分算法都是基于显著值的,该类算 法通过估计音高的显著值来构造旋律轨迹,算法的通用结构是:首先得到信号的频谱表 示,然后利用频谱表示计算音高显著值的时频表示。显著值的波峰被看作旋律可能的F0 候选值。最后,通过不同的波峰选择方法或者跟踪方法选择最终的F0。当前准确度最高 的算法在求得了音高的显著值之后,会首先构造音高轨迹,然后通过音高轨迹的筛选来 选择正确的轨迹。

多声部音频的特征提取算法可以应用在哼唱搜索(Query by Humming),歌手识别 等领域;同时它还可以作为推测音乐语义的中间步骤,具有非常大的应用价值。由于背 景音的影响,旋律提取算法的复杂度较高,运行较慢,不能实时地应用,这限制了其使 用范围。缓慢的运行时间和庞大的测试库也导致算法测试和改进的困难,准确率与MIDI 音乐的旋律提取相比低了很多。

当前解决的方法主要是依靠分布式计算来解决运行缓慢的问题,但是速度提升有限 同时集群的搭建和维护都需要很高的费用。此外,也有人用FPGA来进行算法加速,但是 此种方式编程极为复杂,开发周期过长,限制了其发展。

由于GPU出色的浮点运算能力、超大的内存带宽和相对较低的价格,以及相应编程语 言的改进(CUDA),使GPU在通用计算领域发挥着越来越大的作用。通过算法的通用结 构可以看出,算法的某些步骤具有很好的并行性,这启发我们可以通过对算法进行GPU 并行化使其达到实时性要求。

发明内容

1、目的:

本发明的目的是利用GPU提供一种多声部音乐的旋律提取并行化方法。该方法首先 在GPU上对多声部音乐进行频谱变换,并求取频谱峰值。然后利用频谱峰值计算音高的 显著值,然后求取频率的显著值峰值,并将结果拷贝到CPU。最后在CPU空间通过显著 值峰值构造音高轨迹,计算轨迹特征,对音高轨迹进行过滤获得最终的旋律轨迹。

2、技术方案:

本发明的技术方案是这样的:

如图1所示,本发明共包括三个步骤,其中第一个步骤在GPU上运行,第二个步骤 在CPU上运行,第三个步骤的一个算法又移植到GPU上运行。具体的步骤如下:

(1)步骤S1:对音乐文件进行频谱变换,并求取音高显著值,具体的步骤又细分如 下:

a)将音频文件由CPU空间拷贝到GPU空间,然后进行频谱变换;

b)对频谱变换的结果进行过滤,只保留较大的峰值;

c)利用上一步的结果求取音高的显著值,然后再求取显著值的峰值;

d)将音高的显著值峰值拷贝到CPU空间。

(2)步骤S2:利用显著值的峰值构造音高轨迹,然后求取每个轨迹的相关特征,并 利用这些特征对轨迹进行语音检测;

(3)步骤S3:利用“旋律音高均值”对语音轨迹进行倍频删除和异常值删除,获得最终 的旋律轨迹。

其中,步骤S1,每一个小的步骤都是分帧处理的,每一帧都获得一个结果,最后将 每一帧的结果串成轨迹。在GPU上的并行化中,不同的block处理不同的帧,block内 的线程再并行处理一帧内的数据。

其中,步骤S1的b,是利用最大峰值对频谱峰值进行过滤,低于最大峰值THRESHOLD 的峰值将会被过滤掉。

其中,步骤S1的c,显著值的计算用音分单位(cent),这样可以提高计算精度,直 到算法最后都将采用音分单位。最后的结果根据实际需要可以转换为Hz单位。频率和 音分的转换公式如下:

我们总共计算480个不同的显著值,显著值的计算公式如下:

S(b)=Σh=1NhΣi=1Ig(b,h,fi)·ai

其中,Nh表示需要计算的谐波个数,在实际中取值为8。I表示FFT滤波之后剩余的 频谱峰值个数。fi和ai表示候选基频的频率和振幅。g(b,h,fi)表示频率为fi、振幅为ai的 候选基频对“箱子”b的第h个谐波的权重。权重函数为:

g(b,h,fi)=cos2(δ*π2)*αh-1if|δ|1,0if|δ|>1,

其中,表示谐波与“箱子”b的中心频率的半音程距离,α是谐波权 重参数。非零的参数δ意味着每个FFT过滤之后的峰值不仅对一个箱子的显著值有贡献, 对它周围的箱子也有贡献,这样可以量化过程中产生的误差。

其中,步骤S2,每个轨迹的特征包括:音高均值音高标准差轨迹平 均显著值轨迹总显著值轨迹显著值标准差和长度(Cl)。然后利 用乐器和语音在这些特征上分布的不同进行轨迹过滤。

其中,步骤S3,“旋律音高均值”的计算是利用每个时刻剩余的多个音高候选值进行 加权平均,权值就是每个音高所在轨迹的显著值总和,这样可以使最终的准确率更高。

3、优点及功效:

本发明所提出的基于GPU的多声部音乐旋律提取算法,它与现有技术相比,其主要 的优点是:(1)编程简单,只需要利用c语言的扩展语言CUDA就可以对GPU编程,入 门和开发进度都比FPGA快。(2)加速比高,将串行情况下运行时间从秒级降到不足100ms, 加速比接近100倍,使旋律提取算法可以实时应用。(3)性价比高,好GPU的价格也不 过几千块钱,但是却可以取得非常高的加速比,这是集群系统所不能比拟的。(4)在 GPU上采用单精度浮点数运算,但是准确率与串行程序相比没有下降。(5)可以应用在 大规模的库上进行快速测试,对参数进行调优。

附图说明

图1多声部音乐旋律提取的整体流程图

图2音乐数据在GPU上运行之前的调整图

图3“空间换时间”策略下的寻找峰值图

具体实施方式

为使本发明的目的、技术方案和优点表达得更加清楚明白,下面结合附图及具体实 施例对本发明再作进一步详细的说明。

本发明的主要思想是利用GPU对多声部音乐的旋律提取进行加速,使其可以推广到 很多实时应用中去。该算法不止适用于多声部音乐,对不含背景音的音乐或语音提取准 确度更高。

下面以一实例进行说明,音乐片段采样率44.1kHz,长度21s,格式为wav。

首先在CPU空间中读取音乐文件,并分析获得文件的采样率和数据长度,然后传递 到GPU空间开始进行旋律提取。在进行频谱变换之前需要先对数据进行调整使其适合在 GPU上处理。数据调整的方式如图2,之前的音乐数据分帧处理会有重叠部分,这不利于 GPU操作,将数据依赖性消除会显著提高加速比。为了提高频谱变换的分辨率,还需要 对音乐数据进行补零操作。在我们的例子中,按照4倍的方式补零分辨率可以到达5Hz。

数据调整完之后,按照图1所示,进行旋律提取,包括以下步骤:

(1)步骤S1:对音乐文件进行频谱变换,并求取音高显著值:

a)频谱变换利用NVIDIA提供的CUFFT库完成,变换的结果为复数,需要转换 成模。GPU的调度策略是:一个BLOCK中的所有线程去处理一帧数据,不同 的BLOCK处理不同的音频帧,帧内则是每一个线程访问独立的数据;

b)在峰值过滤之前首先要求得所有的峰值,我们采用的方法是“空间换时间” 方法,如图3所示,分配与原数组等长的新数组,然后将每个线程找到的峰值 保存在该新数组与原数组下标对应的位置。然后利用规约方法获得每一帧中峰值 的最大值,最后利用原子操作和最大峰值对每一帧的峰值进行过滤。在利用原 子操作保存峰值的时候,可能会存在多个线程同时方法计数变量的问题,这 会导致直接利用计数变量会访问冲突,我们利用CUDA提供的库函数返回值 来访问正确的计数变量;

c)利用上一步的结果求取音高的显著值,在求取每一个频率的显著值时,频率 之间没有依赖性,这非常适合与在GPU上并行实现。我们的方法还是让不同 的block处理不同的帧,block内的每一个线程去求一个频率的显著值。由 于上一步求得的频谱峰值会多次使用,所以为了加快访问速度,我们将频率 峰值及其下标首先放在共享内存中。这样后面求取显著值就可以直接读取共 享内存中的数据,由于每个线程访问的共享数据相同,所以不会存在bank  conflict,从而显著提升了访问速度。然后利用和上一步相同的方式对显著 值进行过滤;

d)将音高的显著值峰值拷贝到CPU空间。

(2)步骤S2:利用显著值的峰值构造音高轨迹,轨迹的构造就是将在时间上连续, 然后频率相差很小的音高组合在一起,构成一个有起始和结束时间的音高轨迹。 轨迹的构造在CPU上完成,采用的数据结构是链表。然后求取每个轨迹的相关特 征,并利用这些特征对轨迹进行语音检测;

语音检测分为三个步骤:首先利用轨迹的音高标准差和长度(Cl)进行轨迹 过滤,过滤掉同时Cl>10的轨迹;然后利用所有轨迹的显著值均值和标准差 进行过滤,过滤公式为:ν被设为0.3;最后利用轨迹的音高均值差进行过滤,过滤公式为:ν被设为1.2。语音检测之后剩余的轨迹 都可以认为是语音轨迹。

(3)步骤S3:利用“旋律音高均值”对语音轨迹进行倍频删除和异常值删除,获得最终 的旋律轨迹。

“旋律音高均值”的计算依赖于平滑滤波器的使用,该滤波器运行时间较长,同时具有 良好的并行性,所以我们将其在GPU上做运算。平滑滤波器的关键就是采用共享内存保存当 前计算的临时和,然后采用规约方法将共享内存相加。由于BLOCK内每个线程访问的数据 不一致,同时全局内存的数据长度不确定,所以不适合将全局内存中的数据放到共享内存中。

最后所应说明的是:以上实施例仅用以说明而非限制本发明的技术方案,尽管参照 上述实施例对本发明进行了详细说明,本领域的普通技术人员应当理解:依然可以对本 发明进行修改或者等同替换,而不脱离本发明的精神和范围的任何修改或局部替换,其 均应涵盖在本发明的权利要求范围当中。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号