張 巖, 劉 哲
(沈陽(yáng)師范大學(xué) 計(jì)算機(jī)與數(shù)學(xué)基礎(chǔ)教學(xué)部, 沈陽(yáng) 110034)
旋律通常指若干樂(lè)音經(jīng)過(guò)藝術(shù)構(gòu)思而形成的有組織、節(jié)奏的序列。國(guó)際音樂(lè)信息檢索測(cè)評(píng)(music information retrieval evaluation eXchage,MIREX)將旋律定義為對(duì)應(yīng)顯著性人聲或樂(lè)器中感知音高的基頻值序列[1]。音樂(lè)學(xué)中,按照音樂(lè)作品旋律線的數(shù)量,將音樂(lè)分為單聲部音樂(lè)和多聲部音樂(lè)[2]。單聲部音樂(lè)指同一時(shí)刻只有一個(gè)音符發(fā)音,如獨(dú)唱、管樂(lè)器的獨(dú)奏、演奏單旋律的弦樂(lè)器獨(dú)奏等。單旋律提取是以單聲部音樂(lè)為對(duì)象,對(duì)旋律的音高和時(shí)值等主要特征進(jìn)行提取。單旋律提取可以應(yīng)用于作曲創(chuàng)作、音準(zhǔn)分析和校正、音樂(lè)檢索和音樂(lè)情感分析等,因此具有重要的研究和應(yīng)用價(jià)值。
當(dāng)發(fā)音體由于震蕩而發(fā)出音時(shí),每個(gè)音不僅僅包括基頻正弦波的基音,還同時(shí)包括許多頻率較高的正弦波的泛音[3]。復(fù)合波也是一種周期性的振動(dòng)波[4],其振幅由基音的振幅和各組泛音的振幅重疊而成。根據(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)。音列中樂(lè)音i的標(biāo)準(zhǔn)頻率公式為F(i)=fa1·2(n/12),其中fa1=440為第一國(guó)際高度,n為樂(lè)音i到a1間隔的半音數(shù)目,當(dāng)樂(lè)音i比音a1低時(shí),n取負(fù)數(shù)[5]。
時(shí)頻域分析是將時(shí)域與頻域的處理方式結(jié)合起來(lái),將信號(hào)分割成為時(shí)間幀,將時(shí)間幀內(nèi)的信號(hào)進(jìn)行時(shí)頻變換,分析信號(hào)在時(shí)間域內(nèi)的頻譜特征[6]。短時(shí)傅里葉變換(short time Fourier transform, STFT)把整個(gè)時(shí)域過(guò)程分解成無(wú)數(shù)個(gè)等長(zhǎng)的小片段,每個(gè)小片段近似平穩(wěn),再對(duì)時(shí)間窗的信號(hào)進(jìn)行傅里葉變換(Fourier transform,FT)以獲得具體在哪個(gè)時(shí)間點(diǎn)上出現(xiàn)了什么頻率[7]。STFT的頻率分辨率和時(shí)間分辨率是由加窗的窗口長(zhǎng)度決定的,頻率分辨率隨窗長(zhǎng)的加長(zhǎng)而提高,時(shí)間分辨率隨窗長(zhǎng)的縮短而提高。頻率分辨率就是在頻率上將各次諧波分開(kāi)的能力指標(biāo),時(shí)間分辨率就是在時(shí)間上將樂(lè)音分開(kāi)的能力指標(biāo)。顯然,STFT窗口長(zhǎng)度固定不變的變換方式造成了時(shí)間分辨率和頻率分辨率的矛盾。為了解決這個(gè)矛盾,對(duì)音樂(lè)信號(hào)加窗后,采用常Q變換(constant Q transform, CQT)代替FT。
設(shè)有限長(zhǎng)離散信號(hào)X(n),n=0,1,…,N-1,離散傅里葉變換(discrete Fourier transform, DFT)得到的X(k)的公式為
(1)
從離散傅里葉變換公式能夠直觀看出,X(k)是X(n)的一種近似表示,是單位頻帶的頻譜值;任何周期信號(hào)都可以分解為直流分量、基頻分量(k=0)和k次諧波分量。當(dāng)然,實(shí)際中通常采用快速傅里葉變換(fast Fourier transform, FFT)來(lái)提高運(yùn)行效率。
與傅里葉變換不同的是,CQT的中心頻率是按指數(shù)規(guī)律分布的,并且中心頻率與帶寬比為常量Q。CQT頻譜的橫軸頻率不是等間距的線性分布,而是計(jì)算log2的對(duì)數(shù)頻率的不等間距分布。
若定義常量Q為中心頻率與帶寬的比值,則常量Q的計(jì)算公式為[8]
(2)
其中:fk是音樂(lè)信號(hào)在變換頻譜內(nèi)的第k個(gè)頻率分量,稱為中心頻率;δfk是相鄰半音的頻率間隔,稱為帶寬,在信號(hào)處理時(shí)決定著頻率分辨率(或頻率解析度)。
(3)
其中:f0是所處理的音頻信號(hào)的最低頻率;b是一個(gè)八度的頻率范圍內(nèi)所包含的頻譜線數(shù)[9]。一般情況下,b可以取值為12,24或36。若b=36,表示一個(gè)八度內(nèi)有36條頻譜線,即36個(gè)頻率分量,每個(gè)半音有3條頻率分量。
(4)
根據(jù)頻率解析度的定義,可以得出窗長(zhǎng)Nk,Nk的計(jì)算公式為
(5)
其中:fs是采樣頻率;fk是音樂(lè)信號(hào)在變換頻譜內(nèi)的第k個(gè)頻率分量(中心頻率)。
由于樂(lè)音信號(hào)的頻率是按照指數(shù)規(guī)律分布的,所以CQT的頻率分辨率能夠與樂(lè)音的十二平均律相匹配,通過(guò)計(jì)算音樂(lè)信號(hào)的CQT譜,可以直接得到音樂(lè)信號(hào)在各個(gè)半音頻率分量處的頻譜值。根據(jù)以上計(jì)算過(guò)程,可以得出第k個(gè)頻率分量的頻譜值為
(6)
其中:x(n)是時(shí)域信號(hào);wNk(n)是長(zhǎng)度為Nk的窗函數(shù),可以是矩形窗或漢明窗等;k是CQT譜的頻率序號(hào);Q是CQT的常數(shù)[11]。
由上面分析可知,CQT對(duì)于低頻率的樂(lè)音信號(hào)可以獲得良好的頻率分辨率,而對(duì)于高頻率的樂(lè)音信號(hào)可以獲得良好的時(shí)間分辨率。對(duì)于低頻分量,窗長(zhǎng)較長(zhǎng);對(duì)于高頻分量,窗長(zhǎng)則較短。
在MATLAB中,可以使用fft函數(shù)實(shí)現(xiàn)快速傅里葉變換,從而求得該單個(gè)樂(lè)音的基頻。這里以采樣頻率為44 100 Hz的單旋律小提琴曲為樣本進(jìn)行分析。通常情況下,小提琴A弦頻率標(biāo)準(zhǔn)是440 Hz(對(duì)應(yīng)鋼琴的a1),G弦頻率標(biāo)準(zhǔn)是196 Hz(對(duì)應(yīng)鋼琴的g),D弦頻率標(biāo)準(zhǔn)是293.66 Hz(對(duì)應(yīng)鋼琴的d1),E弦頻率標(biāo)準(zhǔn)是659.25 Hz(對(duì)應(yīng)鋼琴的e2)[12]。因?yàn)樾√崆俚念l率范圍為196~987.76 Hz,所以對(duì)低于175 Hz(約低于最低音2個(gè)半音)或者高于1 100 Hz(約高于最高音2個(gè)半音)范圍內(nèi)的噪聲頻率分量直接置零,以免造成窗長(zhǎng)過(guò)長(zhǎng)或過(guò)短的問(wèn)題。
根據(jù)采樣定理,FFT能分辨的最高頻率為采樣頻率的一半(即Nyquist頻率),函數(shù)fft返回值是以Nyqusit頻率為軸對(duì)稱的[13]。通過(guò)對(duì)fft函數(shù)求得的第一幀頻譜的分析,前25個(gè)采樣點(diǎn)就可以獲得樂(lè)音的基頻和主要諧波頻率。依據(jù)前25個(gè)采樣點(diǎn),繪制如圖1所示的莖狀圖。其中序號(hào)13的點(diǎn)是振幅最大值點(diǎn),根據(jù)采樣點(diǎn)頻率的計(jì)算公式(n-1)·44 100/N(其中n表示采樣點(diǎn)序號(hào),n=1,…,N),計(jì)算基頻的頻率為(13-1)×44 100/1 024=516.8 Hz。
下面采用CQT算法分析樂(lè)音的基頻。取b=12,Q=16.82,則第一幀的窗長(zhǎng)Nk=Q·fs/fk=16.82×44 100/516.8=1 435.3,所以窗長(zhǎng)可以取1 436個(gè)點(diǎn)。在MATLAB中,使用spectrogram函數(shù)對(duì)單樂(lè)音信號(hào)進(jìn)行STFT分析。在spectrogram函數(shù)的參數(shù)中:window代表加窗函數(shù),由主程序傳遞給spectrogram函數(shù),這里采用Haming窗; nfft代表窗長(zhǎng)的點(diǎn)數(shù),也就是FFT的點(diǎn)數(shù),一般為幀移的2倍,這里采用1 436;noverlap代表幀移,即重復(fù)點(diǎn)數(shù),這里采用718;X代表音樂(lè)信號(hào);fs代表樂(lè)音信號(hào)生成離散信號(hào)時(shí)的采用頻率,這里從音樂(lè)數(shù)字文件的基本信息直接獲取的是44 100 Hz。繪制的CQT時(shí)頻圖(也稱語(yǔ)譜圖)經(jīng)過(guò)放大和中心移位后的效果如圖2所示。
圖2 CQT獲得的樂(lè)曲第一幀信號(hào)的時(shí)頻圖Fig.2 Spectrum of first frame of music signal obtained by CQT
圖2中能量最大的頻率區(qū)域?qū)?yīng)的就是基頻所在區(qū)域,該樂(lè)音的基頻范圍是510~540 Hz;從spectrogram函數(shù)獲得的S能量最大的F頻率分量是522.08。因?yàn)?40×1.059 4633=523.25,考慮到存在誤差等情況,推斷基音頻率是523.25 Hz。從spectrogram函數(shù)也可以獲得S能量最大的F頻率分量所對(duì)應(yīng)的時(shí)間點(diǎn)。因此,CQT算法能夠獲得更加準(zhǔn)確的基頻和時(shí)間點(diǎn)等特征,有利于樂(lè)曲的旋律特征的提取。
算法的基本思想是將源信號(hào)的時(shí)間片段分幀,以幀為單位,轉(zhuǎn)換成一個(gè)基于該時(shí)間幀的頻譜圖,然后依次將所有的分幀做相同的處理,就形成了時(shí)間軸上的時(shí)頻圖。時(shí)頻圖的橫軸坐標(biāo)為時(shí)間,縱軸坐標(biāo)為頻率,坐標(biāo)值的明暗度為振幅值。具體算法流程如下:
1) 以1 024點(diǎn)為幀長(zhǎng),利用fft函數(shù)進(jìn)行變換,獲得基音頻率fk。對(duì)超出正常樂(lè)音頻率范圍內(nèi)的噪聲,通過(guò)振幅置零的辦法去除。
2) 利用CQT方法,在b=12,Q=16.82和已經(jīng)獲得的基音頻率fk的條件下,計(jì)算第i幀加Hamming窗函數(shù)的窗長(zhǎng)Nk(i)和重疊點(diǎn)數(shù)noverlap等。
3) 以計(jì)算得到的窗長(zhǎng)和重疊點(diǎn)數(shù)為參數(shù)對(duì)信號(hào)重新動(dòng)態(tài)分幀。
4) 利用spectrogram函數(shù)對(duì)每一幀進(jìn)行STFT分析,獲得能量最大值對(duì)應(yīng)的基頻和采樣點(diǎn)序號(hào)等信息。第一幀的采樣點(diǎn)序號(hào)為1,以后各幀的采樣點(diǎn)序號(hào)TZ(i)=TZ(i-1)+Nk(i-1)/2。
5) 計(jì)算每幀的起始時(shí)間點(diǎn),即時(shí)間點(diǎn)t=采樣點(diǎn)起始序號(hào)/44 100[14]。
6) 根據(jù)基頻和采樣點(diǎn)起始序號(hào)或者基頻和每幀的起始時(shí)間點(diǎn),繪制樂(lè)曲的旋律階梯圖[15]。
選取整首小提琴曲的前100幀進(jìn)行基頻和采樣點(diǎn)起始序號(hào)的提取, 提取結(jié)果如表1所示。對(duì)于各個(gè)幀提取的基頻,可以根據(jù)情況和實(shí)際需要進(jìn)行音準(zhǔn)的修正。例如,第17,19和第26幀,頻率為689.06,而689.06不是誤差范圍之內(nèi)的樂(lè)音頻率,判斷存在噪聲,可以取鄰近值進(jìn)行修正。
表1 單旋律小提琴曲前100幀的基頻和采樣點(diǎn)起始序號(hào)Table 1 f0 and starting sequence number of sampling point in the first 100 frames of single melody violin music
將基頻和采樣點(diǎn)起始序號(hào)換算為基頻和起始時(shí)間點(diǎn),在頻率軸和時(shí)間軸上繪制的樂(lè)曲前100幀的旋律階梯圖如圖3所示。
圖3 樂(lè)曲前100幀的旋律階梯圖Fig.3 Melody ladder diagram of the first 100 frames of music signal
采用CQT算法,對(duì)于低頻分量,窗長(zhǎng)較長(zhǎng),截取的信號(hào)也較長(zhǎng),CQT變換后所獲得頻譜的頻率分辨率較高;對(duì)于高頻分量,窗長(zhǎng)較短,截取的信號(hào)也較短,CQT變換后所獲得頻譜的時(shí)間分辨率較高[16]。以單旋律小提琴樂(lè)曲為樣本,小提琴A弦頻率440 Hz為標(biāo)準(zhǔn),與鋼琴相對(duì)應(yīng),小提琴的音域?yàn)樾∽纸Mg~小字3組a3,在樂(lè)器本身的音準(zhǔn)及采樣時(shí)的誤差范圍內(nèi),可以基本檢測(cè)出該樂(lè)曲的各幀基頻,如表2所示。
表2 單旋律小提琴的部分基頻檢測(cè)值與標(biāo)準(zhǔn)值、鋼琴琴鍵的對(duì)照Table 2 Comparison of partial f0 detection value of single melody violin with standard value and piano key
整首小提琴曲采樣點(diǎn)總數(shù)為501 700 7個(gè),取前100幀進(jìn)行旋律提取,共抽取125 118個(gè)采樣點(diǎn)(含重疊點(diǎn))。與基于YIN算法的樂(lè)器單旋律提取結(jié)果相比較,從算法效率來(lái)看,增多了22 718個(gè)采樣點(diǎn),說(shuō)明CQT動(dòng)態(tài)變化窗長(zhǎng)的算法可以明顯地提高旋律提取的效率;從提取的基頻與準(zhǔn)確值的對(duì)照來(lái)看,檢測(cè)值與準(zhǔn)確值更加接近,說(shuō)明CQT算法能更可靠地支持樂(lè)曲旋律的提取。當(dāng)然,本方法提取的旋律存在需要改進(jìn)的地方,主要是幀的采樣起始點(diǎn)和音符的起始點(diǎn)之間存在誤差的問(wèn)題,對(duì)此需要進(jìn)一步提取音符的起始點(diǎn)才可以實(shí)現(xiàn)對(duì)時(shí)間的準(zhǔn)確定位。
沈陽(yáng)師范大學(xué)學(xué)報(bào)(自然科學(xué)版)2021年5期