melfb.m
上传用户:jzquartz
上传日期:2008-06-09
资源大小:389k
文件大小:1k
源码类别:

Audio

开发平台:

Matlab

  1. function m = melfb(p, n, fs)
  2. % MELFB         Determine matrix for a mel-spaced filterbank
  3. %
  4. % Inputs:       p   number of filters in filterbank
  5. %               n   length of fft
  6. %               fs  sample rate in Hz
  7. %
  8. % Outputs:      x   a (sparse) matrix containing the filterbank amplitudes
  9. %                   size(x) = [p, 1+floor(n/2)]
  10. %
  11. % Usage:        For example, to compute the mel-scale spectrum of a
  12. %               colum-vector signal s, with length n and sample rate fs:
  13. %
  14. %               f = fft(s);
  15. %               m = melfb(p, n, fs);
  16. %               n2 = 1 + floor(n/2);
  17. %               z = m * abs(f(1:n2)).^2;
  18. %
  19. %               z would contain p samples of the desired mel-scale spectrum
  20. %
  21. %               To plot filterbanks e.g.:
  22. %
  23. %               plot(linspace(0, (12500/2), 129), melfb(20, 256, 12500)'),
  24. %               title('Mel-spaced filterbank'), xlabel('Frequency (Hz)');
  25. %%%%%%%%%%%%%%%%%%
  26. %
  27. % Author:     Amin Koohi(Sohrevardi)
  28. %              AminSohrevardi@yahoo.com , AminKoohi@yahoo.com
  29. f0 = 700 / fs;
  30. fn2 = floor(n/2);
  31. lr = log(1 + 0.5/f0) / (p+1);
  32. % convert to fft bin numbers with 0 for DC term
  33. bl = n * (f0 * (exp([0 1 p p+1] * lr) - 1));
  34. b1 = floor(bl(1)) + 1;
  35. b2 = ceil(bl(2));
  36. b3 = floor(bl(3));
  37. b4 = min(fn2, ceil(bl(4))) - 1;
  38. pf = log(1 + (b1:b4)/n/f0) / lr;
  39. fp = floor(pf);
  40. pm = pf - fp;
  41. r = [fp(b2:b4) 1+fp(1:b3)];
  42. c = [b2:b4 1:b3] + 1;
  43. v = 2 * [1-pm(b2:b4) pm(1:b3)];
  44. m = sparse(r, c, v, p, 1+fn2);