diff dsp/specbasis.m @ 32:c3b0cd708782

Imported core dsp tools.
author samer
date Sun, 20 Jan 2013 13:48:47 +0000
parents
children 5b7d90b6393a
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dsp/specbasis.m	Sun Jan 20 13:48:47 2013 +0000
@@ -0,0 +1,46 @@
+function map=specbasis(edges,M)
+% specbasis - Create frequency mapping matrix
+% 
+% Converts a filterbank specification into a sparse matrix for
+% mutliplying with a linear-frequency spectrogram.
+%
+% as_fmap ::
+%    [[L-1]]    ~ 'array of L-1 bin edge frequencies, in FT bins',
+%    M:natural  ~ 'number of bins in linear-freq spectrum'
+% ->
+%    [[L,M]]    ~ 'L-by-M sparse array'.
+%
+% Note, frequencies must measured in bins of the target spectrum,
+% Also, the first and last of the L bands are catch-alls which
+% get all energy below the bottom edge and above the top edge
+% respectively. If, eg, the bottom edge is 0, then the bottom
+% band will be empty.
+
+% 2005-01-15 Written - Samer Abdallah: to reproduce behaviour of
+%          a the function as_fmap_orig.m. It runs at about half
+%          the speed, but this version is only 8 lines of code!
+%          Also, this version doesn't barf if more than one band 
+%          edge falls in a frequency bin.
+%
+% 2005-01-29 SA: switched to measuring frequency in bins and specifying
+%          the size of the spectrum to be remapped. This makes the
+%          function more general in that it doesn't assume that
+%          1+N/2 bins are retained from an N-point FFT. In fact, the
+%          function is now independent of the FFT size.
+
+	E=repmat([0; edges(:); M-1],1,M);
+	I=repmat(0:M-1,length(edges)+1,1);
+	map=sparse(phi(E(2:end,:)-I)-phi(E(1:end-1,:)-I));
+	map=map.*(map>8e-15); % squeeze out more small values
+	map(:,2:end-1)=map(:,2:end-1)/2; % make up for top and bottom bins
+
+%                                     ____
+% this is piecewise linear ramp : ___/
+% It models the response of an FFT bin to a band edge as the edge 
+% moves across the frequency range. The response of a bin to a
+% band is computed as the sum of responses due to the left and
+% right edges, ie, for the ith FT bin, 
+%    response=phi(e1-i)-phi(e2-i)
+% where e1 and e2 are the lower and upper edges of the band
+function y=phi(x), y=abs(x+0.5)-abs(x-0.5);
+