Mercurial > hg > ltpda
view m-toolbox/classes/@ao/fromWaveform.m @ 5:5a49956df427 database-connection-manager
LTPDAPreferences panel for new LTPDADatabaseConnectionManager
author | Daniele Nicolodi <nicolodi@science.unitn.it> |
---|---|
date | Mon, 05 Dec 2011 16:20:06 +0100 |
parents | f0afece42f48 |
children |
line wrap: on
line source
% FROMWAVEFORM Construct an ao from a waveform %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % FUNCTION: fromWaveform % % DESCRIPTION: Construct an ao from a waveform % % CALL: a = fromWaveform(pl) % % PARAMETER: pl: Parameter list object % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function a = fromWaveform(a, pli, callerIsMethod) VERSION = '$Id: fromWaveform.m,v 1.44 2011/08/15 10:42:38 hewitson Exp $'; if callerIsMethod % do nothing else % get AO info ii = ao.getInfo('ao', 'From Waveform'); % Set the method version string in the minfo object ii.setMversion([VERSION '-->' ii.mversion]); end if callerIsMethod pl = pli; else % Combine input plist with default values pl = applyDefaults(ii.plists, pli); end nsecs = find(pl, 'nsecs'); fs = find(pl, 'fs'); t0 = find(pl, 't0'); waveform = find(pl, 'waveform'); if numel(nsecs) == 1 if isempty(nsecs) || nsecs == 0 error('### Please provide ''Nsecs'' for waveform constructor.'); end end if isempty(fs) || fs == 0 error('### Please provide ''fs'' for waveform constructor.'); end % Override defaults if isempty(t0) t0 = time(0); elseif ischar(t0) || isnumeric(t0) t0 = time(t0); end if isempty(find(pl, 'name')) pl.pset('Name', waveform); end switch lower(waveform) %------------ Sine Wave case {'sine wave', 'sinewave', 'sine-wave', 'sine'} ampl = find(pl, 'A'); freq = find(pl, 'f'); phi = find(pl, 'phi'); Toff = find(pl, 'Toff'); gaps = find(pl, 'gaps'); % If Toff is a time-string or a time object then convert this time % into a number of seconds depending to T0 if ischar(Toff) || iscell(Toff) || isa(Toff, 'plist') % If the t0 is the default value then set it to the first value of Toff if strcmpi(find(pl, 't0'), '1970-01-01 00:00:00.000') t0 = time(Toff(1)); end newToff = []; if ischar(Toff) newToff = (time(Toff).utc_epoch_milli - t0.utc_epoch_milli) /1e3; else Toff = time(Toff); for zz = 1:numel(Toff) newToff = [newToff (Toff(zz).utc_epoch_milli - t0.utc_epoch_milli)/1e3]; end end Toff = newToff; end % The user specified gaps instead of offsets. % (The gap is before the signal starts) if isempty(pli.find('Toff')) && ~isempty(gaps) Toff(1) = gaps(1); for ww = 2:numel(nsecs) Toff(ww) = sum(gaps(1:ww)) + sum(nsecs(1:ww-1)); end end % If the number of Amplitude, frequency and phase are not the same % then duplicate the last specified value. max_waves = max([numel(ampl), numel(freq), numel(phi), numel(nsecs), numel(Toff)]); ampl = [ampl, repmat(ampl(end), 1, max_waves - numel(ampl))]; freq = [freq, repmat(freq(end), 1, max_waves - numel(freq))]; phi = [phi, repmat(phi(end), 1, max_waves - numel(phi))]; nsecs = [nsecs, repmat(nsecs(end), 1, max_waves - numel(nsecs))]; Toff = [Toff, repmat(Toff(end), 1, max_waves - numel(Toff))]; %%%%%%%%%%%%%%%%%%%% add different sine waves with time offset %%%%%%%%%%%%%%%%%%%% maxValues = 0; % Predefine the total result with zeros for kk = 1:numel(Toff) values = (Toff(kk) + nsecs(kk)) * fs; if maxValues < values maxValues = values; end end total = zeros(maxValues, 1); % Over all sine waves for kk = 1:numel(Toff) % Compute the y-values of each sine wave t = 0 : 1/fs : nsecs(kk)-1/fs; y = ampl(kk) * sin(2*pi*freq(kk)*t + phi(kk)); % Add the computed values to the total result begT = floor(Toff(kk)*fs); endT = begT + nsecs(kk)*fs; idx = begT+1:endT; total(idx) = total(idx) + y.'; end if isempty(total) error('### You have defined a sine-wave with the length zero.'); end ts = tsdata(total, fs); ts.setXunits(find(pl, 'xunits')); ts.setYunits(find(pl, 'yunits')); ts.setT0(t0); % Make an analysis object a.data = ts; if callerIsMethod % do nothing % At the moment, we keep adding the history. % There might be something we need for rebuilding, like RAND_STREAM a.addHistory(ii, pl, [], []); else % Add history a.addHistory(ii, pl, [], []); end % Set some procedure information a.procinfo = plist('start times', time(t0.utc_epoch_milli/1e3 + Toff)); % Set the object properties from the plist a.setObjectProperties(pl); % This is a special case where we don't evaluate a string function % but build the values according to the recipe. As such we have % already handled the setting of properties and history and we can % return here. return case 'noise' ntype = find(pl, 'type'); pl.getSetRandState(); if isempty(ntype) ntype = 'Normal'; end sigma = find(pl, 'sigma'); if isempty(sigma) sigma = 1; end switch lower(ntype) case 'normal' tsfcn = sprintf('%g.*randn(size(t))', sigma); case 'uniform' tsfcn = sprintf('%g.*rand(size(t))', sigma); end %------------ Chirp case 'chirp' f0 = find(pl, 'f0'); fe = find(pl, 'f1'); te = find(pl, 't1'); if isempty(f0) f0 = 0; end if isempty(fe) fe = fs/2; end if isempty(te) te = nsecs; end tsfcn = sprintf('chirp(t,%g,%g,%g)', f0, fe, te); %------------ Gaussian pulse case {'gaussian pulse', 'gaussian-pulse'} fc = find(pl, 'f0'); bw = find(pl, 'bw'); if isempty(fc) fc = 1; end if isempty(bw) bw = fs/2; end tsfcn = sprintf('gauspuls(t,%g,%g)', fc, bw); case {'square wave', 'squarewave', 'square-wave', 'square'} freq = find(pl, 'f'); duty = find(pl, 'duty'); if isempty(freq) freq = 1; end if isempty(duty) duty = 50; end tsfcn = sprintf('square(2*pi*%g*t,%g)', freq, duty); case {'saw tooth', 'sawtooth', 'saw-tooth', 'saw'} freq = find(pl, 'f'); width = find(pl, 'width'); if isempty(freq) freq = 1; end if isempty(width) width = 0.5; end tsfcn = sprintf('sawtooth(2*pi*%g*t,%g)', freq, width); otherwise error('### Unknown waveform type [%s]', waveform); end % construct tsdata t = 0 : 1/fs : nsecs-1/fs; % t = linspace(0, nsecs(kk)-1/fs, nsecs(kk)*fs); % make y data y = eval([tsfcn ';']); ts = tsdata(t, y'); ts.setT0(t0); ts.setXunits(find(pl, 'xunits')); ts.setYunits(find(pl, 'yunits')); % Make an analysis object a.data = ts; if callerIsMethod % do nothing % At the moment, we keep adding the history. % There might be something we need for rebuilding, like RAND_STREAM a.addHistory(ii, pl, [], []); else % Add history a.addHistory(ii, pl, [], []); end % Set the object properties from the plist a.setObjectProperties(pl); end