annotate arrows/abufsig.m @ 6:0ce3c2070089

Removed duplicate code and fixed doc in timed_action.
author samer
date Mon, 14 Jan 2013 14:33:37 +0000
parents 672052bd81f8
children
rev   line source
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