Mercurial > hg > ishara
annotate signals/@signal/gather.m @ 1:289445d368a7
import.
author | samer |
---|---|
date | Wed, 19 Dec 2012 22:46:05 +0000 |
parents | |
children |
rev | line source |
---|---|
samer@1 | 1 % gather - collect all samples from a finite signal |
samer@1 | 2 % gather :: signal(C,R), options -> [[C,N]]. |
samer@1 | 3 function x=gather(sig,varargin) |
samer@1 | 4 opts=prefs('chunk',256,'init',512,'grow',2,'max',1e9,varargin{:}); |
samer@1 | 5 |
samer@1 | 6 s=construct(sig); |
samer@1 | 7 try % to make sure we dispose of s once opened |
samer@1 | 8 chunk=uint32(opts.chunk); |
samer@1 | 9 n=uint32(0); CHUNK=1:chunk; |
samer@1 | 10 cap=opts.init; % initial capacity of buffer |
samer@1 | 11 x=zeros(channels(sig),cap); % buffer |
samer@1 | 12 r=s.reader(opts.chunk); |
samer@1 | 13 rem=0; |
samer@1 | 14 s.start(); |
samer@1 | 15 while rem==0 |
samer@1 | 16 if n+chunk>cap % need more room |
samer@1 | 17 if n>opts.max, error('maximum capacity exceeded'); end |
samer@1 | 18 cap=opts.grow*cap; |
samer@1 | 19 x=repmat(x,1,opts.grow); |
samer@1 | 20 end |
samer@1 | 21 [x(:,n+CHUNK),rem]=r(); |
samer@1 | 22 n=n+chunk; |
samer@1 | 23 end |
samer@1 | 24 n=n-rem; % remove rem samples from end |
samer@1 | 25 catch ex |
samer@1 | 26 s.dispose(); |
samer@1 | 27 rethrow(ex); |
samer@1 | 28 end |
samer@1 | 29 s.stop(); |
samer@1 | 30 s.dispose(); |
samer@1 | 31 x=x(:,1:n); % grab only valid samples |
samer@1 | 32 end |
samer@1 | 33 |