samer@32
|
1 function map=specbasis(edges,M)
|
samer@32
|
2 % specbasis - Create frequency mapping matrix
|
samer@32
|
3 %
|
samer@32
|
4 % as_fmap ::
|
samer@32
|
5 % [[L-1]] ~ 'array of L-1 bin edge frequencies, in FT bins',
|
samer@32
|
6 % M:natural ~ 'number of bins in linear-freq spectrum'
|
samer@32
|
7 % ->
|
samer@32
|
8 % [[L,M]] ~ 'L-by-M sparse array'.
|
samer@33
|
9 %
|
samer@33
|
10 % Converts a filterbank specification into a sparse matrix for
|
samer@33
|
11 % mutliplying with a linear-frequency spectrogram.
|
samer@32
|
12 %
|
samer@32
|
13 % Note, frequencies must measured in bins of the target spectrum,
|
samer@32
|
14 % Also, the first and last of the L bands are catch-alls which
|
samer@32
|
15 % get all energy below the bottom edge and above the top edge
|
samer@32
|
16 % respectively. If, eg, the bottom edge is 0, then the bottom
|
samer@32
|
17 % band will be empty.
|
samer@32
|
18
|
samer@33
|
19 E=repmat([0; edges(:); M-1],1,M);
|
samer@33
|
20 I=repmat(0:M-1,length(edges)+1,1);
|
samer@33
|
21 map=sparse(phi(E(2:end,:)-I)-phi(E(1:end-1,:)-I));
|
samer@33
|
22 map=map.*(map>8e-15); % squeeze out more small values
|
samer@33
|
23 map(:,2:end-1)=map(:,2:end-1)/2; % make up for top and bottom bins
|
samer@32
|
24
|
samer@32
|
25 % ____
|
samer@32
|
26 % this is piecewise linear ramp : ___/
|
samer@32
|
27 % It models the response of an FFT bin to a band edge as the edge
|
samer@32
|
28 % moves across the frequency range. The response of a bin to a
|
samer@32
|
29 % band is computed as the sum of responses due to the left and
|
samer@32
|
30 % right edges, ie, for the ith FT bin,
|
samer@32
|
31 % response=phi(e1-i)-phi(e2-i)
|
samer@32
|
32 % where e1 and e2 are the lower and upper edges of the band
|
samer@32
|
33 function y=phi(x), y=abs(x+0.5)-abs(x-0.5);
|
samer@32
|
34
|