samer@0
|
1 % abufsig - Arrow which produces multiple buffered frames from a signal
|
samer@0
|
2 %
|
samer@0
|
3 % abufsig ::
|
samer@0
|
4 % signal(C,R),
|
samer@0
|
5 % N:natural ~'block size',
|
samer@0
|
6 % M:natural ~'hop size',
|
samer@0
|
7 % L:natural ~'buffer width'
|
samer@0
|
8 % -> arrow({},{[[N*C,L]]}).
|
samer@0
|
9 %
|
samer@0
|
10 % abufsig ::
|
samer@0
|
11 % signal(C,R),
|
samer@0
|
12 % N:natural ~'block size',
|
samer@0
|
13 % M:natural ~'hop size'
|
samer@0
|
14 % -> arrow({},{[[N*C,1]]]}).
|
samer@0
|
15 %
|
samer@0
|
16 % abufsig ::
|
samer@0
|
17 % signal(C,R),
|
samer@0
|
18 % N:natural ~'block size',
|
samer@0
|
19 % -> arrow({},{[[C*N,1]]]}).
|
samer@0
|
20 %
|
samer@0
|
21 % If hop size is omitted, it defaults to the block size.
|
samer@0
|
22 % If buffer width is omitted, it defaults to 1.
|
samer@0
|
23
|
samer@0
|
24 function o=abufsig(source,block,hop,width)
|
samer@0
|
25 if nargin<4, width=1; end
|
samer@0
|
26 if nargin<3, hop=block; end
|
samer@0
|
27
|
samer@0
|
28 ch=channels(source);
|
samer@0
|
29 if (mod(block,ch)>0 || mod(hop,ch))
|
samer@0
|
30 error('Block size and hop must be a multiple of channel count');
|
samer@0
|
31 end
|
samer@0
|
32
|
samer@0
|
33 if width==1,
|
samer@0
|
34 o=asignal(source,block/ch,hop/ch)*arr(@flt);
|
samer@0
|
35 else
|
samer@0
|
36 olap = block-hop;
|
samer@0
|
37 span = (hop*(width-1)+block);
|
samer@0
|
38 jump = (hop*width);
|
samer@0
|
39 o=asignal(source,span/ch,jump/ch)*arr(@buf);
|
samer@0
|
40 end
|
samer@0
|
41
|
samer@0
|
42 function y=flt(x), y=x(:); end
|
samer@0
|
43 function y=buf(x), y=buffer(x(:),block,olap,'nodelay'); end
|
samer@0
|
44 end
|
samer@0
|
45
|