dan@0
|
1 function [M,fCen,Mfull]=mel_matrix(fs,NbCh,Nfft,warp,fhigh,flow)
|
dan@0
|
2 % [M,fCen,Mfull]=mel_matrix(fs,NbCh,Nfft,warp,fhigh)
|
dan@0
|
3 % returns Nfft/2+1 - by - NbCh matrix of triangular weights
|
dan@0
|
4 % NbCh filterbanks linearly spaced on a MEL scale till fhigh
|
dan@0
|
5 % warp: default 1.0
|
dan@0
|
6 % fhigh: default=fs/2
|
dan@0
|
7 % Mfull: matrix without truncation to Nfft/2+1 points
|
dan@0
|
8
|
dan@0
|
9 if nargin<4,
|
dan@0
|
10 warp=1;
|
dan@0
|
11 end
|
dan@0
|
12 if nargin<5,
|
dan@0
|
13 fhigh=fs/2;
|
dan@0
|
14 end
|
dan@0
|
15
|
dan@0
|
16 LowMel=2595 * log10(1+flow/700);
|
dan@0
|
17 NyqMel=2595 * log10(1+fhigh/700);
|
dan@0
|
18
|
dan@0
|
19 StartMel=LowMel + (0:NbCh-1)/(NbCh+1)*(NyqMel-LowMel);
|
dan@0
|
20 fCen=warp*700*(10.^(StartMel/2595)-1);
|
dan@0
|
21 StartBin=round(Nfft/fs*fCen)+1;
|
dan@0
|
22
|
dan@0
|
23 EndMel=LowMel + (2:NbCh+1)/(NbCh+1)*(NyqMel-LowMel);
|
dan@0
|
24 EndBin=round(warp*Nfft/fs*700*(10.^(EndMel/2595)-1))+1;
|
dan@0
|
25
|
dan@0
|
26 TotLen=EndBin-StartBin+1;
|
dan@0
|
27
|
dan@0
|
28 LowLen=[StartBin(2:NbCh) EndBin(NbCh-1)]-StartBin+1;
|
dan@0
|
29 HiLen=TotLen-LowLen+1;
|
dan@0
|
30
|
dan@0
|
31 M=sparse([],[],[],ceil(warp*Nfft/2+1),NbCh,sum(TotLen));
|
dan@0
|
32 for k=1:NbCh,
|
dan@0
|
33 M(StartBin(k):StartBin(k)+LowLen(k)-1,k)=(1:LowLen(k))'/LowLen(k);
|
dan@0
|
34 M(EndBin(k)-HiLen(k)+1:EndBin(k),k)=(HiLen(k):-1:1)'/HiLen(k);
|
dan@0
|
35 end
|
dan@0
|
36 %TotWeight=sum(M,1);
|
dan@0
|
37 Mfull=M;
|
dan@0
|
38 M=M(1:Nfft/2+1,:);
|
dan@0
|
39 %WeightSum=full([sum(M,1);TotWeight]); |