語音特徵引數MFCC計算的詳細過程

五柳-先生發表於2015-06-01
注:老早之前就在看語音訊號處理方面的知識,每當過了很久都會忘記,由於之前對語音特徵MFCC提取的流程還是非常清楚的,但是對於一些細節以及一些原理一些的東西還是不是很明白,通過這次的總結,我終於明白的其中的技術細節以及設計方法,包括濾波器的設計,以及引數的具體意義,希望這個總結能給自己增加更多的印象,課本上好像對各個三角濾波器的設計沒有過多的講解,也沒講流程,希望這裡的總結能有所幫助。

一、MFCC計算總體流程

1.訊號的預處理,包括預加重(Preemphasis),分幀(Frame Blocking),加窗(Windowing)。假設語音訊號的取樣頻率fs=8KHz.由於語音訊號在10-30ms認為是穩定的,則可設定幀長為80~240點。幀移可以設定為幀長的1/2.

2.對每一幀進行FFT變換,求頻譜,進而求得幅度譜。

3.對幅度譜加Mel濾波器組(Mel濾波器組設計問題)。

4.對所有的濾波器輸出做對數運算(Logarlithm),再進一步做離散餘弦變換DCT可得MFCC。

流程圖如下所示:

二、實際頻率與Mel頻率的轉換

Mel頻率與實際頻率的具體關係如下:

 

人耳的聽覺特性與Mel頻率的增長一致。與實際頻率在1000Hz以下呈現線性分佈,1000Hz以上呈現對數增長。

Mel頻率軸上配置K個通道的三角形濾波器組,K的個數由訊號的截止頻率決定。

設計的過程如下:

假設語音訊號的取樣頻率,幀長N=256,濾波器個數K=22

由此可得語音訊號的最大頻率為:

根據下面的公式:

 

可以求得出最大的Mel頻率為:

由於在Mel刻度範圍內,各個三角濾波器的中心頻率是相等間隔的線性分佈。由此,可以計算兩個相鄰三角濾波器的中心頻率的間距為:

因此,各三角形濾波器在mel刻度上的中心頻率可以表示為:

由上面的中心頻率可以計算出對應的線性刻度上的頻率。如下圖所示:

下面採用Matlab設計Mel三角形濾波器如下:

//獲取Mel三角濾波器的引數

fs為取樣頻率,filterNum為三角濾波器的個數

maxMelFreq = freq2mel(fs/2); %將線性頻率轉化為mel頻率,得到最大的Mel頻率

sideWidth=maxMelFreq/(filterNum+1);%求頻頻寬帶,即Mel濾波器寬度

index=0:filterNum-1;%濾波器的中心

filterBankPrm=floor(mel2freq([index;index+1;index+2]*sideWidth)/fs*frameSize)+1;

filterBankPrm(end, end)= frameSize/2;

 得到如下的三角形濾波器,橫座標對應於FFT中的點的下標:

 注:這裡選擇的幀長為256點,然後FFT的點數也為256,由於是對稱的,所以只取前面一半的點計算頻譜。然後加入到三角濾波器中。

每一個三角形濾波器的中心頻率c(l) 在Mel頻率軸上等間隔分佈。設o(l),c(l),h(l) 分別是第l 個三角形濾波器的下限,中心,和上限頻率,則相鄰三角形濾波器之間的下限,中心,上限頻率的關係如下:c(l)=h(l-1)=o(l+1)

根據語音訊號幅度譜求每個三角形濾波器的輸出。

對所有的濾波器輸出做對數運算,再進一步做離散餘弦變換(DCT)即可得到MFCC

由上公式可知,MFCC特徵引數的長度與濾波器的個數無關。只與DCT有關。

% === 對幅度譜進行三角濾波過程

function tbfCoef = triBandFilter(fftMag, P, filterBankParam)

fstart=filterBankParam(1,:);                %fftMag一幀資料的幅度譜

fcenter=filterBankParam(2,:);%濾波器的中心點,每列代表一個濾波器的中心頻率

fstop=filterBankParam(3,:);

% Triangular bandpass filter.

for i=1:P %濾波器個數

   for j = fstart(i):fcenter(i), %第i個濾波器起始頻譜點和中心頻譜點的輸出

      filtmag(j) = (j-fstart(i))/(fcenter(i)-fstart(i));

   end

   for j = fcenter(i)+1:fstop(i),

      filtmag(j) = 1-(j-fcenter(i))/(fstop(i)-fcenter(i));

   end

   tbfCoef(i) = sum(fftMag(fstart(i):fstop(i)).*filtmag(fstart(i):fstop(i))'); %第i個濾波器的輸出

end

tbfCoef=log(eps+tbfCoef.^2); %求得每個濾波器的對數輸出,有多少個濾波器就有多少個輸出,對應為每一幀

來源: http://blog.csdn.net/xiaoding133/article/details/8106672



相關文章