一种音频比较方法
技术领域
本发明涉及一种音频比较方法,属于计算机音频、多媒体信息技术以及模式匹配等领域,特别涉及一种在音频数据库中基于能量信息提取特征的两段音频数据的快速比较。
背景技术
随着计算机技术的发展,特别是海量存储设备和大容量内存在PC机上的实现,对音频媒体进行数字化处理便成为可能。数字化处理的核心是对音频信息的采样,通过对采集到的样本进行加工,达成各种效果,这是音频媒体数字化处理的基本含义。为了检查处理过后的音频文件和原始文件之间有哪些区别,如何快速、准确地从两段音频中找到相同和不同之处是影视后期编辑中最基本也是最重要的问题之一。解决这个问题的有效手段便是音频比较技术。常用的音频技术主要可分为基于采样数据的和基于音频内容的二种。其中,基于采样数据的音频比较技术通常通过直接在比较两段音频的每个采样点来实现。这种技术存在两个明显不足:首先,音频采样点数据的海量性决定了对于两段较长的音频文件逐点比较这样的问题是NP的,不可能很快的得出结果,没有现实性的意义。其次,基于逐点比较的方法会使音频中存在大量的破碎段落,使得比较的结果过于零碎,不能提供直观可见的结果。基于音频内容的音频比较技术主要是对音频本身的各种特征进行分析和比较的技术。目前常用的音频特征有:波形、音质和MFCC等。但基于波形的比较方法过于依赖波形图的拟合方程,使得比较结果的存在很大误差。而基于的音质方法存在音质标准和接受器材约束的问题,使得比较的精度和效率也都不够好。基于MFCC特征的方法由于需要将音频按照语句划分出来,无法大规模快速进行。还有些音频比较方法采用了半监督的反馈技术,通过与用户的交互来改善比较的结果,直到用户满意。这种方法通常会给用户带来较大的负担和时间开销。
发明内容
发明目的:本发明所要解决的技术问题是针对现有技术的不足,并且为影视后期制作公司提供一个新的解决方案,提供一种音频比较方法。
技术方案:本发明公开了一种音频方法,所述音频快速比较部分包括以下步骤:
步骤1,将待比较的音频p和音频q,分别按照其音频的长度划分出长度相等的两组音频数据特征段,其中音频p划分为特征段集合Cp,Cp={cp1,cp2…cpi…cpLp},音频q划分为特征段集合Cq,Cq={cq1,cq2…cqj…cqLq},其中cpi表示特征段集合Cp中第i个音频数据特征段,1≤i≤Lp,Lp为特征段集合Cp的长度,cqj特征段集合Cq中第j个音频数据特征段,1≤j≤Lq,Lq为特征段集合Cq的长度,因为音频是无损音频,所以其每秒采样值数目比较大,通常都为每秒48000个采样点(即特征点),如音频p有8000个采样数据,音频q有6000个采样数据,则将p,q划分成长度为100个采样点的音频数据特征段,则音频p有80个音频数据特征段,每个音频数据段有100个特征点,音频q有60个音频数据特征段,每个音频数据特征段有100个特征点;
步骤2,利用CUDA(通用计算架构)方法,将音频p的特征段集合Cp和音频q的特征段集合Cq中每个特征段中的音频数据导入到GPU(Graphic Processing Unit,图形处理器,)上并行计算,得到音频p的特征段集合Cp的能量特征值序列Wp和音频q的特征段集合Cq的能量特征值序列Wq;
步骤3,将音频p的能量特征值序列Wp和音频q能量特征值序列Wq通过差值方法构建出一个Lp行Lq列能量矩阵Mat,其中Wp={wp1,wp2…wpi…wpLp},Wq={wq1,wq2…wqj…wqLq},即将能量特征值序列Wp中wp1作为与Wq={wq1,wq2…wqj…wqLq}中的每一个能量特征值做差值后作为一行,同理为wp2,wp3…wqLq中的每一个能量特征值都做差值得到对应行,组合后即得到Lp行Lq列能量矩阵Mat。
能量矩阵Mat可以采用如下所示矩阵结构:
;
步骤4,利用变形的后缀数组查找公共子串算法,查找出步骤3中所得的能量特征值序列Wp和能量特征值序列Wq中的公共部分,公共部分即是音频p和音频q相同区域段落的集合Seg;
步骤5,将能量矩阵Mat中元素数值小于设定阈值的区域连通,得到连通区域集合Vres;阈值设定为任意大于0小于1的实数,数值越小,音频比较的精度越高。
步骤6,将步骤5中所得的连通区域集合Vres作为结果,用波形表示;
步骤7,结束。
所述步骤2具体包括以下步骤:
步骤2a,将步骤1中所得到特征段cpi中的特征点组成一个长度固定为N的向量D={Pi0,Pi1,Pi2…Pin…PiN},1≤i≤Lp,1≤n≤N,基于并将向量D通过CUDA(ComputeUnified DeviceArchitecture,通用计算架构)的cudamalloc函数加载到GPU内存中设置线程块block和线程thread,使得该设置动态最优的适合于向量D={Pi0,Pi1,Pi2…Pin…PiN};
步骤2b,将计算向量D={Pi0,Pi1,Pi2…Pin…PiN}的特征值wpi的过程分布到每个线程上,能量特征值wpi的计算公式如下:
其中Pin为音频数据特征段cpi上的特征点,N为音频数据特征段cpi上的特征点的总数,0≤n≤N,α、β为设定的权值,α+β=1,0≤α≤1,0≤β≤1,α越大意味着该音频能量集中,β越大意味着该音频波动较大,energy(Pin)为音频数据特征段cpi中特征点的能量信息,none(Pin)为音频数据特征段cpi中特征点的过零点信息,dis(N)为音频数据特征段cpi的距离信息;
步骤2c,将步骤1中所得到特征段cqi中的特征点组成一个长度固定为N的向量D={Pj0,Pj1,Pj2…Pjn…PjN},1≤j≤Lq,1≤m≤N,基于并将向量D通过CUDA的cudamalloc函数加载到GPU内存中,合理设置线程块block和线程thread,使得该设置动态最优的适合于向量D={Pj0,Pj1,Pj2…Pjn…PjN};
步骤2d,将计算向量D={Pj0,Pj1,Pj2…Pjn…PjN}的特征值wqj的过程分布到每个线程上,特征值wqi的计算公式如下:
其中Pjm为音频数据特征段cqj上的特征点,N为音频数据特征段cqj上的特征点的总数,0≤m≤N,由于音频数据特征段cpi与音频数据特征段cqj等长,因此两者的特征点的总数相等为N;α、β为设定的权值,α+β=1,0≤α≤1,0≤β≤1,α越大意味着该音频能量集中,β越大意味着该音频波动较大,energy(Pjm)为音频数据特征段cqj中特征点的能量信息,none(Pjm)为音频数据特征段cqj中特征点的过零点信息,dis(N)为音频数据特征段cqj的距离信息。
步骤2e,步骤2b和步骤2d中得到的特征值数值范围不统一,将其归一到一个统一的尺度;
所述步骤4具体包括以下步骤:
步骤4a,将步骤3中的能量特征值序列Wp={wp1,wp2…wpi…wpLp}和能量特征值序列Wq={wq1,wq2…wqj…wqLq}(其中Lp、Lq分别为能量特征值序列的长度,1≤i≤Lp,1≤j≤Lq)结合起来,将能量特征值序列中数值设为一个字符,构建一个字符序列Vw={wp1,wp2…wpi…wpLp,NA,wq1,wq2…wqj…wqLq},其中NA为隔断标记;
步骤4b,分别为步骤4a中Wp={wp1,wp2…wpi…wpLp}和音频q能量特征值序列Wq={wq1,wq2…wqj…wqLq}构建后缀数组,基本思路是计算Wp的所有后缀和Wq的所有后缀之间的最长公共前缀的长度,把最长公共前缀长度不小于k的部分全部加起来,k为设定的最小检索长度。扫描字符序列Vw{wp1,wp2…wpi…wpLp,NA,wq1,wq2…wqj…wqLq},每遇到一个Wq的后缀就统计与前面的Wp的后缀能产生多少个长度不小于k的公共子串,这里Wp的后缀需要用一个单调的栈来高效的维护;
步骤4c,将步骤4b中返回的公共子串集合按照位置对应关系得出特征值向量Wp={wp1,wp2…wpi…wpLp}和Wq={wq1,wq2…wqj…wqLq}中对应的公共序列集合Seq;
步骤4d,将步骤2c特征值向量Wp={wp1,wp2…wpi…wpLp}和Wq={wq1,wq2…wqj…wqLq}中公共序列集合Seq合并整理,将公共交叉的数据段落合并,将连续的部分整理连接得到公共段落集合Seq*;
所述步骤5具体包括以下步骤:
步骤5a,将步骤4中得到的相同区域的段落的集合Seg整理,对应于音频特征段得到音频特征段相同区域集合WSeg={Seg1(p,q),Seg2(p,q)…Segh(p,q)…SegLw(p,q)},其中Segh(p,q)即为p,q两音频特征段的第h段公共区域,h介于1到Lw之间,Lw为音频特征段相同区域集合的长度;
步骤5b,按照特征段集合Cp={cp1,cp2…cpi…cpLp}和Cp={cq1,cq2…cqj…cqLq}将特征段相同区域集合WSeg={Seg1(p,q),Seg2(p,q)…Segh(p,q)…SegLw(p,q)}进行排序,遍历WSeg,若Segs(p,q)和Segt(p,q)存在数据段上交叉,则将其合并,整理后得到新的特征段相同区域集合WSeg *={Seg1 *(p,q),Seg2 *(p,q)…Segh *(p,q)…SegLw *(p,q)};
步骤5c,遍历步骤10b中WSeg *={Seg1 *(p,q),Seg2 *(p,q)…Segh *(p,q)…SegLw *(p,q)},如满足下列条件则将其合并:
条件1:若存在Segs *(p,q)和Segt *(p,q)不相邻分别相隔1个特征段cpx、cqx,且Segs *(p,q)中音频p的特征段能量特征值为wps,音频q的能量特征段特征值为wqs,Segt *(p,q)中音频p的特征段特征值为wpt,音频q的特征段特征值为wqt,特征段cpx、cqx特征值为wpx、wqx;
条件2:若wps=wqs且wpt=wqt;
条件3;若wpx=wqx或|wpx-wqx|<T,T为阈值;
重复上述合并过程,直至不能合并为止,合并后得到的新的集合即为最简特征段相同区域集合WSeg’={Seg1’(p,q),Seg2’(p,q)…Segh’(p,q)…SegLw’(p,q)};
步骤5d,验证步骤5c中得到最简特征段相同区域集合WSeg’并对应到音频数据段得到连通区域集合Vres,则Vres即为音频中相同区域的集合;
所述步骤2b具体包括以下步骤:
步骤2ba,计算步骤2a中的向量D={Pi0,Pi1,Pi2…Pin…PiN}中特征点Pin的能量信息,记为energy,则Pin的能量信息为energy(Pin),energy(Pin)的计算公式如下:
其中P
in为向量D={P
i0,P
i1,P
i2…P
in…P
iN}第n点的数据,1≤i≤Lp,1≤n≤N,
为该特征段的平均数据值;
步骤2bb,计算步骤2a中的向量D={Pi0,Pi1,Pi2…Pin…PiN}中特征点Pin的过零点信息,记为none,则Pin的过零点信息为none(Pin),none(Pin)的计算公式如下:
其中Pin为向量D={Pi0,Pi1,Pi2…Pin…PiN}第n点的数据,1≤i≤Lp,1≤n≤N;
步骤2bc,根据音频的特征性质动态地设置权值α、β,使得能量信息和过零点信息按照比重影响特征值;
步骤2bd,计算步骤2a中的向量D={Pi0,Pi1,Pi2…Pin…PiN}的能量距离dis(N),dis(N)的计算公式如下:
dis(N)=γN
其中γ为与能量信息相关的参数,N为向量D={Pi0,Pi1,Pi2…Pin…PiN}的长度;
步骤2be,根据步骤2ba-2bd中每个Pin的能量信息energy(Pin),过零点信息none(Pin),能量距离dis(N)以及权值α、β按照步骤2b中的公式计算出特征段cpi的特征值wpi;
所述步骤2d具体包括以下步骤:
步骤2da,计算步骤2a中的向量D={Pj0,Pj1,Pj2…Pjm…PjN}中特征点Pjm的能量信息,记为energy,则Pjm的能量信息为energy(Pjm),energy(Pjm)的计算公式如下:
其中P
jm为向量D={P
j0,P
j1,P
j2…P
jm…P
jN}第m点的数据,1≤i≤Lp,1≤m≤N,
为该特征段的平均数据值;
步骤2db,计算步骤2a中的向量D={Pj0,Pj1,Pj2…Pjm…PjN}中特征点Pjm的过零点信息,记为none,则Pjm的过零点信息为none(Pjm),none(Pjm)的计算公式如下:
其中Pjm为向量D={Pj0,Pj1,Pj2…Pjm…PjN}第m点的数据,1≤i≤Lp,1≤m≤N;
步骤2dc,根据音频的特征性质动态地设置权值α、β,使得能量信息和过零点信息按照比重影响特征值;
步骤2dd,计算步骤2a中的向量D={Pj0,Pj1,Pj2…Pjm…PjN}的能量距离dis(N),dis(N)的计算公式如下:
dis(N)=γN
其中γ为与能量信息相关的参数,0≤γ≤1,N为向量D={Pj0,Pj1,Pj2…Pjm…PjN}的长度;
步骤2de,根据步骤2ba-2bd中每个Pin的能量信息energy(Pin),过零点信息none(Pin),能量距离dis(N)以及权值α、β按照步骤2d中的公式计算出特征段cqj的特征值wqj;
所述步骤4b具体包括以下步骤:
步骤4ba,为步骤4a中的特征值向量Wp={wp1,wp2…wpi…wpLp}建立后缀数组SWp,它保存1-Lp的某个排列,SWp={SWp1,SWp2…SWpi…SWpLp},保证suffix(wp[i])<suffix(wp[i+1])suffix为从i位置开始到整个序列结尾的一个子序列,其中suffix(wp[i])=Wp[i-Lp];同样为特征值向量Wq={wq1,wq2…wqj…wqLp}建立其后缀数组SWq={SWq1,SWq2…SWqj…SWqLq};
步骤4bb,计算步骤4ba中的后缀数组SWp={SWp1,SWp2…SWpi…SWpLp}计算其对应位置的height值,即得到一个名次数组RankWp,RankWpi的计算公式如下:
RankWpi=No(suffix(wpi))
其中No为排名函数,suffix(wpi)为对应i位置的后缀数组;同样为步骤4ba中的后缀数组SWq={SWq1,SWq2…SWqj…SWqLq}计算名次数组RankWq;
步骤4bc,按照RankWp和RankWq的值分组,快速统计每组中后缀之间的最长公共前缀之和,求两个后缀的最长公共前缀可以转化为某个区间上的最小值问题,即RMQ(Range Minimum Query)问题;
步骤4bd,扫描步骤4a中的Vw{wp1,wp2…wpi…wpLp,NA,wq1,wq2…wqj…wqLq},每遇到一个SWqj后缀就统计与前面的SWp={SWp1,SWp2…SWpi…SWpLp}的后缀能产生多少个长度不小于k的公共子串,k为设定的最小检索长度,这里SWp={SWp1,SWp2…SWpi…SWpLp}的后缀需要用一个单调的栈来高效的维护;
步骤4be,计算SWp={SWp1,SWp2…SWpi…SWpLp}的所有suffix(wpi)后缀和SWq={SWq1,SWq2…SWqj…SWqLq}的所有suffix(wqj)后缀之间的最长公共前缀的长度,把最长公共前缀长度不小于k的部分全部加起来,得到一个公共子序列集合;
有益效果:本发明的显著优点是比较方法具有很好的效率并且比较结果具有很高的精度。具体而言,本发明将分别从算法的精度和效率方面来阐述:(1)算法的精度保证:采用多重特征来对音频文件提取特征,从音频采样数据,音频波形性质以及能量矩阵的方法多尺度的提取特征,提高比较精度。(2)算法的效率保证:本发明采用了GPU上的CUDA大大加速了比较速度,将原本的NP问题在短时间实时解决,可以很好满足工业级别的运用。因此,本发明能更好地保证检索的效率,满足实时响应的需求。
附图说明
下面结合附图和具体实施方式对本发明做更进一步的具体说明,本发明的上述或其他方面的优点将会变得更加清楚。
图1为本发明方法的流程图。
图2为本发明实施例的流程图。
图3变形的后缀数组查找公共子串算法的流程图。
具体实施方式:
如图1所示,音频显示和检索装置从音频存储设备获取数字音频,假设音频存储设备存储了若干段音频,装置同时接受Num(Num≤16)段音频,然后装置生成音频的波形特征显示,并提供播放功能,用户在Num段音频中任选两段音频作为比较对象,装置生成音频的特征表示,使用采用多重特征(音频采样数据,音频波形性质以及能量矩阵)表示,这样每段音频有一个特征值向量表示,通过后缀数组算法得出比较结果并验证。
如图2所示,音频快速比较部分包括以下步骤:
步骤1,将待比较的音频p和音频q,分别按照其音频的长度划分出长度相等的两组音频数据特征段,其中音频p划分为特征段集合Cp,Cp={cp1,cp2…cpi…cpLp},音频q划分为特征段集合Cq,Cq={cq1,cq2…cqj…cqLq},其中cpi表示特征段集合Cp中第i个音频数据特征段,1≤i≤Lp,Lp为特征段集合Cp的长度,cqj特征段集合Cq中第j个音频数据特征段,1≤j≤Lq,Lq为特征段集合Cq的长度,因为音频是无损音频,所以其每秒采样值数目比较大,通常都为每秒48000个采样点(即特征点),如音频p有8000个采样数据,音频q有6000个采样数据,则将p,q划分成长度为100个采样点的音频数据特征段,则音频p有80个音频数据特征段,每个音频数据段有100个特征点,音频q有60个音频数据特征段,每个音频数据特征段有100个特征点;
步骤2,将音频p的特征段集合Cp和音频q的特征段集合Cq中每个特征段中的音频数据导入到GPU上并行计算,得到音频p的特征段集合Cp的能量特征值序列Wp和音频q的特征段集合Cq的能量特征值序列Wq;
步骤3,将音频p的能量特征值序列Wp和音频q能量特征值序列Wq通过差值方法构建出一个Lp行Lq列能量矩阵Mat,其中Wp={wp1,wp2…wpi…wpLp},Wq={wq1,wq2…wqj…wqLq},即将Wp中wp1作为与Wq={wq1,wq2…wqj…wqLq}中的每一个能量特征值做差值后作为一行,同理为wp2,wp3…wqLq中的每一个能量特征值都做差值得到对应行,组合后即得到Lp行Lq列能量矩阵Mat,Mat如下所示:
步骤4,利用变形的后缀数组查找公共子串算法,查找出步骤3中所得的能量特征值序列Wp和能量特征值序列Wq中的公共部分,公共部分即是音频p和音频q相同区域段落的集合Seg;
步骤5,将能量矩阵Mat中元素数值小于设定阈值的区域连通,得到连通区域集合Vres,阈值取值范围为0~1的实数,数值越小,音频比较的精度越高;
步骤6,将步骤5中所得的连通区域集合Vres作为结果,用波形表示;
步骤7,结束。
所述步骤2具体包括以下步骤:
步骤2a,将步骤1中所得到特征段cpi中的特征点组成一个长度固定为N的向量D={Pi0,Pi1,Pi2…Pin…PiN},1≤i≤Lp,1≤n≤N,基于并将向量D通过CUDA的cudamalloc函数加载到GPU内存中,合理设置线程块block和线程thread,使得该设置动态最优的适合于向量D={Pi0,Pi1,Pi2…Pin…PiN};
步骤2b,将计算向量D={Pi0,Pi1,Pi2…Pin…PiN}的特征值wpi的过程分布到每个线程上,特征值wpi的计算公式如下:
其中Pin为音频数据特征段cpi上的特征点,N为音频数据特征段cpi上的特征点的总数,0≤n≤N,α、β为设定的权值,α+β=1,0≤α≤1,0≤β≤1,α越大意味着该音频能量集中,β越大意味着该音频波动较大,energy(Pin)为音频数据特征段cpi中特征点的能量信息,none(Pin)为音频数据特征段cpi中特征点的过零点信息,dis(N)为音频数据特征段cpi的距离信息;
步骤2c,将步骤1中所得到特征段cqi中的特征点组成一个长度固定为N的向量D={Pj0,Pj1,Pj2…Pjn…PjN},1≤j≤Lq,1≤m≤N,基于并将向量D通过CUDA的cudamalloc函数加载到GPU内存中,合理设置线程块block和线程thread,使得该设置动态最优的适合于向量D={Pj0,Pj1,Pj2…Pjn…PjN};
步骤2d,将计算向量D={Pj0,Pj1,Pj2…Pjn…PjN}的特征值wqj的过程分布到每个线程上,特征值wqi的计算公式如下:
其中Pjm为音频数据特征段cqj上的特征点,N为音频数据特征段cqj上的特征点的总数,0≤m≤N,α、β为设定的权值,α+β=1,0≤α≤1,0≤β≤1,α越大意味着该音频能量集中,β越大意味着该音频波动较大,energy(Pjm)为音频数据特征段cqj中特征点的能量信息,none(Pjm)为音频数据特征段cqj中特征点的过零点信息,dis(N)为音频数据特征段cqj的距离信息。
步骤2e,步骤2b和步骤2d中得到的特征值数值范围不统一,我们将其归一到一个统一的尺度;
所述步骤4具体包括以下步骤:
步骤4a,将步骤3中的能量特征值序列Wp={wp1,wp2…wpi…wpLp}和能量特征值序列Wq={wq1,wq2…wqj…wqLq}(其中Lp、Lq分别为能量特征值序列的长度,1≤i≤Lp,1≤j≤Lq)结合起来,将能量特征值序列中数值设为一个字符,构建一个字符序列Vw={wp1,wp2…wpi…wpLp,NA,wq1,wq2…wqj…wqLq},其中NA为隔断标记;
步骤4b,分别为步骤4a中能量特征值序列Wp={wp1,wp2…wpi…wpLp}和音频q能量特征值序列Wq={wq1,wq2…wqj…wqLq}构建后缀数组,基本思路是计算Wp的所有后缀和Wq的所有后缀之间的最长公共前缀的长度,把最长公共前缀长度不小于k的部分全部加起来,k为设定的最小检索长度。扫描字符序列Vw={wp1,wp2…wpi…wpLp,NA,wq1,wq2…wqj…wqLq},每遇到一个Wq的后缀就统计与前面的Wp的后缀能产生多少个长度不小于k的公共子串,这里Wp的后缀需要用一个单调的栈来高效的维护;
步骤4c,将步骤4b中返回的公共子串集合按照位置对应关系得出特征值向量Wp={wp1,wp2…wpi…wpLp}和Wq={wq1,wq2…wqj…wqLq}中对应的公共序列集合Seq;
步骤4d,将步骤2c特征值向量Wp={wp1,wp2…wpi…wpLp}和Wq={wq1,wq2…wqj…wqLq}中公共序列集合Seq合并整理,将公共交叉的数据段落合并,将连续的部分整理连接得到公共段落集合Seq*;
所述步骤5具体包括以下步骤:
步骤5a,将步骤4中得到的相同区域的段落的集合Seg整理,对应于音频特征段得到音频特征段相同区域集合WSeg={Seg1(p,q),Seg2(p,q)…Segh(p,q)…SegLw(p,q)},其中Segh(p,q)即为p,q两音频特征段的第h段公共区域,h介于1到Lw之间,Lw为音频特征段相同区域集合的长度;
步骤5b,按照特征段集合Cp={cp1,cp2…cpi…cpLp}和Cp={cq1,cq2…cqj…cqLq}将特征段相同区域集合WSeg={Seg1(p,q),Seg2(p,q)…Segh(p,q)…SegLw(p,q)}进行排序,遍历WSeg,若Segs(p,q)和Segt(p,q)存在数据段上交叉,则将其合并,整理后得到新的特征段相同区域集合WSeg *={Seg1 *(p,q),Seg2 *(p,q)…Segh *(p,q)…SegLw *(p,q)};
步骤5c,遍历步骤10b中WSeg *={Seg1 *(p,q),Seg2 *(p,q)…Segh *(p,q)…SegLw *(p,q)},如满足下列条件则将其合并:
条件1:若存在Segs *(p,q)和Segt *(p,q)不相邻分别相隔1个特征段cpx、cqx,且Segs *(p,q)中音频p的特征段能量特征值为wps,音频q的能量特征段特征值为wqs,Segt *(p,q)中音频p的特征段特征值为wpt,音频q的特征段特征值为wqt,特征段cpx、cqx特征值为wpx、wqx;
条件2:若wps=wqs且wpt=wqt;
条件3;若wpx=wqx或|wpx-wqx|<T,T为阈值;
重复上述合并过程,直至不能合并为止,合并后得到的新的集合即为最简特征段相同区域集合WSeg’={Seg1’(p,q),Seg2’(p,q)…Segh’(p,q)…SegLw’(p,q)};
步骤5d,验证步骤5c中得到最简特征段相同区域集合WSeg’并对应到音频数据段得到连通区域集合Vres,则Vres即为音频中相同区域的集合;
所述步骤2b具体包括以下步骤:
步骤2ba,计算步骤2a中的向量D={Pi0,Pi1,Pi2…Pin…PiN}中特征点Pin的能量信息,记为energy,则Pin的能量信息为energy(Pin),energy(Pin)的计算公式如下:
其中Pin为向量D={Pi0,Pi1,Pi2…Pin…PiN}第n点的数据,1≤i≤Lp,1≤n≤N,为该特征段的平均数据值;
步骤2bb,计算步骤2a中的向量D={Pi0,Pi1,Pi2…Pin…PiN}中特征点Pin的过零点信息,记为none,则Pin的过零点信息为none(Pin),none(Pin)的计算公式如下:
其中Pin为向量D={Pi0,Pi1,Pi2…Pin…PiN}第n点的数据,1≤i≤Lp,1≤n≤N;
步骤2bc,根据音频的特征性质动态地设置权值α、β,使得能量信息和过零点信息按照比重影响特征值;
步骤2bd,计算步骤2a中的向量D={Pi0,Pi1,Pi2…Pin…PiN}的能量距离dis(N),dis(N)的计算公式如下:
dis(N)=γN
其中γ为与能量信息相关的参数,N为向量D={Pi0,Pi1,Pi2…Pin…PiN}的长度;
步骤2be,根据步骤2ba-2bd中每个Pin的能量信息energy(Pin),过零点信息none(Pin),能量距离dis(N)以及权值α、β按照步骤2b中的公式计算出特征段cpi的特征值wpi;
所述步骤2d具体包括以下步骤:
步骤2da,计算步骤2a中的向量D={Pj0,Pj1,Pj2…Pjm…PjN}中特征点Pjm的能量信息,记为energy,则Pjm的能量信息为energy(Pjm),energy(Pjm)的计算公式如下:
其中P
jm为向量D={P
j0,P
j1,P
j2…P
jm…P
jN}第m点的数据,1≤i≤Lp,1≤m≤N,
为该特征段的平均数据值;
步骤2db,计算步骤2a中的向量D={Pj0,Pj1,Pj2…Pjm…PjN}中特征点Pjm的过零点信息,记为none,则Pjm的过零点信息为none(Pjm),none(Pjm)的计算公式如下:
其中Pjm为向量D={Pj0,Pj1,Pj2…Pjm…PjN}第m点的数据,1≤i≤Lp,1≤m≤N;
步骤2dc,根据音频的特征性质动态地设置权值α、β,使得能量信息和过零点信息按照比重影响特征值;
步骤2dd,计算步骤2a中的向量D={Pj0,Pj1,Pj2…Pjm…PjN}的能量距离dis(N),dis(N)的计算公式如下:
dis(N)=γN
其中γ为与能量信息相关的参数,N为向量D={Pj0,Pj1,Pj2…Pjm…PjN}的长度;
步骤2de,根据步骤2ba-2bd中每个Pin的能量信息energy(Pin),过零点信息none(Pin),能量距离dis(N)以及权值α、β按照步骤2d中的公式计算出特征段cqj的特征值wqj;
所述步骤4b具体包括以下步骤:
步骤4ba,为步骤4a中的特征值向量Wp={wp1,wp2…wpi…wpLp}建立后缀数组SWp,它保存1-Lp的某个排列,SWp={SWp1,SWp2…SWpi…SWpLp},保证suffix(wp[i])<suffix(wp[i+1])suffix为从i位置开始到整个序列结尾的一个子序列,其中suffix(wp[i])=Wp[i-Lp];同样为特征值向量Wq={wq1,wq2…wqj…wqLp}建立其后缀数组SWq={SWq1,SWq2…SWqj…SWqLq};
步骤4bb,计算步骤4ba中的后缀数组SWp={SWp1,SWp2…SWpi…SWpLp}计算其对应位置的height值,即得到一个名次数组RankWp,RankWpi的计算公式如下:
RankWpi=No(suffix(wpi))
其中No为排名函数,suffix(wpi)为对应i位置的后缀数组;同样为步骤4ba中的后缀数组SWq={SWq1,SWq2…SWqj…SWqLq}计算名次数组RankWq;
步骤4bc,按照RankWp和RankWq的值分组,快速统计每组中后缀之间的最长公共前缀之和,求两个后缀的最长公共前缀可以转化为某个区间上的最小值问题,即RMQ(Range Minimum Query)问题;
步骤4bd,扫描步骤4a中的Vw{wp1,wp2…wpi…wpLp,NA,wq1,wq2…wqj…wqLq},每遇到一个SWqj后缀就统计与前面的SWp={SWp1,SWp2…SWpi…SWpLp}的后缀能产生多少个长度不小于k的公共子串,k为设定的最小检索长度,这里SWp={SWp1,SWp2…SWpi…SWpLp}的后缀需要用一个单调的栈来高效的维护;
步骤4be,计算SWp={SWp1,SWp2…SWpi…SWpLp}的所有suffix(wpi)后缀和SWq={SWq1,SWq2…SWqj…SWqLq}的所有suffix(wqj)后缀之间的最长公共前缀的长度,把最长公共前缀长度不小于k的部分全部加起来,得到一个公共子序列集合;如图3所示,给出了用本发明的方法进行相关测试的例子。用于测试的硬件环境是:Intel-Xeon 56202.66GHz16G内存和Nvidia GTX440显卡。软件环境是QT Creator、Centos4.5以及CUDAtoolkit4.0。本发明用C++语言实现了本发明提出的方法。测试音频来源于Disney。本发明从中抽取了1组音频数据进行了测试。由图3可见,本发明的方法具有很高的比较精度。
本发明提供了一种音频比较方法的思路及方法,具体实现该技术方案的方法和途径很多,以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。本实施例中未明确的各组成部分均可用现有技术加以实现。