samer@1: % signal - Base class for signal samer@1: % samer@1: % signal :: signal(C:natural,R:nonneg). samer@1: % samer@1: % The signal(C,R) type denotes the type of a signal with C samer@1: % channels and a sampling rate of R. samer@1: % samer@1: % The base signal class cannot be used without subclassing since samer@1: % any attempt to instantiate the live signal generator will throw samer@1: % an exception. samer@1: % samer@1: % METHODS samer@1: % channels :: signal(C,R) -> natural. samer@1: % rate :: signal(C,R) -> nonneg. samer@1: % construct:: signal(C,R) -> livesig(C). samer@1: % length :: signal(C,R) -> natural. samer@1: % gather :: signal(C,R), options -> [[C,N]]. samer@1: % gathern :: N:natural, signal(C,R), options -> [[C,N]], natural. samer@1: % samer@1: % livesig(C) :== struct { samer@1: % start :: void->void; samer@1: % stop :: void->void; samer@1: % dispose :: void->void; samer@1: % reader :: N:natural -> (void->[[C,N]]); samer@1: % } samer@1: samer@1: classdef signal samer@3: methods (Abstract) samer@3: c=channels(s) samer@3: u=construct(s) samer@3: r=rate(s) samer@1: end samer@3: samer@1: methods samer@1: function s=signal, end samer@1: samer@1: function s=and(s1,s2), s=sigcat(s1,s2); end samer@1: function y=cache(x), y=reclock(rate(x),sigarray(gather(x))); end samer@1: function display(a) samer@1: disp(sprintf(' %s :: signal(%s,%s)',tostring(a),fmt(channels(a)),fmt(rate(a)))); samer@1: function s=fmt(x), if isnan(x), s='_'; else s=num2str(x); end; end samer@1: end samer@1: samer@1: function y=map(f,x), y=sigmap(f,x); end samer@1: function s=mpower(a,b), s=resample(b,a); end samer@1: function s=or(s1,s2), s=sigbinop(@vertcat,s1,s2,@plus); end samer@1: function s2=reclock(r,s1), s2=sigreclock(r,s1); end samer@1: function y=drop(n,x), y=sigdrop(n,x); end samer@1: function y=take(n,x), y=sigtake(n,x); end samer@1: samer@1: function y=dropt(t,x), samer@1: if isnan(rate(x)), error('Cannot dropt without definite sampling rate'); end samer@1: y=sigdrop(round(t*rate(x)),x); samer@1: end samer@1: samer@1: function y=taket(t,x), samer@1: if isnan(rate(x)), error('Cannot taket without definite sampling rate'); end samer@1: y=sigtake(round(t*rate(x)),x); samer@1: end samer@1: samer@1: function y=cycle(x), samer@1: y=siglzcat(x,@cyclef); samer@1: function [s1,sx]=cyclef, s1=x; sx=@cyclef; end samer@1: end samer@1: samer@1: function s2=resample(f2,s1,varargin) samer@1: if isnan(rate(s1)), error('no sample rate set'); end samer@1: if rate(s1)==f2, s2=s1; samer@1: else, s2=sigresample(f2,s1,varargin{:}); end samer@1: end samer@43: samer@43: function varargout=specgrm(x,varargin) samer@43: [varargout{1:nargout}]=specgrm(gather(x),varargin{:},'fs',rate(x)); samer@43: end samer@1: end samer@1: end