计算音乐速度估计的制作方法

文档序号:2830542阅读:738来源:国知局
专利名称:计算音乐速度估计的制作方法
技术领域
本发明涉及信号处理和信号表征,尤其涉及用于估计与音乐作品的 一小部分相对应的音频信号的音乐速度的方法和系统。
背景技术
随着个人计算机和计算机系统的处理能力、数据容量和功能性的增 强,与其他个人计算机互连的个人计算机以及高端计算机系统已变成用 于各种不同类型的信息和包括音乐的娱乐节目传送的主要媒介。个人计 算机的使用者能从因特网下载大量不同的、数字编码的音乐片段,将数 字编码的音乐片段存储在个人计算机内的大容量存储设备上或者与个 人计算机关联的大容量存储设备上,并且能通过音频播放软件、固件和 硬件部件来取回和播放音乐片段。个人计算机使用者能通过因特网从数 以千计的不同无线电台和其他音频广插-机构接收实况的,流式音频广 播。
在用户开始积累了大量的音乐片段,并且开始体验到需要管理和搜 索他们积累的音乐片段时,软件和计算机厂家开始提供各种软件工具来 使得使用者能够组织、管理和浏览存储的音乐片段。对于音乐片段存储 和浏览操作来说,或者通过依靠使用者或者音乐片段提供商与数字编码 的音乐片段关联的、包括标题和缩略说明的文本编码的属性,或者通常 更期望地,通过对数字编码的音乐片段进行分析从而确定音乐片段的各 种特征,来表征音乐片段是经常需要的。作为一个示例,使用者可尝试 通过大量音乐参数值来表征音乐片段从而将类似的音乐一起放置在特 定目录或子目录树内,并且可将音乐参数值输入音乐片段浏览器从而减 小并集中对特定音乐片段的搜索。更复杂的音乐片段浏览软件可采用音 乐片段表征技术来提供本地存储和远程存储的音乐片段的更复杂的自 动搜索和浏览。
演奏或广播音乐片段的音乐速度是一种通常遇到的音乐参数。收听 者通常能容易地而且通过直觉来为音乐片段分配音乐速度,或者主要察
6觉的速度,尽管音乐速度的分配一般来说不是明确的,并且给定的收听 者可给在不同音乐上下文中存在的相同音乐片段分配不同的音乐速度。 然而,由大量收听者分配的给定音乐片段的按照每分钟的节拍的主要速 度或音乐速度一般落入一个或几个离散的窄频带中。而且,察觉的音乐 速度一般对应于代表了音乐片段的音频信号的信号特征。因为音乐速度 是通常被认识的并且是基本的音乐参数,所以计算机使用者、软件厂家、 音乐提供商和音乐广播公司都已经认识到对于确定给定的音乐片段的 音乐速度值的有效计算方法的需要,该音乐速度值可用作用于对数字编 码的音乐片段进行组织、存储、取回以及搜索的参数。

发明内容
本发明的各种方法和系统实施例涉及对数字编码的音乐片段的音 乐速度进行计算估计。在如下所述的本发明的某些实施例中,对音乐片 段的 一 小部分进行分析来确定音乐片段的音乐速度。对数字编码的音乐 片段按照计算方法进行变换来得到对应于该采样的功率语,依次变换来 得到二维起奏强度矩阵。随后针对一组对应的频带,将二维起奏强度矩 阵变换成 一组起奏强度/时间函数。随后分析起奏强度/时间函数以得到 最可靠的起奏间隔,该起奏间隔被变换成通过分析所返回的被估计的音 乐速度。


图1A-图1G示出了产生音频波形的多个分量音频信号或分量波形 的组合。
图2示出了将复杂波形分解成分量波形频率的数学方法。 图3示出了加入幅度相对于频率和时间的三维标绘图的第 一频域标 绘图。
图4示出了三维频率、时间和幅度标绘图,其中两列绘出的数据符
合时间z"l和r2处的时间轴。
图5示出了由对于图2-图4所述方法产生的频谱图。
图6A-图6C示出了本发明的方法实施例中使用的频谱图的两种变
换中的第一种。
图7A-图7B示出了针对一组频带的起奏强度/时间函数的计算。
7图8是示出了本发明的 一 音乐速度估计方法实施例的流程控制图。
图9A-图9D示出了起奏间隔和相位的概念。
图10示出了由图8中的步骤810所表示的搜索的状态空间。
图11示出了根据本发明的实施例,在D(t,b)值的邻域内的波顶
D(t, b)值的选择。
图12示出了在通过连续考虑沿时间轴的起奏间隔的代表性D(t,b)
值来计算可靠度的过程的一个步骤。
图13示出了根据起奏间隔中的可能的、更高阶频率或音乐速度的
识别减'J、或降低起奏间隔的可靠度。
具体实施例方式
本发明的各种方法和系统实施例涉及针对数字编码的音乐片段的 估计音乐速度的计算确定。如下详细地所述,对音乐片段的小部分进行 变换来产生多个起奏强度/时间函数,被分析以确定估计的音乐速度。 在以下讨论中,首先概括地讨论了音频信号,随后讨论本发明的方法实 施例中所使用的,用于产生一组频带的起奏强度/时间函数的各种变换。 随后利用图形说明和流程控制图来描述起奏强度/时间函数的分析。
图1A-图1G示出了产生音频波形的多个分量音频信号或分量波形 的组合。尽管图U-图1G示出了的波形分量是一般波形分量的特殊情 况,但是示例示出 一 般复杂音频波形可以由多个简单的单 一 频率波形分 量组成。图1A示出了六个简单分量波形的第一个的一部分。音频信号 基本上是通过空间传播的振荡气压扰动。当在空间中的特定点处随时间 观察时,气压关于一中值气压规则地振荡。图1A中的波形102是正弦 波形,沿竖轴画出气压并沿横轴画出时间,以图形方式显示了在空间特 定点处作为时间的函数的气压。声波强度与声波的气压幅度的平方成比 例。通过按时测量沿从特定距离处的声源发出的直线的空间中各个点处 的气压也得到类似波形。返回到空间特定点处一段时间内的气压的波形 表现形式,在波形中任意两个波顶之间的距离,诸如波顶106和108之 间的距离104,是在气压扰动中连续的振荡之间的时间。该时间的倒数 是波形的频率。认为图1A所示的分量波形具有基频尸,图1B-图1F所 示的波形表示基频的各个高阶谐波。谐波频率是基频的整数倍。因此, 例如,图1B所示的分量波形的频率2尸,是图1A所示基频的频率的两倍,因为在具有基频f的分量波形中发生一个周期的同时,在图IB所示的
分量波形中发生了两个完整的周期。图1C-图1F的分量波形的频率分别 是;3/,4/, ^和ef。图1A-图IF所示的六个波形的总和产生图1G所示 的音频波形110。音频波形可以表示在弦乐器或管乐器上演奏的单个音。 音频波形具有比图1A-图1F所示的正弦、单一频率、分量波形更复杂的 形状。然而,音频波形可被看成以基频尸重复,并且展现出在更高频率 处的规则模式。
与复杂音乐片段相对应的波形,诸如乐队或管弦乐队演奏的歌曲, 可以是极复杂的由好几百个不同的分量波形组成。如在图1A-图1G的示 例中所看到的,通过目测或直觉^^图1G中所示的波形110分解成图1A-图1F所示的分量波形将会非常困难。对于代表演奏的音乐分量的非常 复杂的波形来说,通过目测或直觉进行分解实际上是不可能的。已经开 发出数学方法来将复杂波形分解成分量波形频率。图2示出了将复杂波 形分解成分量波形频率的数学方法。在图2中,示出了相对于时间绘制 的复杂波形202的幅度。该波形能利用短时傅立叶变换方法进行数学变 换,来产生针对给定短时间段在一频率范围内的每个频率处的分量波形 的幅度的绘图。图2示出了连续短时傅立叶变换204:
其中,^是一时间点, ^("是描绘波形的函数, —"是时间窗函数, "是所选频率,以及
^V")是波形W。中频率"在时间5的分量波形的幅度、压力或能量。
和短时傅立叶变换的离散形式206: J(历,= $ z[/ ]伊["—y ]e—细"
其中,历是所选的时间间隔,
^W是描绘波形的离散函数, 『["-w]是时间窗函数,
"是所选频率,以及
是波形Z[Z7]中频率"在时间间隔历上的分量波形的幅度、压力
9或能量。
对于时域波形(图2中的202 ),短时傅立叶变换被应用于以特定 时间点或采样点为中心的时间窗。例如,图2所示的连续2 0 4和离散2 0 6 傅立叶变换被应用于以时间^ (或者在离散情况下的时间间隔m) 208 为中心的小的时间窗来产生二维频域绘图210,其中沿横轴212以分贝 (db)为单位画出了强度并且沿纵轴214画出了频率。频域绘图210指 示频率在对波形202有贡献的《到《-i的频率范围上的分量波形的幅度。 连续短时傅立叶变换2 0 4适合用于模拟信号分析,而离散短时傅立叶变 换206适合用于数字编码波形。在本发明的一个实施例中,使用具有汉 明窗和3584点重叠的4096点快速傅立叶变换,输入采样率为4"00Hz, 来产生频谱图。
可以把与时域时间7'相对应的频域绘图加入到幅度相对于频率和时 间的三维绘图中。图3示出了加入到幅度相对于频率和时间的三维绘图 的第一频域绘图。图2所示的二维频域绘图214关于绘图的纵轴向纸面 外旋转g(T,并且在沿时间轴304的对应于时间^的位置平行于频率轴 302插入。按照相似方式,通过将短时傅立叶变换应用于时间^处的波 形(图2中的202 )能得到下一个频域二维绘图,并且该二维绘图能被 添加到图3的三维绘图得到具有两列的三维绘图。图4示出了三维频率、 时间和幅度绘图,其中两列画出的数据位于采样时间7'和5。按照该方 式继续,通过对时域内的音频波形在每个MJ'J间隔的时间间隔连续应用 短时傅立叶变换,能够生成波形的完整三维绘图。
图5示出了由关于图2-图4所述方法而得到的频语图。图5是以二 维方式绘制的,而不是如图3和图4的三维透视。频谱图502具有水平 时间轴504和纵向频率轴506。频谱图包含对于每个采样时间的一列强 度值。例如,列508对应于通过应用于时间^ (图2中的208 )处的波 形(图2中的202 )的短时傅立叶变换所生成的二维频域绘图(图2中 的214)。频谱图中的每个单元都包含与对特定时间处的特定频率计算 的幅度相对应的强度值。例如,图5中的单元510包含与图2中根据时 间^处的复杂音频波形(图2中的202 )计算的行216的长度相对应的 强度值P"i'《。)。图5示出了对于频i普图502中的两个额外单元512和514 的功率标记。注释。频谱图可以在计算机存储器中以二维阵列数值 地编码,并且通常作为二维矩阵或阵列显示在显示装置上,显示的单元
10的颜色编码与功率相对应。
尽管对于不同频率的分量波形对音频信号的动态贡献的分析来说
频谱图是便捷的工具,但是频语图不强调强度相对于时间的变化率。本 发明的各种实施例从频谱图开始利用了两个附加的变换,来对对应的一
组频带产生能从其估计音乐速度的一组起奏强度/时间函数。图6A-图 6C示出了在本发明的方法实施例中使用的频谱图的两个变换中的第一 个。在图6A-图6B中,示出了频谱图的一'j、部分602。在频谙图6(M内 的给定点或者单元P("n,能计算出对于由频谱图604中的给定点或者 单元所代表的时间和频率的起奏强度d(" f〉。前一 强度朋("f)被计算为在 时间上在给定点之前的四个点或者单元606-609中的最大值,如图6A
中的第一表达式610所描述的
/7P(t, /) = max — 2, /"), / (t — 1, f + 1) , p(t — 1, /),户(t — 1, / — 1))
根据在时间上紧随着给定单元604的单个单元612来计算下一强度 ,(t'/),如图6A中表达式614所示的
邵(t, /) = p(£ + 1, /)
随后,如图6B所示,项"被计算为与下一功率对应的单元612以及
给定单元604的最大功率值
a = max (/ (t, /) , ,(t 一 /))
最终,在给定点处的起奏强度"("f)被计算为"与,("n之间的差,
如图6B中的表达式616所示的
t/(t, /) = a_PP(" /)
针对频谱图的每个内部点能计算出起奏强度值而产生二维起奏强 度矩阵618,如图6C所示。在限定了二维起奏强度矩阵的边界的粗矩形 620内的每个内部点或内部单元与一起奏强度值"("f)关联。粗矩形意在 当二维起奏强度矩阵覆盖在从其计算出该二维起奏强度矩阵的频谱图 上时,示出二维起奏强度矩阵略去了频语图中不能为其计算^m的某 些边缘单元。
尽管二维起奏强度绘图包括局部强度变化值,但是这些绘图 一般还 包含足够多的噪声和局部变化,从而很难辨别出音乐速度。因此,在第 二变换中,针对离散频带计算出起奏强度/时间函数。图7A-图7B示出 了针对一组频带的起奏强度/时间函数的计算。如图7A所示,二维起奏 强度矩阵702能被划分成多个水平方向的频带704-707。在本发明的一个实施例中,使用了四个频带
频带1: 32. 3Hz到1 076. 6Hz; 频带2: 1 076. 6Hz到3229. 8Hz; 频带3: 3229. 8Hz到7536. 2Hz;以及 频带4: 7536. 2Hz到1 3995. 8Hz。
在这些频带的纵列诸如频带705中的纵列708内的每个单元中的起 奏强度值,被求和来产生对于每个频带6中的每个时间点t的起奏强度值 如图7A中的表达式710所描述的。对于每个值6的起奏强度值 "(t, A)被单独收集以产生离散的起奏强度/时间函数,表示为针对每个频
带的"W值的一维阵列,图7B示出了针对其中一个频带(band)的绘图 716。随后在下文描述的处理中分析针对每个频带的起奏强度/时间函 数,来产生音频信号的估计音乐速度。
图8是示出了本发明的一个音乐速度估计方法实施例的流程控制 图。在第一步骤802中,该方法接收电子编码的音乐,诸如.wav文件。 在步骤804,该方法针对电子编码的音乐的一小部分来生成频谱图。在 步骤806,该方法将频镨图变换成包含^"f)值的二维起奏强度矩阵,如 上面参考图6A-图6C所讨论的。随后,在步骤808,该方法将二维起奏 强度矩阵变换成针对一组对应频带的一组起奏强度/时间函数,如上面 参考图7A-图7B所讨论的。在步骤810,该方法通过下文描述的处理来 确定, 一个范围的起奏间隔在步骤808中所生成的该组起奏强度/时间 函数内的可靠度。最后,在步骤812,该处理选择最可靠的起奏间隔, 根据该最可靠的起奏间隔来计算估计的音乐速度,并且返回估计的音乐 速度。
由图8中的步骤810所表示的,用于确定一个范围的起奏间隔的可 靠度的处理,在下文被描述为类似0++的伪代码实现。然而,在讨论可 靠度确定和估计音乐速度计算的类似0++的伪代码实现之前,首先参考 图9-图13来描述与可靠度确定有关的各种概念,从而有助于后续的类 似0++的伪代码实现的讨论。
图9A-图9D示出了起奏间隔和相位的概念。在图9A和随后的图9B-图9D中,显示了针对特定频带902的起奏强度/时间函数的一部分。在 起奏强度/时间函数的绘图中的每一列,诸如第一列904,表示出针对特 定频带在特定采样时间的起奏强度值"("W 。在估计音乐速度的处理中
12考虑一个范围的起奏间隔长度。在图9A中,考虑短的4列宽的起奏间
隔906-912。在图9A中,每个起奏间隔都包括在4"的时间间隔上的四 个Z (t,W值,其中At等于与采样点相对应的短时间段。注意,在实际的
音乐速度估计中,起奏间隔通常长得多,并且起奏强度/时间函数可能 包含几万或更多数量的"",W值。为了说明简洁起见,示例使用了人为 的小值。
在每个起奏间隔("ior )中的相同位置的每个ioi中的"("w值
可以被看作潜在的起奏点,或者强度快速增加的点,其可能表示音乐片
段中的节拍或音乐速度点。评估一个范围的101以便找出在每个间隔内
的选择的w位置处具有高w值方面具有最大规则性或者可靠度
的101。换言之,当针对固定长度间隔的一个连续集合的可靠度为高时, 该101典型地表示了在音乐片段内的节拍或频率。通过分析对于一组对 应的频带的一组起奏强度/时间函数所确定的最可靠的101通常与估计 的音乐速度有关。因此,在图8中的步骤810的可靠度分析考虑了从某 个最小101长度到最大101长度的101长度的范围,并且针对每个101 长度来确定可靠度。
对于,个选择的101长度,需,考^虑等于比101长度小1的数,的
强度/时间函数的原点的全部可能的起奏或相位。如果在图9A中的第一 列904表示时间、那么图9所示的间隔906-912能被考虑成表示4At间 隔,或者具有零相位的4列宽度的101。在图9B-图9D中,间隔的开始 沿时间轴偏移连续的位置,从而分别得到A" 2At和3"的连续相位。 因此,通过针对可能的101长度的范围来评估相对于^。的全部可能的相 位,或者开始点,能在音乐片段中穷尽地搜索可靠地出现的节拍。图10 示出了由图8所示的步骤810所表示的搜索的状态空间。在图10中, 沿i,轴1 002画出了 101长度,沿纵轴1 004画出了相位,101长度和相 位两者都是以由每个采样点所代表的时间段At为增量绘制的。如图10 所示,考虑了最小间隔大小1 006和最大间隔大小1008之间的全部间隔 大小,并且针对每个IOI长度,考虑了在0与比101长度小1之间的全 部相位。因此,阴影区域IOIO表示了搜索的状态空间。
如上所述,在每个101内的特定位置处的特定〃(""值被选择用于
评估101的可靠度。然而,不是确切地选择该特定位置处的"",w值,而是考虑该位置邻域内的〃("W值,并且在包括该特定位置的该特定位 置的邻域内具有最大值的"("W值被选择为该101的"("w值。图11示 出了根据本发明的实施例的在〃",W值的邻域内的峰值"("W值的选择。
在图11中,每个101中的最后一个"("w值,诸如""W值no2,是代 表101的最初候选^0值。考虑该候选"&W值周围的邻域R ll(M,在 该邻域内的最大"&W值,在图ii所示情况下"&W值U06,被选择为
该101的代表性的,w值。
如上所述,作为高"("W值在起奏强度/时间函数中为每个101所选 择的代表性"仏W值处出现的规则性,计算对于特定101长度和特定相 位的可靠度。通过连续考虑沿时间轴的各101的代表性〃",w值来计算 可靠度。图12示出了通过连续考虑沿时间轴的各起奏间隔的代表性 "",W值来计算可靠度的处理的一个步骤。在图12中,已经到达了 101 1204的特定的代表性"("W值1 202。找到下一 101 1208的下一代表性 "(0)值1206,并且确定下一代表性"("W值是否大于阈值,如图12中 的表达式1210所示。如果是的话,则增加该IOI长度和相位的可靠度
量度,以表示在相对于当前考虑的IOI 1204的下一 IOI中找到了相对
高的"fc W值。
尽管如参考图12的上述方法确定的可靠度是确定估计音乐速度时 的一个因素,但是当在IOI内找到更高次音乐速度时,特定I0I的可靠 度被减小。图13示出根据对起奏间隔中可能的、更高次频率或音乐速 度的识别来对当前考虑的起奏间隔进行可靠度减小或降低。在图13中, 当前正在考虑IOI 1 302。如上所述,当关于前一 101 1 308中的候选"("W 值1 306来确定可靠度时,考虑在本101内的最后位置处的"&W值1304 的幅度。然而,如果在由本101表示的频率的更高次谐波处,诸如在〃",w 值1310-1312处,检测出很大的"(""值,那么当前考虑的101可被降 低可靠度。在特定101长度的评估期间对在大量该101上的更高次谐波 频率的检测,表示在音乐片段中可能存在能更好地估计音乐速度的更 快,更高次谐波音乐速度。因此,如下面要很详细讨论的,当检测出更 高次谐波频率时,计算出的可靠度扣除了损失。
提供了以下的图8所示的步骤81 0和812的类似C+十的伪代码实现, 来具体说明本发明的一个可能的方法实施例,用于根据从二维起奏强度 矩阵获得的一组对应频带的一组起奏强度/时间函数来估计音乐速度。首先,声明多个常数
1 const int maxT;
2 const double tDelta;
3 const double Fs;
4 const int maxBands=4;
5 const int numFractiona1Onsets=4;
6 const double ractiona 10nse t s [n固Fract iona 10nset s] = (0. 666, 0. 5, 0. 333, . 25};
7 const double fractionalCoefficients[numFractiona10nsets] = {0. 4, 0. 25, 0. 4, 0. 8};
8 const int Penalty=0;
9 const double g [maxBands] = {1. 0, 1 0, 0. 5, 0. 25);
这些常数包括(1 )第1行声明的maxT,表示针对起奏强度/时间 函数的沿时间轴的最大时间样本或者时间索引;(2)第2行声明的 tDelta,包含由每个采样表示的时间段的数值;(3)第3行声明的Fs, 表示每秒收集到的采样;(4)第4行声明的maxBands ,表示了最初的 二维起奏强度矩阵能被分割成的频带的最大数量;(5)第5行声明的 numFractionalOnsets,表示了在每个101内与高次谐波频率相对应的 位置的数量,这些高次谐波频率被评估以确定在可靠度确定期间用于 IOT的损失;(6 )第6行声明的fractionalOnsets,为包含在损失计 算期间考虑的分数起奏中的每一个在101内位于101的分数的阵列; (7 )第7行声明的fractionalCoefficients,为在101的损失的计算 期间出现在IOI内考虑的分数起奏处的"","值所乘的系数的矩阵;(8) 第8行声明的Penalty,在101的代表性"("W值落入阔值以下时从评估
的可靠度中减掉的值;以及(9)第9行声明的g,在每个频带中每个所 考虑的101的可靠度所乘以的增益值的阵列,从而比在其他频带中的相 应可靠度更高地对特定频带中的101的可靠度加权。
接下来,声明两个类。首先,下面声明类"OnsetStrength":
1 class OnsetStrength
2 {
3 private:
4 int D—t [隨T];
5 int sz;
6 int minFj
7 int maxF;
8
9 public:
10 int operator [] (int i);
11 Uf (i<0 II i>=maxT) return -l;else return (D t[i]););
12 int getSize () {return sz;)j
13 int getMaxF () {return maxF;};
14 int getMinF() {return minF;};15 OnsetStrength ();
16 };
类"OnsetStrength"表示对应于一频带的起奏强度/时间函数,如参考图7A-图7B所讨论的。没有提供该类的完整的声明,这是由于它只被用来提取出用于可靠度的计算的"(""值。私有数据成员包括(1)第4行声明的D—t,为包含〃",W值的阵列;(2)第5行声明的sz,起奏强度/时间函数中的〃&W值的量或者数量;(3)第6行声明的minF,由类"OnsetStrength"的一个实例代表的频带内的最小频率;以及(4)maxF,由类"OnsetStrength"的 一 个实例代表的最大频率。类"OnsetStrength"包括四个公有函数成员(l)第IO行声明的operator[],其提取与指定索引或采样序号相对应的〃(t'6)值,从而类OnsetStrength的实例起一维阵列的作用;(2)三个函数getSize,getMaxF和getMinF, 分另ll返回私有数据成员sz, minF和maxF的当前值;以及(3)构造器。
接下来,声明了类"TempoEstimator":
1 class TempoEstimator
2 (
3 private:
4 OnsetStrength*D;
5 int numBands;
6 int maxI0I;
7 int minIOI;
8 int thresholds[maxBands];
9 int fractionalTs[nufflFractionalOnsets];
10 double reliabi1ities [maxBands] [maxT];
11 double finaIReliabi1ity [maxT]
12 double penalties[maxT];
13
14 int findPeak (0nsetStrength& dt, int t, int R);
15 void computeThresholds();
16 void computeFractionalTs(int 101);
17 void nxtReliabi1ityAndPenalty
18 (int 101, int phase, int band, double & reliability
19 double & penalty);
20 public:
22 void setD (0nsetStrength*d, int b) {D=d, numBands=b;};
23 void setMaxIOI (int mxl01)(隨I0I,I0I;);
24 void setMinIOI (int ranIOI) (minlOI,IOI;};
25 int estimateTempo ();
26 TempoEst imator ();
27 );
类"TempoEstimator"包括以下私有数据成员(1)第4行声明的D,代表一组频带的起奏强度/时间函数的、类"OnsetStrength"的实例的阵列;(2)第5行声明的numBands,其存储当前被考虑的频带以及起奏强度/时间函数的数量;(3)第6-7行声明的maxIOI和min101,在可靠度分析中要被考虑的最大101长度和最小101长度,分别对应于图10中的点1 008和1006; ( 4 )第8行声明的thresholds,计算出的
(5)第9行声明的fractionalTs,在根据当前考虑的101内的更高次频率的出现的针对101的损失的计算期间,与要考虑的分数起奏相对应的,从101的起点的按照"的偏移;(6)第IO行声明的reliabilities,存储每个101长度在每个频带中的计算的可靠度的二维阵列;(7)第11行声明的finalReliability,存储最终可靠度的阵列,最终可靠度是通过将针对一个范围的101内的每个101长度确定的可靠度对于每个频带求和所计算出的;以及(8)第12行声明的penalties,存储了在可靠度分析期间计算出的损失。类"TempoEstimator"包括以下私有函数成员(1 )第14行声明的findPeak,其指出邻域R内的最大峰值的时间点,如参考图11所讨论的;(2 )第15行声明的computeThresholds,其计算存储在私有数据成员thresholds中的阈值;(3)第16行声明的computeFractionalTs,其计算从特定长度的101的起点的时间上的偏移,与用于计算损失所考虑的更高次谐波频率相对应;(4)第17行声明的nxtReliabilityAndPenalty,其针对特定101长度、相位和频带来计算下一可靠度和损失值。类"TempoEstimator"包括以下公有函数成员(1 )第22行声明的setD,其使得多个起奏强度/时间函数可以被加载到类"TempoEstimator"的实例中;(2 )第23-24行声明的setMax和setMin,其使得定义了在可靠度分析中考虑的101的范围的最大和最小101长度可以被设置;(3) estimateTempo,其根据存储在私有数据成员D中的起奏强度/时间函数来估计音乐速度;以及(4)构造器。
接下来,提供了类"TempoEstimator"的各种函数成员的实现。首先,提供了函数成员"findPeak"的实现
1 int TempoEstimator::findPeak (OnsetStrength& dt, int t, int R)
2 {
3 int max-0;
4 int nextT;
5 i n t i',
6 int start=t—R/2;7 int finish=t+R;
8
9 if(start〈0) start=0;
10 if (finish〉dt. getSize ()) finish=dt.getSize 0;
11
12 for(i=start; Kfinish; i++)
13 {
14 if (dt [i] >max)
15 {
16 max-dt[i];
17 nextT=i;
18 )
19 }
20 return next;
21 }
函数成员"f indPeak"接收时间值和邻域大小作为参数t和R,并
且作为对起奏强度/时间函数dt的基准,在时间点t周围的邻域内在起
奏强度/时间函数dt中找到最大峰值,如参考图11所讨论的。函数成
员"findPeak"在第9-10行计算与限定了邻域的横轴点相对应的开始
时间和结束时间,随后,在第12-19行的for循环中,在该邻域中检查每个Z^,)值以确定最大Z (t,A)值。在第20行返回与最大"("W相对应的
索引或时间值。
接下来,提供了函数成员"computeThresholds"的实现
1 void TempoEstimator: :computeThresholds ()
2 {
3 int i, j;
4 double sum;
6 for(i-O; i<numBands; i++)
7 {
8 sum=0. 0;
9 for(j=0; j<D [i]. getSize (); j++)
10 (
11 sum+=D [i] [ j];
12 J
13 thresholds[i]=int (sum/j);
14 )
15 )
该函数计算了针对每个起奏强度/时间函数的平均"("W值,并且将平均W值存储为针对每个起奏强度/时间函数的阈值。
接下来,提供了函数成员"nxtReliabilityAndPenalty"的实现
1 void TempoEs t ima tor::nxtReliabilityAndPenalty
2 (int 101, int phase, int band, double & reliability,<formula>formula see original document page 19</formula>函数成员"nxtReliabilityAndPenalty"针对指定的101大小,或长度,指定的相位以及指定的频带来计算可靠度和损失。换言之,这子程序被调用来计算在二维私有数据成reliabilities中的每个值。在第6-7行声明的局部变量valid和peak被用来在分析起奏强度/时间函数时对高于阈值的IOI和总的101的计数进行累加,来计算针对指定的101大小、相位和指定的频带的可靠度和损失。第8行声明的局部变量t被设置成指定的相位。第10行声明的局部变量R是邻域的长度,从该邻 域来选择代表性"("W值,如参考图ll在上面所讨论的。
在第19-38行的while循环中,考虑了长度101的连续""'"值的 连续组。换言之,可以认为循环的每次迭代是分析沿绘制的起奏强度/ 时间函数的时间轴的下一个101。在第21行,计算下一个101的代表性 "(^)值的索引。在第22行局部变量peak被递增来表示已经考虑了另 一个101。如果针对下一个IOI的代表性"("W值的幅度大于阈值,如第 23行所确定的,那么在第25行局部变量valid被递增来表示检测到了 另一有效的代表性"(。W值,并且在第26行该"",W值被添加到局部变 量reliability。如果针对下一个101的代表性"仏6)值不大于阈值,那 么局部变量reliability将被减去数值penalty。随后,在第30-35行 的for循环中,根据对在当前考虑的IOI内的更高次节拍的检测来计算 损失。该损失被计算成 一 系数乘以在 IOI内的由常数 numFract iona 1 Onsets 和P车歹寸 FractionalTs 指定的各次间 (inter-order )谐波峰值的珠,)值。最后,在第37行t以指定的IOI 长度7Y /被递增,来索引下一个IOI来准备第19-38行的while循环的 随后的迭代。通过在第39-41行上对局部变量valid和peak的内容的 乘积进行平方根运算,来对针对IOI长度、相位和频带的累加的可靠度 和损失进行归一化。在替代实施例中,在第37行上nextT可以被递增 101,并且通过调用第21行上的findPeak(D[band], nextT + IOI, R)
来找到下一个峰值。
接下来,提供了用于函数成员"computeFractionalTs"的实现
1 void TempoEsUmator: : computeFractionalTs (int 101)
2 {
3 int
4
5 for (i = 0; i < numFractionalOnsets;
6 {
7 fractionalTs[i] = int {IOI * fractional0nsets [i]);
8 }
9 }
该函数成员简单地根据存储在常数阵列"fractional0nsets"中的 各分数起奏计算从指定长度的101的起点的时间上的偏移。 最后,提供了用于函数变量"EstimateTempo"的实现
1 int TempoEstimator: : estimateTempo0
2 {3 int band;
4 int 101;
5 int 1012;
6 int phase;
7 double reliability = 0.0;
8 double penal ty = 0. 0;
9 int estimate = 0;
10 double ej
11
12 if (D== 0) return-1;
13 for (101 = minIOI; 101 < maxIOI; I0I++)
14 {
15 penalties [IOI] = 0. 0;
16 finalReliability[IOI]
17 for (band = 0; band <
18 (
19 reliabilities [band] [IOI] = 0. 0;
20 )
21 )
22 computeThresholds0;
23
24 for (band = 0; band < numBands; band++)
25 {
for (IOI = minIOI; IOI < maxIOI; IOI++)
=0. 0;
numBands; band++)
26
27 {
28
29
30
31
32
33
34
35
36
37
38
39
40 }
41 }
42
43 for (IOI = minIOI; IOI < maxIOI; I0I++)
44 {
45 reliability = 0, 0;
46 for (band = 0; band < numBands; band++)
47 {
48 IOI2 = IOI / 2;
49 if (IOI2 〉= minIOI)
50 reliabi1i ty +=
51 g[band] * (reliabi1ities[band][IOI]
computeFracticmalTs (IOI); for (phase = 0; phase < IOI -l; phase十+)
nxtReliabilityAndPenalty
(IOI, phase, band, reliability, penalty); if (reliabi1ities[band] [IOI] < reliability)
reliabi1ities [band] [IOI] = reliability; pena1ties[IOI] = penalty;
reliabilities [band] [IOI] —= 0.5 * pena11ies [101];<formula>formula see original document page 22</formula>
函数成员"estimateTempo"包括局部变量(1 )第3行声明的band, 指定了要考虑的当前频带或者起奏强度/时间函数的迭代变量;(2)第 4行声明的为当前考虑的IOI长度;(3 )第5行声明的M",为 当前考虑的IOI长度的一半;(4)第6行声明的phase,针对当前考虑 的IOI长度的当前考虑的相位;(5)第7行声明的reliability,针对 当前考虑的频带、IOI长度和相位计算的可靠度;(6) penalty,针对 当前考虑的频带、IOI长度和相位计算的损失;(7)第9-IO行声明的 esti腿te和e,用来计算最终的音乐速度估计。
首先,在第12行,检查看是否已经将一组起奏强度/时间函数输入 到类"TempoEstiinator"的当前实例。其次,在第13-21行,初始化在 音乐速度估计中使用的各种局部和私有数据成员。随后,在第22行, 计算用于可靠度分析的阈值。在第24-41行的for循环中,针对每个频 带、每个考虑的IOI长度的每个相位来计算可靠度和损失。在第39行 在当前考虑的IOI长度和当前考虑的频带的全部相位上计算出的最大可 靠度和对应的损失被确定,并存储为针对当前考虑的IOI长度和频带找 到的可靠度。接下来,在第43-56行的for循环中,通过跨各频带对101 长度的可靠度求和,来计算出每个IOI长度的最终可靠度,每一项都乘 上存储在常数阵列"g"中的增益因子,从而比其他频带更多地加权某些频带。当与当前考虑的101的一半长度的ioi相对应的可靠度可用时, 在该计算中将当前考虑的101的可靠度与一半长度101的可靠度相加, 因为根据经验发现特定101的可靠度的估计可能取决于针对该特定ioi
长度一半长度的101的可靠度的估计。在第55行,针对时间点计算出的 可靠度被存储在数据成员finalReliability中。最后,在第59-"行 的for循环中,通过搜索数据成员finalReliability找到针对任意101 长度的总体上最大的计算出的可靠度。在第68-71行使用针对任意101 长度的总体上最大的计算出的可靠度来计算按照每分钟的节拍的估计 音乐速度,该估计音乐速度在第71行返回。
尽管已经按照特定实施例描述了本发明,但是它并非要将本发明限 制于这些实施例。在本发明的实质范围内的变型对本领域技术人员来说 是显而易见的。例如,通过利用不同的模块构成、数据结构、编程语言、 控制结构以及通过变化其他编程和软件工程参数能设计出基本上不受 数量限制的本发明的替代实施例。为了在针对不同类型的音乐片段的各 种不同的环境下实现最优音乐速度估计,可以改变在上述实现中使用的 各种不同的经验数值和方法。例如,可以考虑各种不同的分数起奏系数 和分数起奏的数量,用于根据更高次谐波频率的存在来确定损失。可以 采用通过多种方法中的任意 一种利用表征这些方法的不同参数得到的 频语图。可以改变在分析期间可靠度被递增、递减以及由其来计算损失 的确切值。可以改变被采样来产生频镨图的音乐片段的部分的长度。通 过替代方法可以计算起奏长度,并且可使用任意数量的频带作为计算起 奏强度/时间函数数量的基础。
为了说明的目的,前面的描述使用了特定的术语以提供对本发明的 全面的理解。然而,对于本领域技术人员来说显而易见的是,为实施本 发明并非要求该特定细节。为了说明和描述的目的,给出了本发明的特 定实施例的上迷说明。它们并非意在穷尽本发明或将本发明限制于所公 开的精确的形式。根据上迷指教作出许多变型和改变明显是有可能的。 为了更好的解释本发明的原理及其实际应用示出并描述了这些实施例, 从而使得本领域其他技术人员能将本发明以及具有各种适合变型的各 种实施例利用到设想到的特定用途。本发明的范围意在由所附权利要求 及其等同物所限定。
权利要求
1. 一种计算估计音乐片段的音乐速度的方法(图8),该方法包括选择音乐片段的一部分;针对音乐片段的所选择的部分来计算(804)频谱图(502);针对一组对应的频带(704-707),将频谱图变换(806)成一组起奏强度/时间函数(716);通过对起奏间隔长度范围内的每个起奏间隔长度(906-912)的可能相位进行分析,包括对与每个起奏间隔长度对应的更高频率谐波进行分析,来分析该组起奏强度/时间函数,以确定最可靠的起奏间隔长度(808,8100),以及根据最可靠的起奏间隔长度来计算音乐速度估计(812)。
2. 如权利要求1所述的方法,其中针对一组对应的频带(704-707 ), 将频语图(502 )变换成一组起奏强度/时间函数(716)还包括将频镨图(502 )变换成二维起奏强度矩阵(618);选择一组频带;以及针对每个频带,计算起奏强度/时间函数。
3. 如权利要求2所述的方法,其中将频谱图(502 )变换成二维起 奏强度矩阵(618 )还包括针对频语图中由采样时间t和频率f索引的每个内部点值^"n, 计算针对采样时间t和频率f的起奏强度值^m, 将所计算出的起奏强度值^^,f)包括在以t和f为索引的二维 起奏强度矩阵单元中;其中针对对应的频谙图内部点值n,起奏强度值〃",n被计算为 d", /) =max/) , / pU—/)) —p/7", /)其中/7/7(t' /') = p(t + 1, /);其中,选择一组频带(704-707 )还包括将频谱图中包括的频率范 围分割成多个频带;并且其中针对频带b来计算起奏强度/时间函数还包括针对每个采样时间~,通过将二维起奏强度矩阵(618 )中t = ~ 并且f处在与频带b相关联的频率范围内的起奏强度值〃("f)求和,来计算起奏强度值"U,, 6)。
4. 如权利要求l所述的方法,其中通过对在起奏间隔长度范围内的每个起奏间隔长度的可能相 位进行分析,包括对每个起奏间隔长度的更高频率谐波进行分析,来分析该组起奏强度/时间函数(716),以确定最可靠的起奏间隔长度 (906-912 )还包括针对与频带b对应的每个起奏强度/时间函数,对于起奏间隔长度范围内的每个起奏间隔长度的每个可能的相位 计算可靠度,对针对每个起奏间隔长度计算出的可靠度在频带(704-707 )上求和,以得到针对每个起奏间隔长度的最终计算出的可靠度,并且选择具有最大的最终计算出的可靠度的起奏间隔长度为最终的最 可靠的起奏间隔长度;并且其中,根据最可靠的起奏间隔长度来计算音乐速度估计还包括,利 用每个固定时间段收集的用于得到频语图(502 )的采样点的固定数量, 以及利用每个采样点所代表的时间间隔,从以采样点为单位的最可靠的 起奏间隔长度来计算按照每分钟的节拍的音乐速度。
5. 如权利要求4所述的方法,其中计算一特定相位下的一起奏间 隔长度(906-912 )的可靠度还包括初始化该起奏间隔长度的可靠度变量和损失变量; 从距起奏强度/时间函数(716)的原点移位了该相位的采样时间开始,并且继续到已经考虑了在起奏强度/时间函数内的采样点的全部起奏间隔长度为止选择采样点的下 一 当前考虑的起奏间隔长度,对于采样点的该选择出的下 一起奏间隔长度,从起奏强度/时 间函数中选择代表性"U,扮值,当选择的代表性扮值大于阈值时,将可靠度变量递增一数值,当在采样点的该当前考虑的起奏间隔长度内检测出可能的更 高次节拍频率时,将损失变量递增一数值,以及当选择的代表性扮值大于阈值时;以及 根据在可靠度变量和损失变量中的数值来计算该起奏间隔长度的可靠度。
6. —种音乐速度估计系统,包括计算机系统,其能接收数字编码的音频信号;以及软件程序,其通过下列步骤来估计数字编码的音频信号的音乐速度选择音乐片段的一部分;针对音乐片段的所选择部分来计算(804)频谱图(502 );针对一组对应的频带(704-707 ),将频谱图变换(806 )成一组起 奏强度/时间函数(716);通过对起奏间隔长度范围内的每个起奏间隔长度的可能相位进行 分析,包括对与每个起奏间隔长度对应的更高频率谐波进行分析,分析 该组起奏强度/时间函数,来确定最可靠的起奏间隔长度(808, 8100, 906-91 2 ),以及根据最可靠的起奏间隔长度来计算音乐速度估计(812)。
7. 如权利要求6所述的音乐速度估计系统,其中针对一组对应的 频带(704-707 ),将频谱图(502 )变换成一组起奏强度/时间函数("6 ) 还包括将频语图变换成二维起奏强度矩阵(618);选择一组频带;以及针对每个频带,计算起奏强度/时间函数。
8. 如权利要求7所述的音乐速度估计系统,其中将频谱图(502 ) 变换成二维起奏强度矩阵(618)还包括针对频语图中由采样时间t和频率f索引的每个内部点值P"n, 计算针对采样时间t和频率f的起奏强度值"("f),并且 将所计算出的起奏强度值^"n包括在以t和f为索引的二维起奏强度矩阵单元中;其中针对对应的频谱图内部点值f),起奏强度值"",^被计算为CK,, /) ,X (pU, /) , /7/7"—/)) ,", /)其中/) = p(t + 1,/)而且/0 =画- 2, /), p(t - 1, / + 1), p(t - 1, / ), p(t - 1, f - l)). 并a其中针对频带b来计算起奏强度/时间函数还包括针对每个采样时间~,通过将在二维起奏强度矩阵中t =《并且f处在与频带b相关联的频率范围内的起奏强度值〃",n求和,来计算起奏 强度值"U,, 6)。
9. 如权利要求6所述的音乐速度估计系统,其中通过对在起奏间 隔长度范围内的每个起奏间隔长度的可能相位进行分析,包括对每个起 奏间隔长度的更高频率谐波进行分析,来分析该组起奏强度/时间函数(716),以确定最可靠的起奏间隔长度(906-912 ),还包括 针对与频带b对应的每个起奏强度/时间函数,对于起奏间隔长度范围内的每个起奏间隔长度的每个可能相位计算可靠度,对针对每个起奏间隔长度计算出的可靠度在频带(704-707 )上求 和,以针对每个起奏间隔长度得到最终计算出的可靠度;以及选择具有最大的最终计算出的可靠度的起奏间隔长度为最终的最 可靠的起奏间隔长度。
10. 如权利要求9所述的音乐速度估计系统,其中计算一特定相位下的 一起奏间隔长度的可靠度还包括初始化该起奏间隔长度的可靠度变量和损失变量; 从距起奏强度/时间函数(716)的原点移位了该相位的采样时间开 始,'并且继续到已经考虑了在起奏强度/时间函数内的采样点的全部的 起奏间隔长度(906 - 912 )为止选择采样点的下 一 当前考虑的起奏间隔长度, 对于采样点的该选择出的下 一起奏间隔长度,从起奏强度/时 间函数中,选择代表性"(6)值,当选择的代表性"U,扮值大于阈值时,将可靠度变量递增一数值,当在采样点的当前考虑的起奏间隔长度内检测出可能的更高 次节拍频率时,将损失变量递增一数值,以及当选择的代表性"(,,6)值大于阈值时;以及 根据在可靠度变量和损失变量中的数值来计算该起奏间隔长度的 可靠度。
全文摘要
本发明的各种方法和系统实施例涉及数字编码的音乐片段的音乐速度的计算估计。在下文所述的本发明的有些实施例中,对音乐片段的一小部分加以分析来确定音乐片段的音乐速度。数字编码的音乐片段采样被计算地变换以产生对应于该采样的功率频谱,接着被变换来产生二维起奏强度矩阵(618)。二维起奏强度矩阵随后被变换(806)成一组对应的频带(704-707)中的每个的起奏强度/时间函数(716)的组。随后分析起奏强度/时间函数来求出最可靠的起奏间隔(808,8100),该最可靠的起奏间隔被变换成由分析(812)返回的估计的音乐速度。
文档编号G10H1/40GK101512636SQ200780033733
公开日2009年8月19日 申请日期2007年9月11日 优先权日2006年9月11日
发明者R·萨马达尼, S·维道森, T·张, Y·-Y·常 申请人:惠普开发有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1