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