1. 程式人生 > >MFCC程式引數詳解

MFCC程式引數詳解

本文程式來源於宋知用老師編著的《MATLAB在語音訊號分析與合成中的應用》

function ccc=mfcc_m(x,fs,p,frameSize,inc)
% % % % % % % % % % % % % % % % % % % % % % % % % % % %
% function ccc=mfcc_m(x);
%對輸入的語音序列x進行MFCC引數的提取,返回MFCC引數和一階
%差分MFCC引數,Mel濾波器的個數為p,取樣頻率為fs
%對x每frameSize點分為一幀,相鄰兩幀之間的幀移為inc
% FFT的長度為幀長
% % % % % % % % % % % % % % % % % % % % % % % % % % % %

% 按幀長為frameSize,Mel濾波器的個數為p,取樣頻率為fs
% 提取Mel濾波器引數,用漢明窗函式
bank=melbankm(p,frameSize,fs,0,0.5,’m’);
% 歸一化Mel濾波器組係數
bank=full(bank);
bank=bank/max(bank(:));
%——————————————————————————————————-
%MATLAB中對稀疏矩陣的儲存有兩種方法:一是八所有的元素都儲存;另一種是隻儲存非0元素。函式full將稀疏矩陣轉化為全矩陣,把矩陣中所有的元素都儲存,方便以後運算。
%輸出引數bank是濾波器的頻率響應,是一個p *(n/2+1)維的矩陣
%——————————————————————————————————-

% DCT係數,12*p
for k=1:12
n=0:p-1;
dctcoef(k,:)=cos((2*n+1)*k*pi/(2*p));
end
%——————————————————————————————————-
%這裡的迴圈次數12是選的MFCC引數的個數,通常取12個,一般在12~16個之間
%dctcoef是一個12*p維的矩陣
%——————————————————————————————————-

% 歸一化倒譜提升視窗
w = 1 + 6 * sin(pi * [1:12] ./ 12);
w = w/max(w);
%——————————————————————————————————-
%這個,感覺宋老師在MATLAB中文論壇中也沒有講的很清楚:LZ給出的表示式就是窗函式的表示式,其目的是對MFCC係數中某些譜線增強。
%也可能是我知識不足,沒理解透,望有理解的朋友解惑
%——————————————————————————————————-

% 預加重濾波器
xx=double(x);
xx=filter([1 -0.9375],1,xx);

% 語音訊號分幀
xx=enframe(xx,frameSize,inc);
n2=fix(frameSize/2)+1;
% 計算每幀的MFCC引數
for i=1:size(xx,1)
y = xx(i,:);
s = y’ .* hamming(frameSize);
t = abs(fft(s));
t = t.^2;
c1=dctcoef * log(bank * t(1:n2));
c2 = c1.*w’;
m(i,:)=c2’;
end
%——————————————————————————————————-
%t(1:n2)是為了對應於bank響應曲線長度n/2+1
%——————————————————————————————————-

%差分系數
dtm = zeros(size(m));
for i=3:size(m,1)-2
dtm(i,:) = -2*m(i-2,:) - m(i-1,:) + m(i+1,:) + 2*m(i+2,:);
end
dtm = dtm / 3;
%——————————————————————————————————-
%動態查分引數的提取(包括一階差分和二階差分)
%標準的倒譜引數MFCC只反映了語音引數的靜態特性,語音的動態特性可以用這些靜態特徵的差分譜來描述。實驗證明:把動、靜態特徵結合起來才能有效提高系統的識別效能。差分引數的計算可以採用下面的公式:

式中,dt表示第t個一階差分;Ct表示第t個倒譜系數;Q表示倒譜系數的階數;K表示一階導數的時間差,可取1或2。將上式中結果再代入就可以得到二階差分的引數。
%——————————————————————————————————-

%合併MFCC引數和一階差分MFCC引數
ccc = [m dtm];
%——————————————————————————————————-
%一般來說,MFCC的全部組成其實是由:N維MFCC引數(N/3MFCC係數+ N/3一階差分引數+ N/3二階差分引數)+幀能量(此項可根據需求替換)
%此處只用了MFCC引數和一階差分MFCC引數
%——————————————————————————————————-

%去除首尾兩幀,因為這兩幀的一階差分引數為0
ccc = ccc(3:size(m,1)-2,:);

參考文獻:
《MATLAB在語音訊號分析與合成中的應用》 宋知用
MATLAB中文論壇