Mercurial > hg > ltpda
diff m-toolbox/sltpda/getBlockCommands.m @ 0:f0afece42f48
Import.
author | Daniele Nicolodi <nicolodi@science.unitn.it> |
---|---|
date | Wed, 23 Nov 2011 19:22:13 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/m-toolbox/sltpda/getBlockCommands.m Wed Nov 23 19:22:13 2011 +0100 @@ -0,0 +1,848 @@ +function cmds = getBlockCommands(blocks) + +% GETBLOCKCOMMANDS get a set of commands from a set of sLTPDA blocks. +% +% M Hewitson 27-03-07 +% + + +disp(' + compiling block list'); + +cmds = []; + +for j=1:length(blocks) + b = blocks(j); + blocktype = get(b, 'BlockType'); + maskType = get(b, 'MaskType'); + name = get(b, 'Name'); + if ~strcmp(name, 'variable') + parent = get(b, 'Parent'); + name = [parent '_' name]; + name = sltpda_reduceVarName(name); + + if ~strcmp(blocktype, 'Outport') && ~strcmp(blocktype, 'Inport') && ~strcmp(maskType, 'loop') + fcn = getFcnName(b); + if ~isempty(fcn) + + % Get my inputs and outputs + [inames, onames] = getIOnames(get(b, 'PortHandles'), name); + + % Get my parameters + [params, pl] = getParameters(b); + + % Form command + % cmd = buildCmd(inames, onames, params, fcn); + cmd = sltpda_buildCmd(inames, onames, params, fcn); + + % store info + info.fcn = fcn; + info.params = params; + info.plist = pl; + info.ins = inames; + info.outs = onames; + info.outsUsed = []; + info.cmd = cmd; + info.name = get(b, 'Name'); + info.handle = get(b, 'Handle'); + info.ranges = []; + + cmds = [cmds info]; + end + end + end +end + + +%-------------------------------------------------------------------------- +% Get parameters from block mask +% +% MaskPromptString, MaskVariables, MaskValueString +% +function [params, pl] = getParameters(block) + +params = []; +pl = plist(); +try + maskType = get(block, 'MaskType'); +end + +if ~isempty(maskType) + switch maskType + + case 'ltpda_tfe' + [params, pl] = get_ltpda_tfe_params(block); + case 'ltpda_pwelch' + [params, pl] = get_ltpda_pwelch_params(block); + case 'plot' + [params, pl] = get_plot_params(block); + case 'ao' + [params, pl] = get_ao_params(block); + case 'filter' + [params, pl] = get_filter_params(block); + case 'get' + [params, pl] = get_get_params(block); + case 'rdivide' + [params, pl] = get_mrdivide_params(block); + case 'minus' + [params, pl] = get_minus_params(block); + case 'plus' + [params, pl] = get_plus_params(block); + case 'times' + [params, pl] = get_mtimes_params(block); + case 'sqrt' + [params, pl] = get_sqrt_params(block); + case 'abs' + [params, pl] = get_abs_params(block); + case 'split' + [params, pl] = get_split_params(block); + case 'demux' + [params, pl] = get_demux_params(block); + case 'ltpda_timedomainfit' + [params, pl] = get_ltpda_timedomainfit_params(block); + case 'ltpda_lincom' + [params, pl] = get_ltpda_lincom_params(block); + case 'ltpda_polydetrend' + [params, pl] = get_ltpda_polydetrend_params(block); + case 'ltpda_lpsd' + [params, pl] = get_ltpda_lpsd_params(block); + case 'save' + [params, pl] = get_save_params(block); + case 'resample' + [params, pl] = get_resample_params(block); + case 'pzmresp' + [params, pl] = get_pzmresp_params(block); + case 'convert' + [params, pl] = get_convert_params(block); + case 'param' + [params, pl] = get_param_params(block); + case 'iparam' + [params, pl] = get_iparam_params(block); + case 'specwin' + [params, pl] = get_specwin_params(block); + case 'plist' + [params, pl] = get_plist_params(block); + case 'display' + pl = []; + params = ''; + case 'pole' + [params, pl] = get_pole_params(block); + case 'zero' + [params, pl] = get_zero_params(block); + case 'pzmodel' + [params, pl] = get_pzmodel_params(block); + case 'resp' + [params, pl] = get_resp_params(block); + case 'miir' + [params, pl] = get_miir_params(block); + case 'iirResp' + [params, pl] = get_iirResp_params(block); + otherwise + warning(['### unknown mask type ' maskType]); + end +else + pl = plist(); + params = []; +end + +%-------------------------------------------------------------------------- +% Get parameters for abs block. +% +function [params, pl] = get_abs_params(block) + +% build output +pl = plist(); +params = ''; + +%-------------------------------------------------------------------------- +% Get parameters for iirResp block. +% +function [params, pl] = get_iirResp_params(block) + +f1 = get(block, 'f1'); +f2 = get(block, 'f2'); +nf = get(block, 'nf'); + +if isempty(f1) + f1 = '[]'; +end +if isempty(f2) + f2 = '[]'; +end +if isempty(nf) + nf = '[]'; +end +% build output +pl = plist( [param('f1', eval(f1)) param('f2', eval(f2)) param('nf', eval(nf))] ); +params = string(pl); + +%-------------------------------------------------------------------------- +% Get parameters for miir block. +% +function [params, pl] = get_miir_params(block) + +fs = get(block, 'fs'); + +if isempty(fs) + fs = '[]'; +end +% build output +pl = plist( param('fs', eval(fs)) ); +params = string(pl); + +%-------------------------------------------------------------------------- +% Get parameters for resp block. +% +function [params, pl] = get_resp_params(block) + +f1 = get(block, 'f1'); +f2 = get(block, 'f2'); +nf = get(block, 'nf'); +scale = get(block, 'scale'); + +if isempty(f1) + f1 = '[]'; +end +if isempty(f2) + f2 = '[]'; +end +if isempty(nf) + nf = '[]'; +end +% build output +pl = plist( [param('f1', eval(f1)) param('f2', eval(f2)) param('nf', eval(nf)) param('scale', scale)] ); +params = string(pl); + + +%-------------------------------------------------------------------------- +% Get parameters for pzmodel block. +% +function [params, pl] = get_pzmodel_params(block) + +% build output +pl = plist(); +params = ''; + +%-------------------------------------------------------------------------- +% Get parameters for zero block. +% +function [params, pl] = get_zero_params(block) + +f = get(block, 'zerof'); +q = get(block, 'zeroQ'); +if isempty(q) + q = '0'; +end + +% build output +pl = plist( [param('f', eval(f)) param('q', eval(q))] ); +params = string(pl); + + +%-------------------------------------------------------------------------- +% Get parameters for pole block. +% +function [params, pl] = get_pole_params(block) + +f = get(block, 'polef'); +q = get(block, 'poleQ'); +if isempty(q) + q = '0'; +end + +% build output +pl = plist( [param('f', eval(f)) param('q', eval(q))] ); +params = string(pl); + + +%-------------------------------------------------------------------------- +% Get parameters for plist block. +% +function [params, pl] = get_plist_params(block) + +% build output +pl = plist(); +params = ''; + +%-------------------------------------------------------------------------- +% Get parameters for iparam block. +% +function [params, pl] = get_iparam_params(block) + +key = get(block, 'key'); + + +% build output +pl = plist(param(key, -1)); +params = string(pl); + + +%-------------------------------------------------------------------------- +% Get parameters for specwin block. +% +function [params, pl] = get_specwin_params(block) + +name = get(block, 'wname'); +N = get(block, 'wlen'); +psll = get(block, 'psll'); + +% check what value is + + +% build output +pl = plist([param('Name', name) param('N', eval(N)) param('PSLL', eval(psll))]); +params = string(pl); + +%-------------------------------------------------------------------------- +% Get parameters for param block. +% +function [params, pl] = get_param_params(block) + +key = get(block, 'key'); +val = get(block, 'val'); + + +% build output +pl = plist([param('key', key) param('val', eval(val))]); +params = string(pl); + +%-------------------------------------------------------------------------- +% Get parameters for convert block. +% +function [params, pl] = get_convert_params(block) + +pl = plist(); +params = ''; + +%-------------------------------------------------------------------------- +% Get parameters for pzmresp block. +% +function [params, pl] = get_pzmresp_params(block) + +f1 = get(block, 'f1'); +f2 = get(block, 'f2'); +nf = get(block, 'nf'); +pzm = get(block, 'pzm'); + +pl = plist(); +if ~isempty(f1) + pl = append(pl, param('f1', str2double(f1))); +end +if ~isempty(f2) + pl = append(pl, param('f2', str2double(f2))); +end +if ~isempty(nf) + pl = append(pl, param('nf', str2double(nf))); +end +if ~isempty(pzm) + pl = append(pl, param('pzmodel', eval(pzm))); +else + error('### pole/zero constructor is empty.'); +end +params = string(pl); + + +%-------------------------------------------------------------------------- +% Get parameters for resample block. +% +function [params, pl] = get_resample_params(block) + +fsout = get(block, 'fsout'); +pl = plist(); +pl = append(pl, param('fsout', str2double(fsout))); +params = string(pl); + +%-------------------------------------------------------------------------- +% Get parameters for save block. +% +function [params, pl] = get_save_params(block) + +fname = get(block, 'fname'); +pl = plist(); +pl = append(pl, param('filename', fname)); +params = string(pl); + + +%-------------------------------------------------------------------------- +% Get parameters for ltpda_lpsd block. +% +function [params, pl] = get_ltpda_lpsd_params(block) + +Kdes = str2double(get(block, 'Kdes')); +Kmin = str2double(get(block, 'Kmin')); +Jdes = str2double(get(block, 'Jdes')); +Win = get(block, 'win'); +nolap = str2double(get(block, 'olap')); +psll = str2double(get(block, 'psll')); + +params = []; +pl = plist(param('Kdes', Kdes)); +pl = append(pl, param('Kmin', Kmin)); +pl = append(pl, param('Jdes', Jdes)); + +nfft = 10; +switch Win + case 'Kaiser' + if psll <=0 + error('### ltpda_lpsd block: please specify PSLL for Kaiser window.') + end + p = sprintf('specwin(''Kaiser'', %f, %f)', nfft, psll); + case 'Hanning' + p = sprintf('specwin(''Hanning'', %f)', nfft); + otherwise + error('### ltpda_lpsd block: Unknown window name.'); +end + +pl = append(pl, param('win', eval(p))); +if nolap > 0 + pl = append(pl, param('Olap', nolap)); +end + +params = string(pl); + + +%-------------------------------------------------------------------------- +% Get parameters for ltpda_polydetrend block. +% +function [params, pl] = get_ltpda_polydetrend_params(block) + +N = get(block, 'degree'); + +params = []; +pl = plist(param('N', N)); +params = string(pl); + + + +%-------------------------------------------------------------------------- +% Get parameters for ltpda_lincom block. +% +function [params, pl] = get_ltpda_lincom_params(block) + + +coeffs = get(block, 'coeffs'); + +params = []; +pl = plist(param('coeffs', coeffs)); +params = string(pl); + + +%-------------------------------------------------------------------------- +% Get parameters for ltpda_timedomainfit block. +% +function [params, pl] = get_ltpda_timedomainfit_params(block) + +params = []; +pl = plist(); + + +%-------------------------------------------------------------------------- +% Get parameters for demux block. +% +function [params, pl] = get_demux_params(block) + +params = []; +pl = plist(); + +%-------------------------------------------------------------------------- +% Get parameters for sqrt block. +% +function [params, pl] = get_split_params(block) + +method = get(block, 'method'); +splits = get(block, 'splits'); + +pl = plist(); +pl = append(pl, param(method, str2num(splits) )); +params = string(pl); + + +%-------------------------------------------------------------------------- +% Get parameters for sqrt block. +% +function [params, pl] = get_sqrt_params(block) + +pl = plist(); +params = []; + +%-------------------------------------------------------------------------- +% Get parameters for mrdivide block. +% +function [params, pl] = get_mrdivide_params(block) + +pl = plist(); +params = []; + +%-------------------------------------------------------------------------- +% Get parameters for mtimes block. +% +function [params, pl] = get_mtimes_params(block) + +pl = plist(); +params = []; + +%-------------------------------------------------------------------------- +% Get parameters for minus block. +% +function [params, pl] = get_minus_params(block) + +pl = plist(); +params = []; + +%-------------------------------------------------------------------------- +% Get parameters for plus block. +% +function [params, pl] = get_plus_params(block) + +pl = plist(); +params = []; + +%-------------------------------------------------------------------------- +% Get parameters for get block. +% +function [params, pl] = get_get_params(block) + +pl = plist(); +params = ['''' get(block, 'param') '''']; + +%-------------------------------------------------------------------------- +% Get parameters for filter block. +% +function [params, pl] = get_filter_params(block) + + +% first we try for a standard filter +fname = []; +ftype = []; +try + ftype = get(block, 'ftype'); + fgain = get(block, 'fgain'); + ffc = get(block, 'ffc'); + forder = get(block, 'forder'); + % we design for 4*ffc and adjust later when + % we know the fs of the input data + fc = str2num(ffc); + ffs = 4*fc(end); +catch + try + fname = get(block, 'fname'); + catch + end +end + + +% start plist +pl = plist(); +if isempty(fname) + + % if not a standard filter, then a pole/zero filter + if isempty(ftype) + + miirstr = get(block, 'miirstr'); + eval(['pzm = ' miirstr ';']); + pl = plist(param('filter', miir(plist(param('pzmodel', pzm))))); + params = string(pl); + + % else a standard filter + else + + % build standard filter + if strcmp(ftype, 'bandpass') || strcmp(ftype, 'bandreject') + if length(str2num(ffc)) ~= 2 + error('### supply upper and lower frequency for bandpass and bandreject filters.'); + end + end + + fpl = plist(); + fpl = append(fpl, param('type', ftype)); + fpl = append(fpl, param('gain', str2double(fgain))); + % fpl = append(fpl, param('fs', (ffs))); + fpl = append(fpl, param('fc', [str2num(ffc)])); + fpl = append(fpl, param('order', [str2num(forder)])); + + pl = plist(param('filter', miir(fpl))); + params = string(pl); + end +else + pl = plist(param('filter', miir(fname))); + params = string(pl); +end + +%-------------------------------------------------------------------------- +% Get parameters for ao block. +% +function [params, pl] = get_ao_params(block) + +fname = []; +vals = []; +fcn = []; +tsfcn = []; +waveform = []; +try fname = get(block, 'fname'); end; +try vals = get(block, 'vals'); end; +try fcn = get(block, 'fcn'); end; +try tsfcn = get(block, 'tsfcn'); end; +try waveform = get(block, 'waveform'); end; + +% execute +if ~isempty(fname) + pl = plist(); + pl = append(pl, param('filename', fname)); + params = string(pl); +elseif ~isempty(vals) + pl = plist(param('vals', str2num(vals))); + params = string(pl); +elseif ~isempty(fcn) + pl = plist(param('fcn', fcn)); + params = string(pl); +elseif ~isempty(tsfcn) + nsecs = sltpda_getvar(block, 'nsecs'); + fs = sltpda_getvar(block, 'fs'); + pl = plist(); + pl = append(pl, param('nsecs', nsecs)); + pl = append(pl, param('fs', fs)); + pl = append(pl, param('tsfcn', tsfcn)); + params = string(pl); +elseif ~isempty(waveform) + + switch waveform + %------------ Sine Wave + case 'sine wave' + freq = get(block, 'freq'); + phi = get(block, 'phi'); + tsfcn = sprintf('sin(2*pi*%f*t + %f*pi/180)', eval(freq), eval(phi)); + %------------ Noise + case 'noise' + ntype = get(block, 'ntype'); + switch ntype + case 'Normal' + tsfcn = 'randn(size(t))'; + case 'Uniform' + tsfcn = 'rand(size(t))'; + end + %------------ Chirp + case 'chirp' + f0 = get(block, 'chirp_f0'); + fe = get(block, 'chirp_fe'); + te = get(block, 'chirp_te'); + tsfcn = sprintf('chirp(t,%f,%f,%f)', eval(f0), eval(fe), eval(te)) + %------------ Gaussian pulse + case 'Gaussian pulse' + fc = get(block, 'gp_f0'); + bw = get(block, 'gp_bw'); + tsfcn = sprintf('gauspuls(t,%f,%f)', eval(fc), eval(bw)); + case 'Square wave' + freq = get(block, 'freq'); + duty = get(block, 'square_duty'); + tsfcn = sprintf('square(2*pi*%f*t,%f)', eval(freq), eval(duty)); + case 'Sawtooth' + freq = get(block, 'freq'); + width = get(block, 'sawtooth_width'); + tsfcn = sprintf('sawtooth(2*pi*%f*t,%f)', eval(freq), eval(width)); + end + pl = plist(); + pl = append(pl, param('tsfcn', tsfcn)); + params = string(pl); +else + error('### unknown parameter method for AO construction.'); +end + +%-------------------------------------------------------------------------- +% Get parameters for plot block. +% +function [params, pl] = get_plot_params(block) + +pl = plist(); + +xscale = get(block, 'xscale'); +yscale = get(block, 'yscale'); + +params = []; + + +%-------------------------------------------------------------------------- +% Get parameters for ltpda_pwelch block. +% +function [params, pl] = get_ltpda_pwelch_params(block) + +pl = plist(); + +nfft = get(block, 'Nfft'); +nolap = get(block, 'Nolap'); + +if isempty(nfft) + nfft = 0; +else + nfft = str2double(nfft); +end +if isempty(nolap) + nolap = 0; +else + nolap = str2double(nolap); +end + +pl = plist(); +if nfft > 0 + pl = append(pl, param('Nfft', nfft)); +end +if nolap > 0 + pl = append(pl, param('Nolap', nolap)); +end +params = string(pl); + +%-------------------------------------------------------------------------- +% Get parameters for ltpda_tfe block. +% +function [params, pl] = get_ltpda_tfe_params(block) + +winname = get(block, 'win'); +nfft = get(block, 'nfft'); +nolap = get(block, 'nolap'); +psll = get(block, 'psll'); + +if isempty(nfft) + nfft = 0; +else + nfft = str2double(nfft); +end +if isempty(nolap) + nolap = 0; +else + nolap = str2double(nolap); +end +if isempty(psll) + psll = 0; +else + psll = str2double(psll); +end + +switch winname + case 'Kaiser' + if psll <=0 + error('### ltpda_tfe block: please specify PSLL for Kaiser window.') + end + p = sprintf('specwin(''Kaiser'', %f, %f)', nfft, psll); + case 'Hanning' + p = sprintf('specwin(''Hanning'', %f)', nfft); + otherwise + error('### ltpda_tfe block: Unknown window name.'); +end + +pl = plist(); +pl = append(pl, param('Nfft', nfft)); +pl = append(pl, param('Win', eval(p))); +if nolap > 0 + pl = append(pl, param('Nolap', nolap)); +end +params = string(pl); + +%-------------------------------------------------------------------------- +% Build command string +% +function cmd = buildCmd(inames, onames, params, fcn) + +cmd = ''; + +% add outputs +if ~isempty(onames) + cmd = [cmd '[']; + for k=1:length(onames) + cmd = [cmd onames{k} ',']; + end + cmd = [cmd(1:end-1) ']']; + cmd = [cmd ' = ']; +end + +% add fcn name +cmd = [cmd fcn]; + +% add inputs +cmd = [cmd '(']; +if ~isempty(inames) + for k=1:length(inames) + cmd = [cmd inames{k} ',']; + end +end + +% add parameters +if ~isempty(params) + cmd = [cmd params]; +else + cmd = cmd(1:end-1); +end + +cmd = [cmd ')']; +cmd = [cmd ';']; + +%-------------------------------------------------------------------------- +% get function name from block handle +function fcn = getFcnName(b) + +blocktype = get(b, 'blocktype'); +if ~strcmp(blocktype, 'Outport') && ~ strcmp(blocktype, 'Inport') + name = get(b, 'Name'); + masktype = get(b, 'MaskType'); + + if isempty(masktype) && ~strcmp(blocktype, 'SubSystem') + fcn = name; + else + fcn = masktype; + end + + % Some overrides to this + switch blocktype + case 'Sum' + fcn = 'plus'; + case 'Mux' + fcn = 'mux'; + case 'Demux'; + fcn = 'demux'; + end + + % Some function replacements + switch fcn + case 'plot' + fcn = 'figure,plot'; + case 'filter' + fcn = get(b, 'method'); + case 'convert' + fcn = get(b, 'fcn'); + case 'iparam' + fcn = 'param'; + end + fcn = sltpda_fixvar(fcn); +end + +%-------------------------------------------------------------------------- +function [inames, onames] = getIOnames(myports, name) + +% Get my inputs +inames = []; + +ins = myports.Inport; +% get name of each input +for k=1:length(ins) + ip = ins(k); + lineState = get(ip, 'Line'); + pn = get(ip, 'PortNumber'); + if lineState == -1 + inames = [inames cellstr('[]')]; + else + pstr = strrep([name '_in_' num2str(pn)], ' ', '_'); + pstr = sltpda_fixvar(pstr); + inames = [inames cellstr(pstr)]; + end +end + +% Get my outputs +onames = []; +outs = myports.Outport; +% get name of each output +for k=1:length(outs) + op = outs(k); + pn = get(op, 'PortNumber'); + pstr = strrep([name '_out_' num2str(pn)], ' ', '_'); + pstr = sltpda_fixvar(pstr); + onames = [onames cellstr(pstr)]; +end + +