samer@32: % tri_filterbank_aa - Bank of anti-aliased triangular filters samer@32: % samer@32: % tri_filterbank_aa :: samer@32: % E:[[M+2]->nonneg] ~'array of filter edge frequencies', samer@32: % F:[[N]] ~'array of bin frequencies for input spectra' samer@32: % -> [[M,N]] ~'matrix to multiply by input spectra'. samer@32: samer@32: function W=tri_filterbank_aa(fb_edges,fmap) samer@32: bins = buffer(edges(fmap),2,1,'nodelay'); samer@32: M = length(fb_edges)-2; % total number of filters to prepare samer@32: W = zeros(M,size(bins,2)); samer@32: for i=1:M samer@32: W(i,:) = olap_up(bins,fb_edges(i:i+1)) + olap_dn(bins,fb_edges(i+1:i+2)); samer@32: end samer@32: W=sparse(W); samer@32: end samer@32: samer@32: function y=olap_up(bands,seg), [lx,cx]=intersect(bands,seg); y=lx.*(cx-seg(1))./(seg(2)-seg(1)); end samer@32: function y=olap_dn(bands,seg), [lx,cx]=intersect(bands,seg); y=lx.*(seg(2)-cx)./(seg(2)-seg(1)); end samer@32: function [lens,centres]=intersect(i1,i2), samer@32: ivals=[max(i1(1,:),i2(1));min(i1(2,:),i2(2))]; % intersect intervals samer@32: lens=max(ivals(2,:)-ivals(1,:),0); % positive lengths only samer@32: centres=(ivals(2,:)+ivals(1,:))/2; % centres of intervals samer@32: end