《武汉工程大学学报》  2018年02期 208-213   出版日期:2018-05-17   ISSN:1674-2869   CN:42-1779/TQ
基于自相关函数的钢琴乐音改进识别算法


钢琴乐音信号是由基音及泛音共同组成的,而决定其音高的是基音,因此基音周期的检测是钢琴音符识别的关键所在[1-2]。基音周期的检测的方法主要包括频域识别和时域识别,短时自相关法是一种经典的时域检测算法,它计算简单,应用广泛,但是该算法会发生基音倍频或半频错误。在此基础上,在计算自相关函数前进行三电平中心削波运算是一种经典的改进算法[3-5]。由于该运算去除了各个音符能量相对集中在中心区域的部分,保留了在峰值附近的能量,因而可以减少计算量,加快运算速度,同时,在一定程度上避免上述错误的发生,进而提高识别率,但是,这种算法仍然有一定的局限性。为抑制高次谐波的干扰,文献[6]提出进行两次三电平中心削波和自相关处理,但这种方法增加了计算量,不适于快速计算的应用场景。此外,在用自相关法估计基音周期时,会发生帧间基音周期跳跃的现象,并且识别过程会受到半频点、倍频点和随机错误点的干扰,对于这些问题前期工作者提出了各种平滑滤波算法[7-9],其目的就是过滤掉各种干扰点。文献[10]提出将插零算法以及相应的低通滤波器应用于三电平削波的自相关法。文献[11]提出将三电平中心削波自相关函数与循环均值幅度差分函数相结合。上述算法在处理节奏较为缓和的乐曲时,可以达到较为满意的识别率,但是在处理节奏较快的乐曲时,识别率会迅速下降。本文提出了帧移自相关函数法,目的是在更小尺度上寻找最大自相关函数,以适应快节奏乐曲,因而一定程度上避免了传统算法对快节奏乐曲的漏检、误检或识别错误等情况发生,进而可以显著提高识别准确率。1 三电平中心削波的自相关函数假设[zi(x)]是乐音信号的时间序列[w(t)]加窗分帧后的第[i]帧信号,其中下标[i]表示第[i]帧,设每帧帧长为[N]。[zi(x)]的短时自相关函数定义为: [Ri(k)=m=1N-myi(m)y′i(m+k)] 式中,[k]是时间的延迟量。短时自相关函数具有如下性质:1)如果[zi(x)]是周期信号,周期是[P],则[Ri(k)]也是周期信号,且周期相同,即有 [Ri(R)=Ri(R+P)] 2)当[k=0]时,短时自相关函数具有最大值,即在延迟量为[0],[±P],[±2P],[?]时,周期信号的自相关函数也达到最大值。3)短时自相关函数是偶函数,即[Ri(k)=Ri(-k)]。短时自相关函数法基音检测的主要原理都是利用短时自相关函数的这些性质,通过比较原始信号与它延迟后的信号之间的类似性来确定基音周期的。如果延迟量等于基音周期,两个信号就具有最大类似性;或是直接找出短时自相关函数的两个最大值间的距离,作为基音周期的初估值。[CL]是削波电平,中心削波函数[C[zi(x)]]的数学关系式为:[C[zi(x)]=zi(x)-CL?zi(x)>CL0??????|zi(x)|CLzi(x)+CL?????zi(x)<-CL] (1)三电平中心削波法的输入输出函数为:[y′i(x)=C′[zi(x)]=1??zi(x)>CL0??|zi(x)|CL-1????zi(x)<-CL] (2)即削波器的输出[y′i(x)]在[zi(x)>CL]时为[1], [zi(x)<-CL]时为[-1],其余为[0]。按文献[7]的介绍,[CL]的取法是取[zi(x)]前部100个样点和后部100个样点的最大幅度,从中取较小者,并乘以[0.68]作为门限电平[CL]。按式(1)得到的中心削波输出[yi(x)]:[yi(x)=C[zi(x)]=zi(x)-CL?zi(x)>CL0???????|zi(x)|CLzi(x)+CL?????zi(x)<-CL]与按式(2)得到三电平削波输出[y′i(x)]求自相关函数: [Ri(k)=m=1N-myi(m)y′i(m+k)] (3)其中,[y′i(x)]的取值只有[1],[0]和[-1]三种,所以式(3)中只有加(减)法,在实际运算中节省了大量时间,为实时运算创造了条件。2 改进的自相关函数基音提取算法若对音频序列[w(t)]端点检测,每个端点在原序列的起始位置记为[S(i),(i=1,2,?,n)]。经过准确的音符分割[12-13]后,认为一个端点对应一个基本音符的起始点,设[T(i)]为原音频序列中第[i]个音符的基音周期,由音乐的短时平稳性,将区间[s(i)=][w[S(i),S(i)+l]]按定长窗计算自相关函数,其中窗长[l]=409 6。理论上认为,第一个最大自相关函数对应的位置,即为基音的周期。由式(3)可得[seg(i)]的自相关函数为:[Ri(x),corr(s(i)),(x=1,2,?,l)]取[Ri(x)]最大值[Ri,max(x)=max(Ri(x))],理想状况下,约70%音符的数据帧在经过三电平削波和自相关函数计算后的波形图符合如下规律:[Ri,max(x)]所在的点[Pi,max]与首个峰值点[Pi(1)]重合,如图1所示,首个峰值点1与最大峰值点3为同一个点,在此情形下可得基音周期[T(i)=Ii(1)]。少数情况下,信号受到共振峰的影响,会出现倍频波干扰,即出现[Pi,max]与[Pi(1)]分离的现象。为消除此影响,首先需要选取合适的峰值点。图2显示了钢琴曲“致爱丽丝”(For Elise)的第11个音符E4的数据帧在经过三电平削波和自相关函数计算后的波形图,第二个峰值点2与最大峰值点3是同一个点。设阈值[Hi,min=Ri,max(x)/k1],其中[k1]为一常量。记录满足条件[Ri(x)>Hi,min]的峰值序列[Pi(j)]与对应于[Ri(x)]的序号[Ii(j)],即[Ri(Ii(j))=Pi(j)]。[k1]的取值需要保证[Pi(j)]不包含图2中幅值过小的峰值点1,同时也要包含幅值较大且可能正确的峰值点2。因此,峰值点2的幅值为[Pi(1)],序号为[Ii(j)];峰值点3的幅值为[Pi,max],序号为[Ii,max]。在本文中阈值[k1]=2。为选出正确的峰值点,还需要进行进一步阈值判断。取最大峰值点与首个峰值点的幅值比[CR=Pi,max/Pi(1)]。图3显示了钢琴曲“梦中的婚礼”(MARIAGE D’AMOUR)的第35个音符D5的数据帧在经过三电平削波和自相关函数计算后,数据帧平移前后波形对比图。经过计算可得图3(a)、3(b) 中的幅值比分别为[CR,1]=1.66,[CR,2]=1.36,由此可见,当数据帧进行平移后,[CR]的值会发生变化。在本文中,数据帧平移指的是使选取的信号区间上界与下界都增加64,即平移后的信号区间[s(i)=w[S(i)+64,][S(i)+l+64]]。对数据帧进行多次平移后,可以发现其幅值比在一定范围内波动,如图4所示,将上述数据帧进行8次平移得到幅值比序列[CR(b)]。设阈值[k2]为一常量,分别统计[CR(b)>k2]的个数[n1]与[CR(b)n1],认定[T(i)=Ii(1)];若[n1>n2],则认定[T(i)=Ii,max]。[k2]的值对统计结果有直接影响,经过多首乐曲的调整,取[k2]=1.43结果较为理想。3 结果与讨论所用乐音数据文件由软件EveryonePiano根据曲谱合成,并通过立体声混音内录钢琴曲谱的右手演奏部分得到,其中软件所用音源为mdaPiano。由音乐基础理论可知,音符[i]的标准频率[14] [F(i)=fa1*2n12],其中[fa1=440]为第一国际高度,[n]为音[i]到音[a1]间隔的半音数目,当音[i]比音[a1]低时[n]取负数。若经第二节算法计算得出基音周期为[T(i)],则相应的基音频率为[F′(i)=fs/T(i)],其中[fs]表示乐曲采样频率。音分[15]偏差定义为[O(i)=logk(F′(i)/F(i))],其中[k=21200]。令集合[U=x|-50