前期的博客中,已經貼出了MFCC算法的C++代碼實現。本篇文章,主要講解該算法的數學原理。
聲音是因爲物體振動而產生的聲波,是可以被人或動物的聽覺器官所感知的波動現象。聲音有多種特性,比如音色、音調、響度、頻率。人耳是能夠通過這些特徵區分出聲音的種類,那麼如何讓機器去區別不同種類的聲音呢?研究者通常採用梅爾頻率倒譜系數(Mel Frequency Cepstrum Coefficient, 簡稱:MFCC)作爲聲學特徵,讓機器學會辨別聲音。
梅爾(Mel)頻率是由研究人員跟據人耳聽覺機理提出,它與赫茲(Hz)頻率成非線性對應關係。MFCC則利用兩者之間的非線性關係,計算得到Hz頻譜特徵。當前MFCC已經廣泛應用於語音數據特徵提取和降低運算維度。由於Hz頻率與Mel頻率之間存在非線性的對應關係,使得當頻率提高時,MFCC的計算精度隨之下降。通常情況下,在應用時僅使用低頻MFCC,而捨棄中頻和高頻MFCC。
MFCC的計算包括預加重,分幀,加窗,快速傅里葉變換,梅爾濾波器組(梅爾頻率轉換),離散餘弦變換(Discrete Cosine Transform,簡稱:DCT),動態特徵等過程。其中最重要的步驟是快速傅里葉變換和梅爾濾波器組,它們對數據進行了主要的降維操作。下面,介紹一下MFCC算法的具體實現過程:
1)預加重。預加重是爲了突出語音信號的高頻特性,使信號的頻譜變得平坦,並保持在低頻到高頻的整個頻帶中可以使用同樣的信噪比求頻譜。同時,預加重還可以消除發聲過程中聲帶和嘴脣之間的效應,用以補償發音系統對語音信號抑制的高頻部分,也爲了突出高頻的共振峯。一般通過下面計算式實現預加重,代表聲音流中的第m個採樣點:
2)分幀。將N個採樣點集合成爲一個觀測單位,稱之爲幀,一般設置N=512。爲了防止相鄰兩幀的變化太大,通常會使兩個相鄰的幀之間有一段重疊區域,我們實驗的重疊區域包含了256個採樣點。分幀之後,均以幀爲單位進行特徵處理。
3)加窗。相比於使用矩形窗函數,使用漢明窗平滑信號可以減弱快速傅里葉變換以後旁瓣大小以及頻譜泄露(主瓣是變換爲頻譜之後振幅最大的那個波峯部分,而周圍的小的波峯部分叫旁瓣),能取得更高質量的頻譜(頻譜表示頻率與能量的關係)。表示每幀中預加重的第n個採樣點:
4)快速傅里葉變換。因爲時域上的信號變換難以表現出信號的特性,所以一般將它轉變成爲頻域上的能量分佈來分析,不相同的能量分佈,就意味着不相同語音的特性。因此在加窗後,每幀還需要經過快速傅里葉變換以獲取在頻譜上的能量分佈。使用快速傅里葉變換對分幀加窗後的各幀信號求取頻譜,並對得到的頻譜取模方平均來獲取其功率譜。K是傅里葉變換的長度,這裏K=512;表示聲音流第i幀加窗後的第n個採樣點值;表示聲音流第i幀的頻譜的第k個值;表示聲音流第i幀的功率譜的第k個值。
5)梅爾濾波器組。雖然得到了頻譜和功率譜,但頻域信號中存在較多冗餘。因此,需要使用梅爾濾波器組來對頻域的幅值進行精簡,使用單個值來表示每一個頻段。這裏展示對每幀數據獲取梅爾頻率轉換:①使用下式1將頻率轉換成梅爾頻率,分別將高頻sf/2(採樣頻率sf=12000)和低頻300轉換成梅爾高頻maM和梅爾低頻miM;②使用下式2計算每點的頻率(1<=n<=K/2),並使用式1將其轉換成梅爾頻率;③在梅爾低頻miM與梅爾高頻maM區間內均勻取NF個點(NF=26爲梅爾濾波器的個數),每個點記作(1<=nf<=26);④則對於每個梅爾濾波器值可以使用下式4計算,其中是利用式3對求得;⑤對每幀數據,得到一個26維的梅爾濾波值。
6)取對數。由於人耳對聲音的感知並不是線性的,使用非線性方式更好描述。處理之後,才能進行倒譜分析。因此,對梅爾濾波得到的值取對數。
7)離散餘弦變換。因爲濾波器之間是存在重疊的,故而之前計算得到的能量值之間具有相關性。離散餘弦變換可以對數據進行降維壓縮和抽象,使獲得的特徵參數沒有虛部,更便於計算。這裏離散變換維度的維度取13,即1<=nc<=13。
8)動態特徵。語音信號具有時域連續的特徵,而以幀爲單位提取的特徵信息僅僅體現了當前幀語音的特性。爲了使特徵信息能夠反應出語音信號的時域連續性,一般會給特徵維度增加前後幀信息的維度,常見的是一階差分和二階差分。下式展示了一階差分的計算過程,其中表示對第t幀增加的一階差分值,表示離散餘弦變換後第t+st幀的特徵,,常用的ST=1或2。計算二階差分時,表示第t+st幀一階差分的結果。增加一階差分和二階差分後的每幀特徵是39維。