mfcc.m
上传用户:ay_070428
上传日期:2014-12-04
资源大小:11427k
文件大小:3k
源码类别:

语音合成与识别

开发平台:

Matlab

  1. function ccc = MFCC(x,Fs,nM,nC,nfft,fl,fh,ovlp)
  2. % This function is to calculate MFCC coefficients of input data 'x'. Default dimension 
  3. % of MFCC is 24, including mfcc and △mfcc.
  4. %
  5. % Input Parameters:
  6. % x:  input data, must be a vector.
  7. % Fs:  sample frequency
  8. % nM: dimension of MFCC coefficients
  9. % nC:  number of filters
  10. % nfft: number of fft, pow of 2
  11. % fl:    the lowest frequency =  fl * Fs
  12. % fh:   the highest frequency = fh * Fs, so fh <= 0.5
  13. % ovlp: overlap, default 0.5
  14. %
  15. % Output Parameter:
  16. % ccc: MFCC matrix, each row is a MFCC pattern
  17. %
  18. %   xiupingping@smth provided a matlab program to generate MFCC
  19. % patterns. This program derived from it.
  20. %   No copyright reversed 
  21. %                                                   QingRen
  22. %                                                   gly.nkioa#gmail.com
  23. if nargin < 2 Fs = 8000; end
  24. if nargin < 3   nM = 12;    end
  25. if nargin < 4 nC = 24; end
  26. if nargin < 5 nfft = 256; end
  27. if nargin < 6 fl = 0; end
  28. if nargin < 7 fh = 0.5; end
  29. if nargin < 8 ovlp = 0.5; end
  30. x = x(:);
  31. % ----- mel filter bank -----
  32. % melbankm.m ect, you can get them from toolbox "VoiceBox"
  33. % http://www.ee.ic.ac.uk/hp/staff/dmb/voicebox/voicebox.html
  34. bank = melbankm(nC,nfft,Fs,fl,fh);
  35. bank = full(bank);
  36. bank = bank / max(bank(:));
  37.  
  38. %  ----- DCT coefficients, a (N×nC) matrix -----
  39. % Reference 
  40. % [1] "Generalized Mel frequency cepstral coefficients for large-vocabulary
  41. %        speeker-independent continuous-speech recognition"  IEEE 1996
  42. % [2] "Comparison of parametric representations for monosyllabic word 
  43. % recognition" IEEE Trans Acoust.Speech.Signal Processing 1980
  44. j = 0:nC-1;
  45. for k = 1:nM
  46.     dctcoef(k,:) = cos(k * (j+0.5) * pi / nC); 
  47. end
  48.  
  49. % Ceplifter
  50. % Reference:   HTK book v3.1
  51. w = 1 + (nM/2) * sin(pi*[1:nM]./nM);
  52. w = w / max(w);
  53.  
  54. % pre-emphasis filtering
  55. % x = double(x);
  56. % x = filter([1 -0.95],1,x);
  57. % ----- Calculate MFCC coefficients of each frame -----
  58. L_x = length(x);
  59. nOvlp = floor(nfft*ovlp);
  60. i = 0; 
  61. while ((i*nOvlp+nfft) <= L_x)
  62.     in = x(i*nOvlp+1:i*nOvlp+nfft);
  63.     in = in ./ max(abs(in));
  64.     in  = in .* hamming(nfft);
  65.     
  66.     % --- Calculate the energy spectrum ---
  67.     s = abs(fft(in));  
  68.     t  = s.^2;
  69.     t  = t+2*realmin;
  70.     t = t(1:nfft/2+1);
  71.     
  72.     % --- Calculate the energy in each channel ---
  73.     t1 = bank * t;
  74.         
  75.     % --- Calculate MFCC ---
  76.     t1 = log10(t1);
  77.     c1 = dctcoef * t1;
  78.     c2 = c1.*w';
  79.     m(i+1,:) = c2';
  80.     
  81.      i = i + 1;
  82. end
  83. % ccc = m;
  84. % get △mfcc
  85. dtm=zeros(size(m));
  86. for i=3:size(m,1)-2
  87.     dtm(i,:)=-2*m(i-2,:)-m(i-1,:)+m(i+1,:)+2*m(i+2,:);
  88. end
  89. dtm=dtm/3;
  90.  
  91. % combine mfcc and △mfcc
  92. ccc = [m dtm];
  93. ccc=ccc(3:size(m,1)-2,:);
  94. return