0001 function varargout = ao(varargin)
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052
0053
0054
0055
0056
0057
0058
0059
0060
0061
0062
0063
0064
0065
0066
0067
0068
0069
0070
0071
0072
0073
0074
0075
0076
0077
0078
0079
0080
0081
0082
0083
0084
0085
0086
0087
0088
0089
0090
0091
0092
0093
0094
0095
0096
0097
0098
0099
0100
0101
0102
0103
0104
0105
0106
0107
0108
0109
0110
0111
0112
0113
0114
0115
0116
0117
0118
0119
0120
0121
0122
0123
0124
0125
0126
0127
0128
0129 ALGONAME = mfilename;
0130 VERSION = '$Id: ao.m,v 1.56 2007/12/24 19:48:09 hewitson Exp $';
0131
0132
0133 if (nargin == 2 || nargin == 3) &&...
0134 isa(varargin{1}, 'ao') &&...
0135 ischar(varargin{2})
0136 if strcmp(varargin{2}, 'Params')
0137 if nargin == 2
0138 varargout{1} = getDefaultPlist();
0139 else
0140 varargout{1} = getDefaultPlist(varargin{3});
0141 end
0142 return
0143 elseif strcmp(varargin{2}, 'Version')
0144 varargout{1} = VERSION;
0145 return
0146 end
0147 end
0148
0149
0150
0151 args = [];
0152 k = 0;
0153 pls = [];
0154 for j=1:nargin
0155 if ~isempty(varargin{j})
0156 k = k + 1;
0157 if isa(varargin{j}, 'plist')
0158 pls = [pls varargin{j}];
0159 else
0160 args(k).val = varargin{j};
0161 args(k).n = j;
0162 end
0163 end
0164 end
0165
0166
0167 if isa(pls, 'plist')
0168 pl = combine(pls);
0169 else
0170 pl = [];
0171 end
0172
0173 Nargs = length(args);
0174 if ~isempty(pl)
0175 args(Nargs+1).val = pl;
0176 args(Nargs+1).n = j+1;
0177 Nargs = length(args);
0178 end
0179
0180
0181
0182 if Nargs > 0
0183 if ischar(args(1).val)
0184 if strcmp(args(1).val, 'SERVER')
0185 a = aoFromServer(args, VERSION, ALGONAME);
0186 varargout{1} = a;
0187 return
0188 end
0189 end
0190 end
0191
0192
0193
0194 if Nargs == 0
0195 a.name = 'None';
0196 a.data = {};
0197 a.hist = history(ALGONAME, VERSION);
0198 a.provenance = provenance;
0199 a.description = '';
0200 a.mfile = {};
0201 a.mfilename = '';
0202 a.mdlfile = '';
0203 a.mdlfilename = '';
0204 a.version = VERSION;
0205 a.created = time;
0206 varargout{1} = class(a, 'ao');
0207
0208
0209 elseif Nargs == 1
0210
0211 if isa(args(1).val, 'org.apache.xerces.dom.DeferredElementImpl')
0212 varargout{1} = fromxml(args(1).val);
0213
0214 elseif ischar(args(1).val)
0215
0216 filename = args(1).val;
0217 [path, name, ext, vers] = fileparts(filename);
0218 switch ext
0219 case '.mat'
0220 a = load(filename);
0221 a = a.a;
0222 case '.xml'
0223 a = xmlparse(ao, filename);
0224 case {'.txt', '.dat'}
0225 a = aoFromFilenameAndPlist(args(1).val, plist, VERSION, ALGONAME);
0226 otherwise
0227 error('### Unknown file type.');
0228 end
0229 varargout{1} = a;
0230
0231
0232
0233 elseif isa(args(1).val, 'ao')
0234 varargout{1} = args(1).val;
0235
0236
0237 elseif isstruct(args(1).val)
0238 astruct = args(1).val;
0239 a.name = astruct.name;
0240 data = astruct.data;
0241 if isstruct(data)
0242 if isfield(data, {'t', 'x'})
0243 data = tsdata(data);
0244 elseif isfield(data, {'f', 'xx'})
0245 data = fsdata(data);
0246 elseif isfield(data, {'vals'})
0247 data = cdata(data);
0248 elseif isfield(data, {'x', 'y'})
0249 data = xydata(data);
0250 elseif isfield(data, {'x', 'y', 'z'})
0251 data = xyzdata(data);
0252 else
0253 error('### Unknown data type in input structure.');
0254 end
0255 end
0256 a.data = data;
0257 hist = astruct.hist;
0258 if isstruct(hist)
0259 hist = history(hist);
0260 end
0261 a.hist = hist;
0262 prov = astruct.provenance;
0263 if isstruct(prov)
0264 prov = provenance(prov);
0265 end
0266 a.provenance = prov;
0267 a.description = astruct.description;
0268 a.mfile = astruct.mfile;
0269 a.mfilename = astruct.mfilename;
0270 a.mdlfile = astruct.mdlfile;
0271 a.mdlfilename = astruct.mdlfilename;
0272 a.version = astruct.version;
0273 created = astruct.created;
0274 if isstruct(created)
0275 created = time(created);
0276 end
0277 a.created = created;
0278 varargout{1} = class(a, 'ao');
0279
0280
0281
0282 elseif isnumeric(args(1).val)
0283
0284 a.name = 'const';
0285 a.data = cdata(args(1).val);
0286 a.hist = history(ALGONAME, VERSION, plist(param('vals', args(1).val)));
0287
0288 a.provenance = provenance;
0289 a.description = '';
0290 a.mfile = {};
0291 a.mfilename = '';
0292 a.mdlfile = '';
0293 a.mdlfilename = '';
0294 a.version = VERSION;
0295 a.created = time;
0296 varargout{1} = class(a, 'ao');
0297
0298
0299
0300 elseif isa(args(1).val, 'plist')
0301
0302 pl = args(1).val;
0303 filename = find(pl, 'filename');
0304 fcn = find(pl, 'fcn');
0305 vals = find(pl, 'vals');
0306 tsfcn = find(pl, 'tsfcn');
0307 win = find(pl, 'win');
0308 waveform = find(pl, 'waveform');
0309
0310 if ~isempty(filename)
0311
0312 [path, name, ext, vers] = fileparts(filename);
0313 switch ext
0314 case '.mat'
0315 a = load(filename);
0316 varargout{1} = a.a;
0317 case '.xml'
0318 varargout{1} = xmlparse(ao, filename);
0319 case {'.txt', '.dat'}
0320 varargout{1} = aoFromFilenameAndPlist(filename, pl, VERSION, ALGONAME);
0321 otherwise
0322 error('### Unknown file type.');
0323 end
0324
0325 elseif ~isempty(fcn)
0326
0327 varargout{1} = aoFromFcn(pl, VERSION, ALGONAME);
0328
0329 elseif ~isempty(vals)
0330
0331 varargout{1} = aoFromVals(vals, VERSION, ALGONAME);
0332
0333 elseif ~isempty(tsfcn)
0334
0335 varargout{1} = aoFromTSfcn(pl, VERSION, ALGONAME);
0336
0337 elseif ~isempty(win)
0338
0339 varargout{1} = aoFromSpecWin(win, VERSION, ALGONAME);
0340
0341 elseif ~isempty(waveform)
0342
0343 varargout{1} = aoFromWaveform(pl, VERSION, ALGONAME);
0344
0345 else
0346 error('### Unknown AO constructor method.');
0347 end
0348
0349
0350
0351 elseif isa(args(1).val, 'specwin')
0352 varargout{1} = aoFromSpecWin(args(1).val, VERSION, ALGONAME);
0353
0354
0355 else
0356 data = args(1).val;
0357 a.name = 'None';
0358 a.data = data;
0359 a.hist = history(ALGONAME, VERSION);
0360 a.provenance = provenance;
0361 a.description = '';
0362 a.mfile = {};
0363 a.mfilename = '';
0364 a.mdlfile = '';
0365 a.mdlfilename = '';
0366 a.version = VERSION;
0367 a.created = time;
0368 varargout{1} = class(a, 'ao');
0369 if ~isa(a.data, 'tsdata') &&...
0370 ~isa(a.data, 'fsdata') &&...
0371 ~isa(a.data, 'cdata') &&...
0372 ~isa(a.data, 'xydata') &&...
0373 ~isa(a.data, 'xyzdata')
0374 error('### unknown data object.')
0375 end
0376 end
0377
0378
0379
0380 elseif Nargs == 2
0381
0382
0383 if isa(varargin{1}, 'database')
0384 varargout{1} = retrieve(varargin{1}, varargin{2:end});
0385
0386
0387 elseif ischar(args(1).val) && isa(args(2).val, 'plist')
0388
0389 ao_out = aoFromFilenameAndPlist(args(1).val, args(2).val, VERSION, ALGONAME);
0390
0391 if nargout == 1
0392 varargout{1} = ao_out;
0393 elseif nargout == length(ao_out)
0394 for ii = 1:length(ao_out)
0395 varargout{ii} = ao_out(ii);
0396 end
0397 else
0398 warning ('### Too few output variables --> useing only the first.');
0399 varargout{1} = ao_out;
0400 end
0401
0402
0403 else
0404
0405 a.name = 'None';
0406 a.data = args(1).val;
0407 a.hist = args(2).val;
0408 a.provenance = provenance;
0409 a.description = '';
0410 a.mfile = {};
0411 a.mfilename = '';
0412 a.mdlfile = '';
0413 a.mdlfilename = '';
0414 a.version = VERSION;
0415 a.created = time;
0416 varargout{1} = class(a, 'ao');
0417 if ~isa(a.data, 'tsdata') &&...
0418 ~isa(a.data, 'fsdata') &&...
0419 ~isa(a.data, 'cdata') &&...
0420 ~isa(a.data, 'xydata')
0421 error('### unknown data object.')
0422 end
0423 if ~isa(a.hist, 'history')
0424 error('### unknown history object.')
0425 end
0426
0427 end
0428
0429
0430
0431
0432 elseif Nargs == 9
0433
0434 a.name = args(1).val;
0435 a.data = args(2).val;
0436 a.hist = args(3).val;
0437 a.provenance = args(4).val;
0438 a.description = args(5).val;
0439 a.mfile = args(6).val;
0440 a.mfilename = args(7).val;
0441 a.mdlfile = args(8).val;
0442 a.mdlfilename = args(9).val;
0443 a.version = VERSION;
0444 a.created = time;
0445 varargout{1} = class(a, 'ao');
0446
0447 else
0448 error('### Unknown number of constructor arguments.');
0449 end
0450
0451
0452
0453
0454 function a = aoFromVals(vals, VERSION, ALGONAME)
0455
0456
0457 ts = cdata(plist(param('vals', vals)));
0458 ts = set(ts, 'name', 'Data');
0459
0460
0461 a.name = 'Data';
0462 a.data = ts;
0463 a.hist = history(ALGONAME, VERSION, plist(param('vals', vals)));
0464 a.provenance = provenance;
0465 a.description = '';
0466 a.mfile = {};
0467 a.mfilename = '';
0468 a.mdlfile = '';
0469 a.mdlfilename = '';
0470 a.version = VERSION;
0471 a.created = time;
0472 a = class(a, 'ao');
0473
0474
0475
0476
0477
0478
0479 function a = aoFromWaveform(pl, VERSION, ALGONAME)
0480
0481 waveform = find(pl, 'waveform');
0482 switch waveform
0483
0484 case 'sine wave'
0485 freq = find(pl, 'f');
0486 phi = find(pl, 'phi');
0487 tsfcn = sprintf('sin(2*pi*%g*t + %g*pi/180)', freq, phi);
0488
0489 case 'noise'
0490 ntype = find(pl, 'type');
0491 if isempty(ntype)
0492 ntype = 'Normal';
0493 end
0494 switch ntype
0495 case 'Normal'
0496 tsfcn = 'randn(size(t))';
0497 case 'Uniform'
0498 tsfcn = 'rand(size(t))';
0499 end
0500
0501 case 'chirp'
0502 f0 = find(pl, 'f0');
0503 fe = find(pl, 'f1');
0504 te = find(pl, 't1');
0505 tsfcn = sprintf('chirp(t,%g,%g,%g)', f0, fe, te);
0506
0507 case 'Gaussian pulse'
0508 fc = find(pl, 'f0');
0509 bw = find(pl, 'bw');
0510 tsfcn = sprintf('gauspuls(t,%g,%g)', fc, bw);
0511 case 'Square wave'
0512 freq = find(pl, 'f');
0513 duty = find(pl, 'duty');
0514 tsfcn = sprintf('square(2*pi*%g*t,%g)', freq, duty);
0515 case 'Sawtooth'
0516 freq = find(pl, 'f');
0517 width = find(pl, 'width');
0518 tsfcn = sprintf('sawtooth(2*pi*%g*t,%g)', freq, width);
0519 end
0520
0521 nsecs = find(pl, 'nsecs');
0522 fs = find(pl, 'fs');
0523
0524
0525 t = linspace(0, nsecs-1/fs, nsecs*fs);
0526
0527 eval(['y=' tsfcn ';']);
0528
0529 ts = tsdata(t,y);
0530 ts = set(ts, 'name', tsfcn);
0531 ts = set(ts, 'xunits', 's');
0532 ts = set(ts, 'yunits', 'V');
0533
0534
0535 a.name = waveform;
0536 a.data = ts;
0537 a.hist = history(ALGONAME, VERSION, pl);
0538 a.provenance = provenance;
0539 a.description = '';
0540 a.mfile = {};
0541 a.mfilename = '';
0542 a.mdlfile = '';
0543 a.mdlfilename = '';
0544 a.version = VERSION;
0545 a.created = time;
0546 a = class(a, 'ao');
0547
0548
0549
0550
0551
0552
0553 function a = aoFromTSfcn(pl, VERSION, ALGONAME)
0554
0555 nsecs = find(pl, 'nsecs');
0556 fs = find(pl, 'fs');
0557 fcn = find(pl, 'tsfcn');
0558 randn_state = find(pl, 'rand_state');
0559
0560
0561 t = linspace(0, nsecs-1/fs, nsecs*fs);
0562
0563
0564
0565
0566
0567 if ~isempty(randn_state)
0568 randn('state',randn_state);
0569 else
0570 randn_state = randn('state');
0571 pl = append(pl , 'rand_state', randn_state);
0572 end
0573
0574 y = eval([fcn ';']);
0575
0576 ts = tsdata(t,y);
0577 ts = set(ts, 'name', fcn);
0578 ts = set(ts, 'xunits', 's');
0579 ts = set(ts, 'yunits', 'V');
0580
0581
0582 a.name = 'TSfcn';
0583 a.data = ts;
0584 a.hist = history(ALGONAME, VERSION, pl);
0585 a.provenance = provenance;
0586 a.description = '';
0587 a.mfile = {};
0588 a.mfilename = '';
0589 a.mdlfile = '';
0590 a.mdlfilename = '';
0591 a.version = VERSION;
0592 a.created = time;
0593 a = class(a, 'ao');
0594
0595
0596
0597
0598 function a = aoFromFcn(pl, VERSION, ALGONAME)
0599
0600 fcn = find(pl, 'fcn');
0601
0602
0603 ts = cdata(plist(param('fcn', fcn)));
0604 ts = set(ts, 'name', fcn);
0605
0606
0607 a.name = fcn;
0608 a.data = ts;
0609 a.hist = history(ALGONAME, VERSION, pl);
0610 a.provenance = provenance;
0611 a.description = '';
0612 a.mfile = {};
0613 a.mfilename = '';
0614 a.mdlfile = '';
0615 a.mdlfilename = '';
0616 a.version = VERSION;
0617 a.created = time;
0618 a = class(a, 'ao');
0619
0620
0621
0622
0623 function a = aoFromFilenameAndPlist(file_name, pl, VERSION, ALGONAME)
0624
0625 a = [];
0626
0627
0628
0629 [pathstr, f_name, ext] = fileparts(file_name);
0630
0631
0632 pl_default = plist('columns', [1 2], ...
0633 'num_columns', 10, ...
0634 'type', 'tsdata', ...
0635 'use_fs', '', ...
0636 'comment_char', '%', ...
0637 'xunits', 'sec', ...
0638 'yunits', 'V');
0639 pl = combine(pl, pl_default);
0640
0641 pl = pset(pl, param('filename', [f_name ext]));
0642 pl = pset(pl, param('filepath', pathstr));
0643
0644 data_type = find (pl, 'type');
0645 columns = find (pl, 'columns');
0646 num_columns = find (pl, 'num_columns');
0647 comment_char = find (pl, 'comment_char');
0648 use_fs = find (pl, 'use_fs');
0649
0650
0651 [fid,msg] = fopen (file_name, 'r');
0652 if (fid < 0)
0653 error ('### can not open file: %s \n\n### error msg:',file_name, msg);
0654 end
0655
0656
0657 scan_format = [];
0658 for ii=1:num_columns
0659 scan_format = [scan_format '%f '];
0660 end
0661 scan_format = scan_format(1:end-1);
0662
0663
0664 raw_data = textscan( fid, scan_format, ...
0665 'commentStyle', comment_char, ...
0666 'CollectOutput', 1);
0667 f_data = raw_data{1};
0668
0669 if isempty(f_data)
0670 error([char(10) '### There are no data. ' ...
0671 'Did you use the right comment character?' char(10) ...
0672 '### The current comment character is: ' comment_char char(10) ...
0673 '### Use a parameter list with the parameter:' char(10) ...
0674 '### plist(''comment_char'', ''%'')']);
0675 end
0676
0677 fclose(fid);
0678
0679
0680 if isempty(use_fs)
0681
0682
0683 if mod(length(columns),2) ~= 0
0684 error('### the numbers in columns must be straight');
0685 end
0686
0687 for lauf = 1:length(columns)/2
0688
0689 data_x_axes = f_data(:, columns(lauf*2-1));
0690 data_y_axes = f_data(:, columns(lauf*2));
0691
0692
0693 ao_data = [];
0694 switch data_type
0695 case 'tsdata'
0696 ao_data = tsdata( data_x_axes, data_y_axes);
0697 case 'fsdata'
0698 ao_data = fsdata( data_x_axes, data_y_axes);
0699 case 'cdata'
0700 error ('### please code me up')
0701 case 'xydata'
0702 ao_data = xydata( data_x_axes, data_y_axes);
0703 otherwise
0704 error('### unknown data type ''%s''', data_type);
0705 end
0706 ao_data.name = sprintf('f_name_%02d', lauf);
0707
0708 aa = [];
0709 aa.name = sprintf('f_name_%02d', lauf);
0710 aa.data = ao_data;
0711 aa.hist = history(ALGONAME, VERSION, pl);
0712 aa.provenance = provenance;
0713
0714
0715 description_pl = find(pl, 'description');
0716 if ~isempty(description_pl)
0717 aa.description = description_pl;
0718 else
0719 aa.description = '';
0720 end
0721
0722 aa.mfile = {};
0723 aa.mfilename = '';
0724 aa.mdlfile = '';
0725 aa.mdlfilename = '';
0726 aa.version = VERSION;
0727 aa.created = time;
0728 aa = class(aa, 'ao');
0729
0730 a = [a aa];
0731
0732 end
0733
0734
0735 else
0736
0737 for lauf = 1:length(columns)
0738
0739 data_y_axes = f_data(:, columns(lauf));
0740
0741
0742 ao_data = [];
0743 switch data_type
0744 case 'tsdata'
0745 ao_data = tsdata(data_y_axes, use_fs);
0746 case 'fsdata'
0747 ao_data = fsdata(data_y_axes, use_fs);
0748 case 'cdata'
0749 error ('### please code me up')
0750 case 'xydata'
0751 error ('### please code me up')
0752 otherwise
0753 error('### unknown data type ''%s''', data_type);
0754 end
0755 ao_data.name = sprintf('f_name_%02d', lauf);
0756
0757 aa = [];
0758 aa.name = sprintf('f_name_%02d', lauf);
0759 aa.data = ao_data;
0760 aa.hist = history(ALGONAME, VERSION, pl);
0761 aa.provenance = provenance;
0762
0763
0764 description_pl = find(pl, 'description');
0765 if ~isempty(description_pl)
0766 aa.description = description_pl;
0767 else
0768 aa.description = '';
0769 end
0770
0771 aa.mfile = {};
0772 aa.mfilename = '';
0773 aa.mdlfile = '';
0774 aa.mdlfilename = '';
0775 aa.version = VERSION;
0776 aa.created = time;
0777 aa = class(aa, 'ao');
0778
0779 a = [a aa];
0780
0781 end
0782
0783 end
0784
0785
0786 for ii = 1:length(a)
0787 fields = fieldnames(a(ii).data);
0788
0789 for jj = 1:length(pl.params)
0790 parameter = pl.params(jj);
0791
0792 if ismember(parameter.key, fields)
0793
0794 if iscell(parameter.val)
0795 if length(parameter.val) > 1
0796 if length(parameter.val) ~= length(a)
0797 warning([sprintf('The values of the key ''%s'' ', parameter.key) ...
0798 'have not the same length as the lenthg of ' ...
0799 'the output. Using the first value!']);
0800 a(ii).data.(parameter.key) = parameter.val{1};
0801 else
0802 a(ii).data.(parameter.key) = parameter.val{ii};
0803 end
0804 else
0805 a(ii).data.(parameter.key) = parameter.val{1};
0806 end
0807 else
0808 a(ii).data.(parameter.key) = parameter.val;
0809 end
0810
0811 end
0812 end
0813 end
0814
0815
0816
0817
0818
0819 function a = aoFromSpecWin(win, VERSION, ALGONAME)
0820
0821
0822 ts = cdata(win.win);
0823 ts = set(ts, 'name', win.name);
0824
0825
0826 a.name = win.name;
0827 a.data = ts;
0828 a.hist = history(ALGONAME, VERSION, plist(param('win', win)));
0829 a.provenance = provenance;
0830 a.description = '';
0831 a.mfile = {};
0832 a.mfilename = '';
0833 a.mdlfile = '';
0834 a.mdlfilename = '';
0835 a.version = VERSION;
0836 a.created = time;
0837 a = class(a, 'ao');
0838
0839
0840
0841
0842
0843
0844 function bs = aoFromServer(args, VERSION, ALGONAME);
0845
0846
0847 bs = retrieve(args(2).val, [args(3:end).val]);
0848
0849
0850
0851
0852
0853 function out = getDefaultPlist(varargin)
0854
0855
0856 sets = {'From XML file', 'From ASCII file', 'Function', 'Values',...
0857 'Time-series Function', 'From Window', 'Waveform'};
0858
0859 if nargin == 0
0860 out = sets;
0861 return
0862 end
0863
0864 set = varargin{1};
0865
0866 switch set
0867 case 'From XML file'
0868 out = plist('filename', 'foo.xml');
0869 case 'From ASCII file'
0870 out = plist('filename', 'foo.txt',...
0871 'type', 'tsdata',...
0872 'columns', [1 2],...
0873 'num_columns', 10,...
0874 'comment_char', '%');
0875 case 'Function'
0876 out = plist('fcn', 'randn(100,1)');
0877 case 'Values'
0878 out = plist('vals', [1 2 3]);
0879 case 'Time-series Function'
0880 out = plist('tsfcn', 'randn(size(t))', 'fs', 10, 'nsecs', 100);
0881 case 'From Window'
0882 out = plist('win', specwin('Hanning', 100));
0883 case 'Waveform'
0884 out = plist('waveform', 'sine wave',...
0885 'f', 1.23,...
0886 'phi', 0,...
0887 'fs', 10,...
0888 'nsecs', 10);
0889 otherwise
0890 out = plist();
0891 end
0892
0893
0894