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