function [x,mn,mx]=melbankm(p,n,fs,fl,fh,w)
%这个函数是用于将MFCC矩阵实现梅尔滤波器组平滑的
%
% 输入: p 滤波器组中滤波器的个数
% n FFT的长度
% fs 采样频率
% fl 最低级滤波器的低端频率,默认为0
% fh 最高端滤波器的高端频率,默认为fs的0.5倍
% w 指梅尔域的窗函数:
% 't' 默认的,三角窗
% 'n' 汉宁窗
% 'm' 海明窗
% 'z' 最高和最低的滤波器逐渐下降到零
% 'y' 最低的滤波器从1下降到0频,最高的滤波器从1频升到乃奎斯特频率
%
%输出: x 一个包括梅尔滤波器组幅度的稀疏矩阵
% 如果x仅作输出,则 size(x)=[p,1+floor(n/2)]
% 否则 size(x)=[p,mx-mn+1]
% mn 最低的fft非零系数
% mx 最高的fft非零系数
%
% 使用方法: f=fft(s); f=fft(s);
% x=melbankm(p,n,fs); [x,na,nb]=melbankm(p,n,fs);
% n2=1+floor(n/2); z=log(x*(f(na:nb)).*conj(f(na:nb)));
% z=log(x*abs(f(1:n2)).^2);
% c=dct(z); c(1)=[];
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
if nargin < 6
w='tz';
if nargin < 5
fh=0.5;
if nargin < 4
fl=0;
end
end
end
f0=700/fs;
fn2=floor(n/2);
lr=log((f0+fh)/(f0+fl))/(p+1);
bl=n*((f0+fl)*exp([0 1 p p+1]*lr)-f0);
b2=ceil(bl(2));
b3=floor(bl(3));
if any(w=='y')
pf=log((f0+(b2:b3)/n)/(f0+fl))/lr;
fp=floor(pf);
r=[ones(1,b2) fp fp+1 p*ones(1,fn2-b3)];
c=[1:b3+1 b2+1:fn2+1];
v=2*[0.5 ones(1,b2-1) 1-pf+fp pf-fp ones(1,fn2-b3-1) 0.5];
mn=1;
mx=fn2+1;
else
b1=floor(bl(1))+1;
b4=min(fn2,ceil(bl(4)))-1;
pf=log((f0+(b1:b4)/n)/(f0+fl))/lr;
fp=floor(pf);
pm=pf-fp;
k2=b2-b1+1;
k3=b3-b1+1;
k4=b4-b1+1;
r=[fp(k2:k4) 1+fp(1:k3)];
c=[k2:k4 1:k3];
v=2*[1-pm(k2:k4) pm(1:k3)];
mn=b1+1;
mx=b4+1;
end
if any(w=='n')
v=1-cos(v*pi/2);
elseif any(w=='m')
v=1-0.92/1.08*cos(v*pi/2);
end
if nargout > 1
x=sparse(r,c,v);
else
x=sparse(r,c+mn-1,v,p,1+fn2);
end