www.pudn.com > audioProcessingtoolbox.rar > frame2mfcc.m


function mfcc=frame2mfcc(frame, fs, filterNum, mfccNum, plotOpt) 
% frame2mfcc: Frame to MFCC conversion. 
%	Usage: mfcc=frame2mfcc(frame, fs, filterNum, mfccNum, plotOpt) 
 
%	Roger Jang 20060417 
 
if nargin<1, selfdemo; return; end 
if nargin<2, fs=16000; end 
if nargin<3, filterNum=20; end 
if nargin<4, mfccNum=12; end 
if nargin<5, plotOpt=0; end 
 
frameSize=length(frame); 
% ====== Preemphasis is done at wave level 
%a=0.95; 
%frame2 = filter([1, -a], 1, frame); 
frame2=frame; 
% ====== Hamming windowing 
frame3=frame2.*hamming(frameSize); 
% ====== FFT 
[fftMag, fftPhase, fftFreq, fftPowerDb]=fftOneSide(frame3, fs); 
% ====== Triangular band-pass filter bank 
triFilterBankParam=getTriFilterBankParam(fs, filterNum);	% Get parameters for triangular band-pass filter bank 
% Triangular bandpass filter. 
for i=1:filterNum 
	tbfCoef(i)=dot(fftPowerDb, trimf(fftFreq, triFilterBankParam(:,i))); 
end 
% ====== DCT 
mfcc=zeros(mfccNum, 1); 
for i=1:mfccNum 
	coef = cos((pi/filterNum)*i*((1:filterNum)-0.5))'; 
	mfcc(i) = sum(coef.*tbfCoef'); 
end 
% ====== Log energy 
%logEnergy=10*log10(sum(frame.*frame)); 
%mfcc=[logEnergy; mfcc]; 
 
if plotOpt 
	subplot(2,1,1); 
	plot(frame, '.-'); 
	set(gca, 'xlim', [-inf inf]); 
	title('Input frame'); 
	subplot(2,1,2); 
	plot(mfcc, '.-'); 
	set(gca, 'xlim', [-inf inf]); 
	title('MFCC vector'); 
end 
 
% ====== trimf.m (from fuzzy toolbox) 
function y = trimf(x, params) 
a = params(1); b = params(2); c = params(3); 
y = zeros(size(x)); 
% Left and right shoulders (y = 0) 
index = find(x <= a | c <= x); 
y(index) = zeros(size(index)); 
% Left slope 
if (a ~= b) 
    index = find(a < x & x < b); 
    y(index) = (x(index)-a)/(b-a); 
end 
% right slope 
if (b ~= c) 
    index = find(b < x & x < c); 
    y(index) = (c-x(index))/(c-b); 
end 
% Center (y = 1) 
index = find(x == b); 
y(index) = ones(size(index)); 
 
% ====== Self demo 
function selfdemo 
waveFile='主人下馬客在船.wav'; 
[y, fs, nbits]=wavReadInt(waveFile); 
startIndex=4700; 
frameSize=512; 
frame=y(startIndex:startIndex+frameSize-1); 
feval(mfilename, frame, fs, 20, 12, 1);