MFCC演算法的實現過程(原理篇)

2021-10-23 01:57:29 字數 1937 閱讀 5186

前期的部落格中,已經貼出了mfcc演算法的c++**實現。本篇文章,主要講解該演算法的數學原理。

聲音是因為物體振動而產生的聲波,是可以被人或動物的聽覺器官所感知的波動現象。聲音有多種特性,比如音色、音調、響度、頻率。人耳是能夠通過這些特徵區分出聲音的種類,那麼如何讓機器去區別不同種類的聲音呢?研究者通常採用梅爾頻率倒譜係數(mel frequency cepstrum coefficient, 簡稱:mfcc)作為聲學特徵,讓機器學會辨別聲音。

梅爾(mel)頻率是由研究人員跟據人耳聽覺機理提出,它與赫茲(hz)頻率成非線性對應關係。mfcc則利用兩者之間的非線性關係,計算得到hz頻譜特徵。當前mfcc已經廣泛應用於語音資料特徵提取和降低運算維度。由於hz頻率與mel頻率之間存在非線性的對應關係,使得當頻率提高時,mfcc的計算精度隨之下降。通常情況下,在應用時僅使用低頻mfcc,而捨棄中頻和高頻mfcc。

mfcc的計算包括預加重,分幀,加窗,快速傅利葉變換,梅爾濾波器組(梅爾頻率轉換),離散余弦變換(discrete cosine transform,簡稱:dct),動態特徵等過程。其中最重要的步驟是快速傅利葉變換和梅爾濾波器組,它們對資料進行了主要的降維操作。下面,介紹一下mfcc演算法的具體實現過程: 

1)預加重。預加重是為了突出語音頻號的高頻特性,使訊號的頻譜變得平坦,並保持在低頻到高頻的整個頻帶中可以使用同樣的訊雜比求頻譜。同時,預加重還可以消除發聲過程中聲帶和嘴唇之間的效應,用以補償發音系統對語音頻號抑制的高頻部分,也為了突出高頻的共振峰。一般通過下面計算式實現預加重,

2)分幀。將n個取樣點集合成為乙個觀測單位,稱之為幀,一般設定n=512。為了防止相鄰兩幀的變化太大,通常會使兩個相鄰的幀之間有一段重疊區域,我們實驗的重疊區域包含了256個取樣點。分幀之後,均以幀為單位進行特徵處理。

3)加窗。相比於使用矩形窗函式,使用漢明窗平滑訊號可以減弱快速傅利葉變換以後旁瓣大小以及頻譜洩露(主瓣是變換為頻譜之後振幅最大的那個波峰部分,而周圍的小的波峰部分叫旁瓣),能取得更高質量的頻譜(頻譜表示頻率與能量的關係)。

4)快速傅利葉變換。因為時域上的訊號變換難以表現出訊號的特性,所以一般將它轉變成為頻域上的能量分布來分析,不相同的能量分布,就意味著不相同語音的特性。因此在加窗後,每幀還需要經過快速傅利葉變換以獲取在頻譜上的能量分布。使用快速傅利葉變換對分幀加窗後的各幀訊號求取頻譜,並對得到的頻譜取模方平均來獲取其功率譜。k是傅利葉變換的長度,這裡k=512;

5)梅爾濾波器組。雖然得到了頻譜和功率譜,但頻域訊號中存在較多冗餘。因此,需要使用梅爾濾波器組來對頻域的幅值進行精簡,使用單個值來表示每乙個頻段。這裡展示對每幀資料獲取梅爾頻率轉換:①使用下式1將頻率轉換成梅爾頻率,分別將高頻sf/2(取樣頻率sf=12000)和低頻300轉換成梅爾高頻mam和梅爾低頻mim;②使用下式2計算每點的頻率

6)取對數。由於人耳對聲音的感知並不是線性的,使用非線性方式更好描述。處理之後,才能進行倒譜分析。因此,對梅爾濾波得到的值取對數。

7)離散余弦變換。因為濾波器之間是存在重疊的,故而之前計算得到的能量值之間具有相關性。離散余弦變換可以對資料進行降維壓縮和抽象,使獲得的特徵引數沒有虛部,更便於計算。這裡離散變換維度的維度取13,即1<=nc<=13。

8)動態特徵。語音頻號具有時域連續的特徵,而以幀為單位提取的特徵資訊僅僅體現了當前幀語音的特性。為了使特徵資訊能夠反應出語音頻號的時域連續性,一般會給特徵維度增加前後幀資訊的維度,常見的是一階差分和二階差分。下式展示了一階差分的計算過程,其中

原理篇 v for v if的渲染

注意 在渲染過程中v for優先於v if被解析,所以這兩個指令不要使用在同乙個標籤上面。如果同時使用,他會每次迴圈完了再判斷,這樣會造成效能浪費 v for v if可能會同時使用的兩種情況 1 為了過濾列表中的項 比如v for item in list v if item.isactive 2...

c 實現rsa演算法 RSA 演算法 基本原理篇

咱們每天說非對稱加密,說公鑰私鑰,但是公鑰和私鑰到底是怎麼產生的,加密和解密過程到底是怎麼樣的,不看看具體演算法實現還真是感覺心裡沒底。rsa 演算法是非對稱加密演算法鼻祖,至今仍然是最為廣泛使用的演算法之一,所以我們就來拆解一下 rsa 演算法本身。學東西最怕的就是沒有大思路,直接深入細節。所以開...

再次理解HTTP請求過程 概念原理篇

我曾多次閱讀http協議,但是理解依然不深,在此,再次閱讀,再次理解。加深兩點 解析頭部資訊 r n,分解頭部和主體用 r n r n。之所以一次請求會看到網路裡有很多請求,是因為瀏覽器代替訪問了多次!程式只管處理一次即可!步驟1 瀏覽器首先向伺服器傳送http請求,請求包括 方法 get還是pos...