張 巖, 王 偉
(沈陽師范大學(xué) 計(jì)算機(jī)與數(shù)學(xué)基礎(chǔ)教學(xué)部, 沈陽 110034)
旋律通常指若干樂音經(jīng)過藝術(shù)構(gòu)思而形成的有組織、節(jié)奏的序列,其特征是按一定的音高、時(shí)值和音量構(gòu)成,并由具有邏輯因素的單聲部進(jìn)行。旋律的3個(gè)主要特征中,音高是最重要的。國際音樂信息檢索測(cè)評(píng)(Music Information Retrieval Evaluation Exchage,MIREX)將旋律定義為對(duì)應(yīng)顯著性人聲或樂器中感知音高的基頻值序列[1]。在旋律進(jìn)行中,由于音高走向的變化而形成的起伏線條,叫旋律線。音樂學(xué)中,按照音樂作品旋律線的數(shù)量,將音樂分為單聲部音樂和多聲部音樂。單聲部音樂指同一時(shí)刻只有一個(gè)音符發(fā)音,如獨(dú)唱、管樂器的獨(dú)奏、演奏單旋律的弦樂器獨(dú)奏等。多聲部音樂是指有2個(gè)或者更多的音符同時(shí)發(fā)聲的音樂,這些音符可以來源于不同的聲源,如歌聲、吉它或貝斯等,也可以來源于能同時(shí)發(fā)2個(gè)以上音的聲源,如鋼琴[2]。
單旋律提取是以單聲部音樂為對(duì)象,對(duì)旋律的音高和時(shí)值等主要特征進(jìn)行提取。從音樂信號(hào)中提取主旋律的方法主要分為3類:基于顯著性的方法、基于源分離的方法和基于機(jī)器學(xué)習(xí)的方法[3]。單旋律的提取側(cè)重所提取旋律的準(zhǔn)確性、高效性和可視性。從音樂復(fù)雜性和計(jì)算復(fù)雜性分析,為了實(shí)現(xiàn)旋律快速和實(shí)時(shí)的輪廓化,基于顯著性的方法比較適用。單旋律提取可以應(yīng)用于樂曲創(chuàng)作、音準(zhǔn)分析、調(diào)式分析等,因此具有重要的研究和應(yīng)用價(jià)值。
音高是由發(fā)音體發(fā)出的基本頻率決定的,基頻通常用F0表示。音高越高對(duì)應(yīng)的f0越大。當(dāng)發(fā)音體由于震蕩而發(fā)出音時(shí),每個(gè)音不僅僅包括基頻正弦波的基音,還同時(shí)包括許多頻率較高的正弦波的泛音[4],其中頻率最低的正弦波即為基音,而其他頻率較高的正弦波則為泛音?;羰菂^(qū)別音高的主要元素,泛音決定音色。復(fù)合波的振幅是由基音的振幅和各組泛音的振幅重疊而成,若振幅方向相同則相加;若振幅方向相反則須要相減。復(fù)合波也是一種周期性的振動(dòng)波[5]。音分為諧和音與不諧和音。諧和音指諧波(或諧波分量)的頻率是基頻的整數(shù)倍,當(dāng)然有許多樂器(如彈撥弦樂器)產(chǎn)生的音并不是完全諧和的。不諧和音和不完全諧和音都是樂音,音樂中的旋律等均由樂音構(gòu)成[6]。
音高檢測(cè)通常包括時(shí)域分析、頻域分析和時(shí)頻域分析。在時(shí)間域內(nèi)對(duì)信號(hào)進(jìn)行濾波、放大、統(tǒng)計(jì)特征計(jì)算、相關(guān)性分析等處理,統(tǒng)稱為信號(hào)的時(shí)域分析。頻域分析采用傅立葉變換將時(shí)域信號(hào)變換為頻域信號(hào),從頻域角度來了解信號(hào)的特征。時(shí)頻域分析是將時(shí)域與頻域的處理方式結(jié)合起來,它將信號(hào)分割成時(shí)間幀,進(jìn)行時(shí)頻變換,分析信號(hào)在時(shí)間域內(nèi)的頻譜的特征。針對(duì)單旋律提取的簡(jiǎn)單性,采取不用進(jìn)行時(shí)頻轉(zhuǎn)換的時(shí)域分析來進(jìn)行音高檢測(cè),以降低計(jì)算復(fù)雜度,提高實(shí)時(shí)應(yīng)用性。時(shí)域分析算法主要包括自相函數(shù)(Auto Correlation Function,ACF)算法和YIN算法。
YIN算法以自相關(guān)函數(shù)算法為基礎(chǔ)。對(duì)于樂曲數(shù)字化的有限離散信號(hào),若其長度為N,它的自相關(guān)函數(shù)Rx(k)定義為
(1)
其中k是時(shí)移參數(shù),顯然當(dāng)k=0時(shí)得到最大的R值,也就是信號(hào)與信號(hào)本身相似度最大[7]。自相關(guān)函數(shù)在基音周期的整數(shù)倍處取得最大值,計(jì)算2個(gè)相鄰的最大峰值間的距離,就可以估計(jì)出基音的周期,從而得到基音的頻率。
樂音信號(hào)復(fù)合波的大多數(shù)峰值并不能反映基頻的周期,而只有少數(shù)的峰值與基頻有關(guān)。為了強(qiáng)化反映基頻周期的峰值,減少諧波成分峰值的干擾,降低自相關(guān)算法的計(jì)算量,需要對(duì)音頻信號(hào)進(jìn)行中心削波處理。通常采用的三電平中心削波函數(shù)是
(2)
式(2)中,x(n)是原始樂音信號(hào),Cl是削波電平,y(n)是削波后的樂音信號(hào)[8]。一般地,削波電平是由樂音信號(hào)的峰值的固定百分比來確定的,可以取峰值幅度的60%~70%。
YIN算法可以一定程度地解決確定哪個(gè)峰值對(duì)應(yīng)的是基頻的峰值的問題。YIN函數(shù)的定義Dx(k)為[9]
(3)
公式(3)中,以信號(hào)差平方和函數(shù)代替了公式(1)中的信號(hào)積和函數(shù)。這樣,在信號(hào)周期整數(shù)倍數(shù)處,YIN函數(shù)值為幅度差平方和,并且取值均為零。很顯然,查找零值的時(shí)間效率要高于求最大值的時(shí)間效率。
利用YIN算法時(shí),考慮基頻提取的實(shí)時(shí)性,通過實(shí)驗(yàn)測(cè)試三電平中心削波對(duì)YIN算法效率的影響。具體測(cè)試了不同采樣點(diǎn)數(shù)量規(guī)模的情況下,只進(jìn)行YIN算法的運(yùn)行時(shí)間,以及先進(jìn)行三電平中心削波后進(jìn)行YIN計(jì)算的運(yùn)行時(shí)間,測(cè)試數(shù)據(jù)如表1所示,采樣點(diǎn)數(shù)為512時(shí)的YIN函數(shù)波形如圖1所示。實(shí)驗(yàn)結(jié)果表明,隨著處理的采樣點(diǎn)數(shù)的增加,三電平中心削波會(huì)一定程度地增加YIN算法的運(yùn)行時(shí)間;三電平中心削波減弱了YIN算法在信號(hào)周期處獲得零值或者近零值的顯著性,增加了獲取周期位置的復(fù)雜性。因此, YIN算法不必進(jìn)行自相關(guān)函數(shù)算法中的三電平中心削波處理。
圖1 樂音信號(hào)某512采樣點(diǎn)三電平中心削波后YIN波形
表1 YIN算法與三電平中心削波+YIN算法的運(yùn)行時(shí)間對(duì)比(單位: 秒)
以小提琴為例,從低到高的4根琴弦分別為E、A、D、G,標(biāo)準(zhǔn)的空弦音從低到高是g=196 Hz、d1=294 Hz、a1=440 Hz、e2=659 Hz,每把小提琴的實(shí)際頻率分布是不同的[10]。假設(shè)取最低頻率確定的分析幀長,當(dāng)分析幀幀長取128(1 024個(gè)采樣點(diǎn)的時(shí)間約為24 ms,128個(gè)采樣點(diǎn)的時(shí)間約為3 ms)時(shí),不能包含最低頻率的2個(gè)周期,經(jīng)過YIN算法實(shí)驗(yàn)證明,波形中包含1個(gè)最低點(diǎn),但是不能判斷該采樣點(diǎn)即是周期點(diǎn),所以需要擴(kuò)展分析幀長點(diǎn)數(shù);當(dāng)擴(kuò)展幀長點(diǎn)數(shù)為512時(shí),采樣時(shí)間約為12 ms,包含最低頻率的2個(gè)周期,波形出現(xiàn)了周期性的波動(dòng),如圖2所示。以上實(shí)驗(yàn)表明,512個(gè)點(diǎn)作為分析幀的幀長是適當(dāng)?shù)?依此也可以將分析幀的一半,即256個(gè)點(diǎn)作為幀移。
圖2 樂音信號(hào)某512個(gè)采樣點(diǎn)的YIN波形
從圖中的YIN函數(shù)波形來看,對(duì)于YIN算法理論上的零點(diǎn)存在2個(gè)實(shí)際的問題:
1)理論上應(yīng)該在信號(hào)周期處獲得零點(diǎn),但是由于采樣時(shí)未必能取到信號(hào)周期所在處的點(diǎn),所以只能從YIN函數(shù)值中獲得近零點(diǎn)。
2)當(dāng)時(shí)移k非常小的時(shí)候,Dx(k)的值也非常小,也往往小于周期處近零點(diǎn)的值。當(dāng)k=0時(shí),往往就是Dx(k)的零點(diǎn)或者是最接近零的近零點(diǎn),影響獲取正確的近零點(diǎn)。為了取消時(shí)移k非常小的影響,可以采用累積平均歸一化差分函數(shù),其公式為[11]
(4)
利用累積平均歸一化函數(shù),對(duì)于圖2中的采樣幀進(jìn)行處理,處理結(jié)果如圖3所示。顯然,經(jīng)過處理后,消除了時(shí)移非常小時(shí)的YIN函數(shù)值對(duì)提取近零點(diǎn)的影響。
圖3 樂音信號(hào)某512個(gè)采樣點(diǎn)的YIN累積平均歸一化波形
在Matlab環(huán)境中,讀入小提琴無伴奏的WAV樂曲文件,利用YIN算法提取該分析幀的基頻的周期,即采樣點(diǎn)序號(hào)。若經(jīng)算法計(jì)算得出基音周期為T(i),則相應(yīng)的基音頻率為F(i)=fs/T(i),其中fs表示樂曲采樣頻率[12]。Matlab代碼如下[13]:
[x1,fs,nbit]=audioread(′xtq.wav′); %fs為采樣頻率44.1kHz,nbit為采樣位數(shù)16,x1為讀取的歸一化后幅
%值[-1,1]之間的樂音信號(hào),共有采樣點(diǎn)數(shù)*2個(gè)數(shù)據(jù), 2表示雙聲道
[Row,Col]=size(x1); %采樣點(diǎn)數(shù)組的行數(shù)和列數(shù)
N=512; %確定分析幀的幀長點(diǎn)數(shù)
Ind=[];AM=[];Pitch=[];
for FM=1:200 %選取前200個(gè)分析幀
N1=256*(FM-1)+1; %某分析幀的起始采樣點(diǎn)序號(hào),幀移是256
N2=N1+1024-1; %某分析幀的終止采樣點(diǎn)序號(hào)
x2=x1(N1:N2,:);
D=[];Dn=[]; %以下3行是累積平均歸一化的初始化
Dn(1)=1;sumn=0;
for k=2:N %延遲N個(gè)點(diǎn)數(shù)
sum=0;
for j=1:N %YIN函數(shù)計(jì)算
sum=sum+(x2(j)-x2(j+k))*(x2(j)-x2(j+k));
end
D(k)=sum;
sumn=sumn+D(k); %以下2行是累積平均歸一化
Dn(k)=D(k)/(sumn/k);
end
[A,Pos]=min(Dn); %求第一個(gè)近零點(diǎn)
AM(FM)=A;
Ind(FM)=Pos; %求近零點(diǎn)的采樣點(diǎn)序號(hào)
Pitch(FM)=44100/Ind(FM); %求基頻
end
根據(jù)十二平均律,計(jì)量上將一個(gè)八度音程即2倍頻率之間分成12個(gè)音級(jí),每2個(gè)相鄰音級(jí)相差100音分(cent)。2個(gè)相鄰音級(jí)的頻率比是2(1/12)(約1.059 463)。2個(gè)相鄰音分的頻率比是2(1/1 200)(約1.000 577 79)[14]。音列中樂音i 的標(biāo)準(zhǔn)頻率公式為F(i)=fa1*2(n/12),其中fa1= 440為第一國際高度,n 為樂音i到a1間隔的半音數(shù)目,當(dāng)樂音i比音a1低時(shí),n取負(fù)數(shù)[15]。以前面的200個(gè)分析幀(幀長512點(diǎn),幀移256點(diǎn))提取的音高序列為例,提取的頻率和標(biāo)準(zhǔn)頻率之間存在偏差,表現(xiàn)為音級(jí)和音級(jí)之間不是準(zhǔn)確的2(n/12)的關(guān)系,進(jìn)一步通過消除偏離頻率嚴(yán)重的野點(diǎn)來修正提取的頻率。以fa1=440 Hz為基準(zhǔn),可以通過若干次的1.059 463的倍數(shù)來計(jì)算標(biāo)準(zhǔn)音級(jí)的頻率。對(duì)于某個(gè)音級(jí),可以通過若干次的1.000 577 79的倍數(shù)來計(jì)算音級(jí)的各個(gè)音分的頻率。如果是音準(zhǔn)檢測(cè),那么10個(gè)音分以內(nèi)的偏差下,可以認(rèn)定音級(jí);如果是提取旋律,那么50個(gè)音分以內(nèi)的偏差下,可以認(rèn)定音級(jí),或者結(jié)合提取頻率對(duì)應(yīng)的幀數(shù)來進(jìn)一步判斷,當(dāng)幀數(shù)少于2幀時(shí),可以認(rèn)定為野點(diǎn),否則可以進(jìn)行頻率修正,如表2所示。顯然,經(jīng)過修正后,可以提高樂音頻率提取的準(zhǔn)確度。
表2 提取頻率的修正方法