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

语音合成与识别

开发平台:

Matlab

  1. function [x,mn,mx]=melbankm(p,n,fs,fl,fh,w)
  2. %MELBANKM determine matrix for a mel-spaced filterbank [X,MN,MX]=(P,N,FS,FL,FH,W)
  3. %
  4. % Inputs: p   number of filters in filterbank
  5. % n   length of fft
  6. % fs  sample rate in Hz
  7. % fl  low end of the lowest filter as a fraction of fs (default = 0)
  8. % fh  high end of highest filter as a fraction of fs (default = 0.5)
  9. % w   any sensible combination of the following:
  10. %       't'  triangular shaped filters in mel domain (default)
  11. %       'n'  hanning shaped filters in mel domain
  12. %       'm'  hamming shaped filters in mel domain
  13. %
  14. %       'z'  highest and lowest filters taper down to zero (default)
  15. %       'y'  lowest filter remains at 1 down to 0 frequency and
  16. %    highest filter remains at 1 up to nyquist freqency
  17. %
  18. %        If 'ty' or 'ny' is specified, the total power in the fft is preserved.
  19. %
  20. % Outputs: x     a sparse matrix containing the filterbank amplitudes
  21. %       If x is the only output argument then size(x)=[p,1+floor(n/2)]
  22. %       otherwise size(x)=[p,mx-mn+1]
  23. % mn   the lowest fft bin with a non-zero coefficient
  24. % mx   the highest fft bin with a non-zero coefficient
  25. %
  26. % Usage: f=fft(s); f=fft(s);
  27. % x=melbankm(p,n,fs); [x,na,nb]=melbankm(p,n,fs);
  28. % n2=1+floor(n/2); z=log(x*(f(na:nb)).*conj(f(na:nb)));
  29. % z=log(x*abs(f(1:n2)).^2);
  30. % c=dct(z); c(1)=[];
  31. %
  32. % To plot filterbanks e.g. plot(melbankm(20,256,8000)')
  33. %
  34. %      Copyright (C) Mike Brookes 1997
  35. %
  36. %      Last modified Tue May 12 16:15:28 1998
  37. %
  38. %   VOICEBOX home page: http://www.ee.ic.ac.uk/hp/staff/dmb/voicebox/voicebox.html
  39. %
  40. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  41. %   This program is free software; you can redistribute it and/or modify
  42. %   it under the terms of the GNU General Public License as published by
  43. %   the Free Software Foundation; either version 2 of the License, or
  44. %   (at your option) any later version.
  45. %
  46. %   This program is distributed in the hope that it will be useful,
  47. %   but WITHOUT ANY WARRANTY; without even the implied warranty of
  48. %   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  49. %   GNU General Public License for more details.
  50. %
  51. %   You can obtain a copy of the GNU General Public License from
  52. %   ftp://prep.ai.mit.edu/pub/gnu/COPYING-2.0 or by writing to
  53. %   Free Software Foundation, Inc.,675 Mass Ave, Cambridge, MA 02139, USA.
  54. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  55. if nargin < 6
  56.   w='tz';
  57.   if nargin < 5
  58.     fh=0.5;
  59.     if nargin < 4
  60.       fl=0;
  61.     end
  62.   end
  63. end
  64. f0=700/fs;
  65. fn2=floor(n/2);
  66. lr=log((f0+fh)/(f0+fl))/(p+1);
  67. % convert to fft bin numbers with 0 for DC term
  68. bl=n*((f0+fl)*exp([0 1 p p+1]*lr)-f0);
  69. b2=ceil(bl(2));
  70. b3=floor(bl(3));
  71. if any(w=='y')
  72.   pf=log((f0+(b2:b3)/n)/(f0+fl))/lr;
  73.   fp=floor(pf);
  74.   r=[ones(1,b2) fp fp+1 p*ones(1,fn2-b3)];
  75.   c=[1:b3+1 b2+1:fn2+1];
  76.   v=2*[0.5 ones(1,b2-1) 1-pf+fp pf-fp ones(1,fn2-b3-1) 0.5];
  77.   mn=1;
  78.   mx=fn2+1;
  79. else
  80.   b1=floor(bl(1))+1;
  81.   b4=min(fn2,ceil(bl(4)))-1;
  82.   pf=log((f0+(b1:b4)/n)/(f0+fl))/lr;
  83.   fp=floor(pf);
  84.   pm=pf-fp;
  85.   k2=b2-b1+1;
  86.   k3=b3-b1+1;
  87.   k4=b4-b1+1;
  88.   r=[fp(k2:k4) 1+fp(1:k3)];
  89.   c=[k2:k4 1:k3];
  90.   v=2*[1-pm(k2:k4) pm(1:k3)];
  91.   mn=b1+1;
  92.   mx=b4+1;
  93. end
  94. if any(w=='n')
  95.   v=1-cos(v*pi/2);
  96. elseif any(w=='m')
  97.   v=1-0.92/1.08*cos(v*pi/2);
  98. end
  99. if nargout > 1
  100.   x=sparse(r,c,v);
  101. else
  102.   x=sparse(r,c+mn-1,v,p,1+fn2);
  103. end