samer@0
|
1 function a=bufferdata(source,L,varargin)
|
samer@0
|
2 % bufferdata - collect elements of sequence into sequence of arrays
|
samer@0
|
3 %
|
samer@0
|
4 % bufferdata ::
|
samer@0
|
5 % data [[N]] ~'source signal',
|
samer@0
|
6 % L:natural ~'buffer width',
|
samer@0
|
7 % -> data [[N,L]]. ~'buffered sequence (no-overlapping)'.
|
samer@0
|
8
|
samer@0
|
9
|
samer@0
|
10 if nargin==1 && isa(source,'bufferdata'), a=source;
|
samer@0
|
11 elseif nargin==0, a=bufferdata([],1);
|
samer@0
|
12 else
|
samer@0
|
13 sz=size1(source);
|
samer@0
|
14
|
samer@0
|
15 a.dim = length(sz)+1;
|
samer@0
|
16 a.width = L;
|
samer@0
|
17 [a.buf,source] = readcat(a.dim,source,L);
|
samer@0
|
18
|
samer@0
|
19 if isempty(a.buf), a=[];
|
samer@0
|
20 else
|
samer@0
|
21 % sort out function table
|
samer@0
|
22 ft.datafn=@datafn;
|
samer@0
|
23 ft.stringfn=@stringfn;
|
samer@0
|
24 ft.nextfn = @nextfn;
|
samer@0
|
25
|
samer@0
|
26 a=class(a,'bufferdata',ddata(source,[sz L],ft));
|
samer@0
|
27 end
|
samer@0
|
28 end
|
samer@0
|
29
|
samer@0
|
30 function s=stringfn(a), s=sprintf('buffer(%d)',a.width);
|
samer@0
|
31 function x=datafn(a), x=a.buf;
|
samer@0
|
32 function a=nextfn(a)
|
samer@0
|
33 % read next lot of values and make an array
|
samer@0
|
34 src=source(a);
|
samer@0
|
35 [a.buf,src]=readcat(a.dim,source(a),a.width);
|
samer@0
|
36 if isempty(a.buf), a=[];
|
samer@0
|
37 else
|
samer@0
|
38 a=setsource(a,src);
|
samer@0
|
39 %!! what if i<L?
|
samer@0
|
40 %a.length=size(source(a),a.dim);
|
samer@0
|
41 end
|
samer@0
|
42
|
samer@0
|
43 function [buf,src]=readcat(dim,src,L)
|
samer@0
|
44 buf=[];
|
samer@0
|
45 for i=1:L
|
samer@0
|
46 if isempty(src), break; end
|
samer@0
|
47 buf=cat(dim,buf,head(src));
|
samer@0
|
48 src=next(src);
|
samer@0
|
49 end
|
samer@0
|
50
|