samer@32: function map=specbasis(edges,M) samer@32: % specbasis - Create frequency mapping matrix samer@32: % samer@32: % Converts a filterbank specification into a sparse matrix for samer@32: % mutliplying with a linear-frequency spectrogram. 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@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@32: % 2005-01-15 Written - Samer Abdallah: to reproduce behaviour of samer@32: % a the function as_fmap_orig.m. It runs at about half samer@32: % the speed, but this version is only 8 lines of code! samer@32: % Also, this version doesn't barf if more than one band samer@32: % edge falls in a frequency bin. samer@32: % samer@32: % 2005-01-29 SA: switched to measuring frequency in bins and specifying samer@32: % the size of the spectrum to be remapped. This makes the samer@32: % function more general in that it doesn't assume that samer@32: % 1+N/2 bins are retained from an N-point FFT. In fact, the samer@32: % function is now independent of the FFT size. samer@32: samer@32: E=repmat([0; edges(:); M-1],1,M); samer@32: I=repmat(0:M-1,length(edges)+1,1); samer@32: map=sparse(phi(E(2:end,:)-I)-phi(E(1:end-1,:)-I)); samer@32: map=map.*(map>8e-15); % squeeze out more small values samer@32: 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: