melfb.m
上传用户:jzquartz
上传日期:2008-06-09
资源大小:389k
文件大小:1k
- function m = melfb(p, n, fs)
- % MELFB Determine matrix for a mel-spaced filterbank
- %
- % Inputs: p number of filters in filterbank
- % n length of fft
- % fs sample rate in Hz
- %
- % Outputs: x a (sparse) matrix containing the filterbank amplitudes
- % size(x) = [p, 1+floor(n/2)]
- %
- % Usage: For example, to compute the mel-scale spectrum of a
- % colum-vector signal s, with length n and sample rate fs:
- %
- % f = fft(s);
- % m = melfb(p, n, fs);
- % n2 = 1 + floor(n/2);
- % z = m * abs(f(1:n2)).^2;
- %
- % z would contain p samples of the desired mel-scale spectrum
- %
- % To plot filterbanks e.g.:
- %
- % plot(linspace(0, (12500/2), 129), melfb(20, 256, 12500)'),
- % title('Mel-spaced filterbank'), xlabel('Frequency (Hz)');
- %%%%%%%%%%%%%%%%%%
- %
- % Author: Amin Koohi(Sohrevardi)
- % AminSohrevardi@yahoo.com , AminKoohi@yahoo.com
- f0 = 700 / fs;
- fn2 = floor(n/2);
- lr = log(1 + 0.5/f0) / (p+1);
- % convert to fft bin numbers with 0 for DC term
- bl = n * (f0 * (exp([0 1 p p+1] * lr) - 1));
- b1 = floor(bl(1)) + 1;
- b2 = ceil(bl(2));
- b3 = floor(bl(3));
- b4 = min(fn2, ceil(bl(4))) - 1;
- pf = log(1 + (b1:b4)/n/f0) / lr;
- fp = floor(pf);
- pm = pf - fp;
- r = [fp(b2:b4) 1+fp(1:b3)];
- c = [b2:b4 1:b3] + 1;
- v = 2 * [1-pm(b2:b4) pm(1:b3)];
- m = sparse(r, c, v, p, 1+fn2);