samer@32
|
1 % tri_filterbank_aa - Bank of anti-aliased triangular filters
|
samer@32
|
2 %
|
samer@32
|
3 % tri_filterbank_aa ::
|
samer@32
|
4 % E:[[M+2]->nonneg] ~'array of filter edge frequencies',
|
samer@32
|
5 % F:[[N]] ~'array of bin frequencies for input spectra'
|
samer@32
|
6 % -> [[M,N]] ~'matrix to multiply by input spectra'.
|
samer@32
|
7
|
samer@32
|
8 function W=tri_filterbank_aa(fb_edges,fmap)
|
samer@32
|
9 bins = buffer(edges(fmap),2,1,'nodelay');
|
samer@32
|
10 M = length(fb_edges)-2; % total number of filters to prepare
|
samer@32
|
11 W = zeros(M,size(bins,2));
|
samer@32
|
12 for i=1:M
|
samer@32
|
13 W(i,:) = olap_up(bins,fb_edges(i:i+1)) + olap_dn(bins,fb_edges(i+1:i+2));
|
samer@32
|
14 end
|
samer@32
|
15 W=sparse(W);
|
samer@32
|
16 end
|
samer@32
|
17
|
samer@32
|
18 function y=olap_up(bands,seg), [lx,cx]=intersect(bands,seg); y=lx.*(cx-seg(1))./(seg(2)-seg(1)); end
|
samer@32
|
19 function y=olap_dn(bands,seg), [lx,cx]=intersect(bands,seg); y=lx.*(seg(2)-cx)./(seg(2)-seg(1)); end
|
samer@32
|
20 function [lens,centres]=intersect(i1,i2),
|
samer@32
|
21 ivals=[max(i1(1,:),i2(1));min(i1(2,:),i2(2))]; % intersect intervals
|
samer@32
|
22 lens=max(ivals(2,:)-ivals(1,:),0); % positive lengths only
|
samer@32
|
23 centres=(ivals(2,:)+ivals(1,:))/2; % centres of intervals
|
samer@32
|
24 end
|