《Real-Time Chord Recognition of Musical Sound: A System Using Common Lisp Music》
此篇論文中在早年,描述了一種實(shí)時(shí)地從音樂(lè)的聲音信號(hào)中識(shí)別出和弦的方式。它的主要思路,是將連續(xù)的聲信號(hào)輸入煤墙,轉(zhuǎn)換成音樂(lè)中的十二平均律令哟,對(duì)應(yīng)到鋼琴中一個(gè)八度的鍵當(dāng)中担平,識(shí)別出和弦的每一個(gè)音尖飞。
核心算法與基本思路:
首先我們將輸入的聲音信號(hào)獲取進(jìn)來(lái)琉挖,轉(zhuǎn)換成一個(gè)離散傅立葉變換(DFT)的一個(gè)聲譜圖,之后我們將這個(gè)聲譜圖轉(zhuǎn)換成一個(gè)音級(jí)輪廓圖PCP(Pitch Class Profile)决摧。然后再根據(jù)準(zhǔn)備好的和弦模版與PCP進(jìn)行模式匹配亿蒸,最終得到根音以及最后的和弦類型。
一掌桩、DFT
關(guān)于傅立葉變換
傅里葉變換的主要作用是將基于時(shí)間-能量的時(shí)域圖轉(zhuǎn)化為基于頻率-能量的頻域圖边锁。它的本質(zhì)原理是將不規(guī)則的曲線分解為若干不同頻率正弦波的線性和。
下面這張圖能夠很直觀的表達(dá)這種變換關(guān)系
傅立葉變換根據(jù)下圖來(lái)劃分變換類型
首先波岛,此算法將輸入聲音信號(hào)流轉(zhuǎn)換為一個(gè)DFT圖茅坛,假設(shè)fs為采樣頻率,x(n)為N個(gè)采樣點(diǎn)中的第n個(gè)輸入聲信號(hào)片段则拷。那么DFT譜圖的公式如下贡蓖,其中k = 0,1,2...N-1,而我們的X(0)隔躲,X(1)...X(N/2 - 1)表達(dá)了我們的整個(gè)頻譜摩梧。
看到這個(gè)公式我們肯定會(huì)思考幾個(gè)問(wèn)題:
1物延、X(k)表達(dá)了什么宣旱?為什么X向量的個(gè)數(shù)與采樣點(diǎn)數(shù)相關(guān)?
2叛薯、公式里最難理解的e-2πikn/N表達(dá)了什么浑吟?根據(jù)之前的描述,不是應(yīng)該將正弦函數(shù)作為基的嗎耗溜?
3组力、如何將X(k)轉(zhuǎn)換成上述我們直觀看到的頻域圖?
第一個(gè)問(wèn)題
X(k)表達(dá)了fs * (k/N)頻率波的正弦系數(shù)抖拴。我們的問(wèn)題中關(guān)注到燎字,它所能表達(dá)的頻率與采樣的點(diǎn)數(shù)是相關(guān)的。這從道理上來(lái)說(shuō)是合理的阿宅,采樣的點(diǎn)越豐富(越詳細(xì))候衍,我們能描述越細(xì)致的頻率。
第二個(gè)問(wèn)題
我們?cè)诳吹礁盗⑷~變換原理時(shí)洒放,會(huì)想到的方法可能是構(gòu)造正余弦函數(shù)的線性和蛉鹿,并設(shè)計(jì)很多參數(shù),最后通過(guò)一些手段將參數(shù)求出來(lái)往湿。
其實(shí)這樣的思路本質(zhì)上是沒(méi)有什么問(wèn)題的妖异,我們的目標(biāo)也正是將函數(shù)拆解成若干正余弦函數(shù)的組合惋戏。有科學(xué)家發(fā)現(xiàn),所有的周期函數(shù)他膳,都可以使用sin和cos函數(shù)的加減組合而成响逢。
那么下面的問(wèn)題是,如果我們?cè)瘮?shù)的周期是T棕孙,那么如何保證組合出來(lái)的函數(shù)周期也為T呢龄句?
假如sin(x)的周期是2π,那么sin(2x)的周期也為2π(雖然最小周期是π)散罕。更一般的分歇,如果f(x)的周期為T,那么下式的周期也為T欧漱。所以對(duì)這些函數(shù)的加減职抡,可以保證組成的函數(shù)一定周期也為T。
接下來(lái)误甚,對(duì)三角函數(shù)振幅進(jìn)行一些調(diào)整缚甩,再對(duì)三角函數(shù)進(jìn)行加加減減
最終我們構(gòu)造的逼近和大概是這樣的,這個(gè)式子表達(dá)的是窑邦,無(wú)窮多種頻率的正余弦波線性的組合擅威。
在這里C稱為直流分量,它表達(dá)函數(shù)整體非周期性地偏移冈钦,an和bn是線性系數(shù)郊丛。我們的目標(biāo)就是求出這三類系數(shù)。
歐拉公式
exi = cosx + isinx
使用e為底的表達(dá)式去表達(dá)正弦和余弦函數(shù)的線性組合瞧筛,這時(shí)另一種表達(dá)正余弦函數(shù)的方式(關(guān)于推導(dǎo)厉熟,將ex、sinx和cosx按照泰勒展開可得)较幌。
那么歐拉公式究竟表達(dá)了什么含義呢揍瑟?
我們都知道,正弦和余弦函數(shù)實(shí)際上都是在描述一種圓周運(yùn)動(dòng)
歐拉公式也是在描述一種特定的圓周運(yùn)動(dòng)乍炉,不過(guò)在復(fù)平面绢片,我們使用向量來(lái)表示它,而歐拉公式的返回值是x時(shí)刻的點(diǎn)的位置(向量坐標(biāo))岛琼,用復(fù)數(shù)來(lái)表示底循,不同于正弦函數(shù)(它返回的是x時(shí)刻的點(diǎn)的有坐標(biāo)值)。從描述圓周運(yùn)動(dòng)的角度衷恭,它們是一致的此叠,它們都是根據(jù)時(shí)間x返回圓周運(yùn)動(dòng)上的點(diǎn)的一個(gè)指標(biāo)上的值。復(fù)數(shù)和實(shí)數(shù)都是數(shù),更或者說(shuō)是信息的一種編碼形式灭袁。歐拉公式返回的復(fù)數(shù)的實(shí)部表示點(diǎn)在x軸的坐標(biāo)值猬错,虛部表示點(diǎn)在y軸上的坐標(biāo)值。
假設(shè)我們的函數(shù)可以進(jìn)行以下分解
g(t) = sin(t) + sin(2t)
如果轉(zhuǎn)到復(fù)平面去茸歧,那么它應(yīng)該是這個(gè)歐拉公式所構(gòu)造式子的虛部
g(t) = Im(eit + ei2t)
很顯然倦炒,根據(jù)剛才的說(shuō)法eit + ei2t所表達(dá)的是兩個(gè)向量的和
更一般地,我們可以寫出函數(shù)向量的表達(dá)式
并且函數(shù)向量的點(diǎn)積是這么定義的
根據(jù)函數(shù)點(diǎn)積的定義软瞎,我們可以自己計(jì)算得出下式
這個(gè)式子說(shuō)明了逢唤,sin(t)與sin(2t)是正交的函數(shù)向量,它們線性無(wú)關(guān)涤浇,是正交基鳖藕。如果寫成g(t) = 1 * sin(t) + 1 * sin(2t),表明可以理解為g(t)在正交基sin(t)和sin(2t)下的坐標(biāo)是(1,1)只锭。
那么如何求得對(duì)應(yīng)函數(shù)向量的坐標(biāo)呢著恩?
假設(shè)w = au + bv(w、u蜻展、v都是向量喉誊,其中u和v是正交的)
那么基u的坐標(biāo)a可以用以下公式求得:
sin(x)這個(gè)向量函數(shù)的坐標(biāo)應(yīng)該為
現(xiàn)在回顧以下我們之前的假設(shè)
我們可以改寫成這樣(所有頻率不同的正余弦向量函數(shù)在共同的周期內(nèi)一定正交)
也就是說(shuō)我們?cè)谇笙铝姓换南禂?shù)
于是我們可以得到系數(shù)
由積分的周期性,更一般地纵顾,我們可以將上式泛化成
好的伍茄!現(xiàn)在離我們的結(jié)果已經(jīng)很接近了!我們將歐拉公式進(jìn)行變換施逾,如下圖所示
我們可以得到另一種形式的f(x)
其中
看到這里注意一個(gè)問(wèn)題敷矫,這個(gè)式子連同上述的公式,描述的都是一個(gè)無(wú)窮序列上的傅立葉變換音念,但是在現(xiàn)實(shí)中沪饺,我們只能描述一個(gè)有限長(zhǎng)的序列。好在離散傅立葉變換在有限長(zhǎng)序列上闷愤,它可以做到無(wú)限逼近,并且隨著不同頻率的正余弦波疊加數(shù)越多件余,它的精確度越高讥脐。
我們可以得到離散形式下的f(x),它表達(dá)了P種不同頻率的波疊加而成的函數(shù)啼器,其中ω是所有頻率波中的單位頻率旬渠,它決定了波疊加的效果,ω=2π/N端壳。
ω直觀的含義告丢,我們可以從正弦波的本質(zhì)出發(fā),我們都知道正弦波其實(shí)是在描述圓周運(yùn)動(dòng)损谦,圓周運(yùn)動(dòng)的角速度為2π岖免,那么這個(gè)波會(huì)以2π的速度繪制岳颇,那么它頻率將會(huì)是2π。于是我們知道ω=2π/N描述的是角速度為ω的圓周運(yùn)動(dòng)颅湘。
當(dāng) n=1,2,3...P 時(shí)话侧,使
由于單位頻率為2π/N時(shí),有一個(gè)這樣的特殊條件:
因此闯参,上述表達(dá)式可以寫成下面這種整合后的形式
此時(shí)瞻鹏,我們的Cn就等效于論文中的X(k),用以下式子求出
不過(guò)可以注意到鹿寨,論文中的公式?jīng)]有1/N新博,其實(shí)有沒(méi)有1/N都無(wú)所謂,并不影響它的相對(duì)大小脚草,畢竟我們需要分析的是頻譜之間相對(duì)差叭披。
其中Cn在n=0時(shí),表達(dá)的是直流分量玩讳,n=1...P的范圍內(nèi)(即1...(N-1)/2)涩蜘,可以表達(dá)所有的系數(shù),n=P+1..N上的系數(shù)只是一個(gè)對(duì)稱熏纯。
故而同诫,一般情況下,我們需要求出前半部分的系數(shù)即可
現(xiàn)在再來(lái)回顧一下我們的公式樟澜,相信已經(jīng)很容易理解了误窖。
這里與論文中敘述一致,我們僅需要求出X(k)(k = 0 ... N / 2 - 1)的值即可秩贰。這里的X(k)與Cn表達(dá)的等價(jià)
實(shí)際上霹俺,Cn是對(duì)應(yīng)頻率的波在復(fù)平面內(nèi)的點(diǎn)坐標(biāo),利用這個(gè)我們可以求出對(duì)應(yīng)頻率波的振幅毒费。
第三個(gè)問(wèn)題
DFT之后對(duì)應(yīng)頻譜的某點(diǎn)Cn或者X(k)可以用復(fù)數(shù)a+bi表示丙唧。那么這個(gè)復(fù)數(shù)的模就是Ak=√(a * a+b * b),那么振幅A為
A = Ak/(N/2)觅玻。
對(duì)于n=0點(diǎn)的信號(hào)想际,它的振幅為0,通常作為一個(gè)整體偏移的作用存在溪厘,稱為直流分量胡本,幅度即為A1/N。
最后我們注意一點(diǎn)畸悬,由于DFT結(jié)果的對(duì)稱性侧甫,通常我們只使用前半部分的結(jié)果,即小于采樣頻率一半的結(jié)果。(由奈奎斯特理論可得披粟,可還原的信號(hào)量頻率必小于采樣頻率的二分之一咒锻。)
二、PCP
對(duì)于X(k)僻爽,我們可以繼續(xù)推導(dǎo)出PCP虫碉,它12維向量表示鋼琴中八度里的12個(gè)半調(diào)音級(jí)。
設(shè)p = 0,1,2...11胸梆,那么我們定義式(1)PCP(p)如下:
在這里M(l)映射著頻譜與PCP敦捧,我們的M(l)定義式(2)如下:
其中fref表示以PCP(0)為基準(zhǔn)的相對(duì)頻率,fs * (1/N)表示在DFT頻譜內(nèi)的碰镜。
這個(gè)算法有些難以理解兢卵,首先我們關(guān)注到fref的含義,
它表達(dá)著相對(duì)于這個(gè)PCP數(shù)組ps = [16.35, 17.32, 18.35, 19.45, 20.60, 21.83, 23.12, 24.50, 25.96, 27.50, 29.14, 30.87]中對(duì)應(yīng)位置的值绪颖。
這里的算法描述再給出:
1秽荤、首先對(duì)于式(2)使用p = 0, 1 ... 11,使得fref = ps[p]
2柠横、令l = 1,2...N/2 - 1窃款,將fref帶入M(l),牍氛,計(jì)算出所有滿足p = M(l)的l值
3晨继、最后將對(duì)應(yīng)p和所有l(wèi)帶入式(1)中,求解出所有對(duì)應(yīng)l頻率的向量模長(zhǎng)的平方搬俊。
此時(shí)紊扬,我們計(jì)算得到的PCP是一個(gè)12維的向量,每個(gè)向量代表這這個(gè)音級(jí)的強(qiáng)度唉擂。
三餐屎、模式識(shí)別
在論文里,選擇了27組和弦玩祟,論文使用上述過(guò)程腹缩,進(jìn)行手工調(diào)整得到了模版PCP。
論文中給出了兩種方式對(duì)匹配性能進(jìn)行評(píng)估:
-
臨近法
此方法計(jì)算和弦模版的PCP與實(shí)際PCP的平方和卵凑,選取值最小的作為正確的和弦庆聘。
-
加權(quán)求和法
此方法計(jì)算和弦模版的權(quán)值與PCP的乘積之和,選取值最小的和弦作為正確的和弦勺卢。
四、啟發(fā)式優(yōu)化
1象对、進(jìn)行pcp平滑化
2黑忱、和弦轉(zhuǎn)變感知
3、PCP預(yù)處理
4、消除M(l)中無(wú)關(guān)緊要的區(qū)域
5甫煞、使用DFT窗口
6菇曲、靜音檢測(cè)
7、噪音檢測(cè)
引用
https://blog.csdn.net/u010138758/article/details/73800339
https://www.zhihu.com/question/23234701/answer/26017000
https://blog.csdn.net/u010138758/article/details/73800339
https://dsp.stackexchange.com/questions/13722/pitch-class-profiling
https://stackoverflow.com/questions/36752485/python-code-for-pitch-class-profiling
http://blog.jobbole.com/70549/