Mercurial > hg > ltpda
diff m-toolbox/m/gui/pzmodel_designer/pzmodel_helper.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/m/gui/pzmodel_designer/pzmodel_helper.m Wed Nov 23 19:22:13 2011 +0100 @@ -0,0 +1,753 @@ +function pzmodel_helper(varargin) +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DESCRIPTION: PZMODEL_HELPER opens the LTPDA pzmodel GUI. +% +% CALL: pzmodel_helper() +% +% VERSION: $Id: pzmodel_helper.m,v 1.12 2009/09/07 17:23:07 nicola Exp $ +% +% HISTORY: 07-09-2009 N Tateo +% Creation +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + +% This function draws the PZmodel helper main figure. + + % Some initial setup + import utils.const.* + prefs = getappdata(0, 'LTPDApreferences'); + utils.helper.msg(msg.PROC1, 'building Main Figure'); + + Screen = get(0,'screensize'); + mainfig.Gproperties.Screen = Screen; + mainfig.Gproperties.Gwidth = 0.6; + mainfig.Gproperties.Gheight = 0.9; + mainfig.Gproperties.Gborder = 10; + fontSize = (prefs.repository.fontsize+2)*(1440/Screen(3)); + + l = (0.5-mainfig.Gproperties.Gwidth/2); + b = (0.5-mainfig.Gproperties.Gheight/2); + w = mainfig.Gproperties.Gwidth; + h = mainfig.Gproperties.Gheight; + mainfig.Gproperties.Gposition = [l b w h]; + + if ~isempty(varargin) && ishandle(varargin{1}) + mainfig.handle = varargin{1}; + set(mainfig.handle, 'Tag', 'PZMODELhelpermainfig'); + set(mainfig.handle, 'Units', 'normalized'); + set(mainfig.handle, 'Visible', 'on'); + else + % Initialize and hide the GUI as it is being constructed. + mainfig.handle = figure('Name', 'PZModel Helper GUI',... + 'NumberTitle', 'off',... + 'Visible','on',... + 'Units','normalized',... + 'Position',mainfig.Gproperties.Gposition,... + 'Toolbar', 'none',... + 'MenuBar', 'none',... + 'Color', 'w',... + 'Resize', 'on',... + 'Tag', 'PZMODELhelpermainfig'); + end + +% % DEFINE THE HANDLES VARIABLE +% handles = struct(); +% handles.pzEdit = findobj(gcf,'Tag','pzEdit'); +% handles.phaseAxes = findobj(gcf,'Tag','phaseAxes'); +% handles.filterStrEdit = findobj(gcf,'Tag','filterStrEdit'); +% handles.fsEdit = findobj(gcf,'Tag','fsEdit'); +% handles.nfEdit = findobj(gcf,'Tag','nfEdit'); +% handles.f2Edit = findobj(gcf,'Tag','f2Edit'); +% handles.f1Edit = findobj(gcf,'Tag','f1Edit'); +% handles.gainEdit = findobj(gcf,'Tag','gainEdit'); +% handles.magAxes = findobj(gcf,'Tag','magAxes'); +% handles.poleList = findobj(gcf,'Tag','poleList'); +% handles.zeroList = findobj(gcf,'Tag','zeroList'); +% handles.main = gcf; +% % handles. = findobj(gcf,'Tag',''); +% % handles. = findobj(gcf,'Tag',''); +% +% % 'uipanel1' +% % 'uipanel2' +% % 'saveAObtn' +% % 'figureBtn' +% % 'replotBtn' +% % 'GainTxt' +% % 'addZeroBtn' +% % 'addPoleBtn' +% % 'deleteZerosBtn' +% % 'deletePolesBtn' +% % 'clearBtn' +% % 'output' + + % create empty lists + poles = []; + zeros = []; + setappdata(gcf, 'poles', poles); + setappdata(gcf, 'zeros', zeros); + setappdata(gcf, 'filt', []); + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%% DRAW CONTENTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + uip1 = uipanel('Title', 'Response',... + 'FontSize', fontSize-1,... + 'BackgroundColor','white',... + 'Tag', 'uipanel1',... + 'Position',[.35 .15 .64 .84]); + + uip2 = uipanel('Title', 'Pole/zero entry',... + 'FontSize', fontSize-1,... + 'BackgroundColor','white',... + 'Tag', 'uipanel2',... + 'Position',[.01 .6 .32 .39]); + + uip3 = uipanel('Title', 'Plot controls',... + 'FontSize', fontSize-1,... + 'BackgroundColor','white',... + 'Tag', 'uipanel3',... + 'Position',[.01 .15 .32 .44]); + + uicontrol('Style','text',... + 'String', 'MIIR constructor string:',... + 'HorizontalAlignment', 'left',... + 'FontSize', fontSize+2,... + 'FontWeight','bold',... + 'ForeGroundColor','black',... + 'backgroundColor','white',... + 'Units','normalized',... + 'Position', [.02 .115 .3 .03]) + + uicontrol('Style','edit',... + 'Tag', 'filterStrEdit',... + 'Max',10,... + 'HorizontalAlignment', 'center',... + 'FontSize', fontSize+2,... + 'ForeGroundColor','black',... + 'backgroundColor',[.94 .94 .94],... + 'Units','normalized',... + 'Position', [.02 .01 .96 .1]) + + %%%%%%%%%%%%%%%%%%%%%% + % First panel contents + %%%%%%%%%%%%%%%%%%%%%% + + axes('Parent',uip1,... + 'Tag','phaseAxes',... + 'Box','on',... + 'Units','normalized',... + 'Position', [.11 .08 .8 .35]); + + axes('Parent',uip1,... + 'Tag','magAxes',... + 'Box','on',... + 'Units','normalized',... + 'Position', [.11 .52 .8 .43]); + + %%%%%%%%%%%%%%%%%%%%%%% + % Second panel contents + %%%%%%%%%%%%%%%%%%%%%%% + + uicontrol('Parent',uip2, ... + 'Style','edit',... + 'Tag', 'pzEdit',... + 'Max',1,... + 'String', '1 0',... + 'HorizontalAlignment', 'center',... + 'FontSize', fontSize,... + 'ForeGroundColor','black',... + 'backgroundColor',[.92 .92 .92],... + 'Units','normalized',... + 'Position', [.1 .85 .35 .1]) + + uicontrol('Parent',uip2, ... + 'Style','text',... + 'String', 'Frequency [Hz] (Q)',... + 'HorizontalAlignment', 'center',... + 'FontSize', fontSize,... + 'ForeGroundColor','black',... + 'backgroundColor','w',... + 'Units','normalized',... + 'Position', [.45 .83 .5 .1]) + + uicontrol('Parent',uip2, ... + 'Style','pushbutton',... + 'String', 'Add pole',... + 'HorizontalAlignment', 'center',... + 'FontSize', fontSize,... + 'ForeGroundColor','black',... + 'backgroundColor','w',... + 'Units','normalized',... + 'Callback', @addPoleBtn_Callback,... + 'Position', [.075 .75 .4 .08]) + + uicontrol('Parent',uip2, ... + 'Style','pushbutton',... + 'String', 'Add zero',... + 'HorizontalAlignment', 'center',... + 'FontSize', fontSize,... + 'ForeGroundColor','black',... + 'backgroundColor','w',... + 'Units','normalized',... + 'Callback', @addZeroBtn_Callback,... + 'Position', [.525 .75 .4 .08]) + + uicontrol('Parent',uip2, ... + 'Style','listbox',... + 'Tag','poleList',... + 'String', '-',... + 'HorizontalAlignment', 'center',... + 'FontSize', fontSize,... + 'ForeGroundColor','black',... + 'backgroundColor','w',... + 'Units','normalized',... + ... 'Callback', @poleList_Callback,... + 'Position', [.075 .25 .4 .45]) + + uicontrol('Parent',uip2, ... + 'Style','listbox',... + 'Tag','zeroList',... + 'String', '-',... + 'HorizontalAlignment', 'center',... + 'FontSize', fontSize,... + 'ForeGroundColor','black',... + 'backgroundColor','w',... + 'Units','normalized',... + ... 'Callback', @zeroList_Callback,... + 'Position', [.525 .25 .4 .45]) + + uicontrol('Parent',uip2, ... + 'Style','pushbutton',... + 'String', 'Delete',... + 'HorizontalAlignment', 'center',... + 'FontSize', fontSize,... + 'ForeGroundColor','black',... + 'backgroundColor','w',... + 'Units','normalized',... + 'Callback', @deletePolesBtn_Callback,... + 'Position', [.075 .15 .4 .08]) + + uicontrol('Parent',uip2, ... + 'Style','pushbutton',... + 'String', 'Delete',... + 'HorizontalAlignment', 'center',... + 'FontSize', fontSize,... + 'ForeGroundColor','black',... + 'backgroundColor','w',... + 'Units','normalized',... + 'Callback', @deleteZerosBtn_Callback,... + 'Position', [.525 .15 .4 .08]) + + uicontrol('Parent',uip2, ... + 'Style','pushbutton',... + 'String', 'Clear lists',... + 'HorizontalAlignment', 'center',... + 'FontSize', fontSize,... + 'ForeGroundColor','black',... + 'backgroundColor','w',... + 'Units','normalized',... + 'Callback', @clearBtn_Callback,... + 'Position', [.075 .04 .85 .08]) + + %%%%%%%%%%%%%%%%%%%%%% + % Third panel contents + %%%%%%%%%%%%%%%%%%%%%% + + uicontrol('Parent',uip3, ... + 'Style','edit',... + 'Tag', 'gainEdit',... + 'Callback',@valueEdit_Callback, ... + 'Max',1,... + 'String', '1',... + 'HorizontalAlignment', 'center',... + 'FontSize', fontSize,... + 'ForeGroundColor','black',... + 'backgroundColor',[.92 .92 .92],... + 'Units','normalized',... + 'Position', [.1 .87 .3 .08]) + uicontrol('Parent',uip3, ... + 'Style','text',... + 'String', 'Gain',... + 'HorizontalAlignment', 'left',... + 'FontSize', fontSize,... + 'ForeGroundColor','black',... + 'backgroundColor','w',... + 'Units','normalized',... + 'Position', [.47 .855 .4 .08]) + + uicontrol('Parent',uip3, ... + 'Style','edit',... + 'Tag', 'fsEdit',... + 'Callback',@valueEdit_Callback, ... + 'Max',1,... + 'String', '',... + 'HorizontalAlignment', 'center',... + 'FontSize', fontSize,... + 'ForeGroundColor','black',... + 'backgroundColor',[.92 .92 .92],... + 'Units','normalized',... + 'Position', [.1 .75 .3 .08]) + uicontrol('Parent',uip3, ... + 'Style','text',... + 'String', 'Sample rate',... + 'HorizontalAlignment', 'left',... + 'FontSize', fontSize,... + 'ForeGroundColor','black',... + 'backgroundColor','w',... + 'Units','normalized',... + 'Position', [.47 .735 .4 .08]) + + + uicontrol('Parent',uip3, ... + 'Style','edit',... + 'Tag', 'f1Edit',... + 'Callback',@valueEdit_Callback, ... + 'Max',1,... + 'String', '',... + 'HorizontalAlignment', 'center',... + 'FontSize', fontSize,... + 'ForeGroundColor','black',... + 'backgroundColor',[.92 .92 .92],... + 'Units','normalized',... + 'Position', [.1 .63 .3 .08]) + uicontrol('Parent',uip3, ... + 'Style','text',... + 'String', 'f1',... + 'HorizontalAlignment', 'left',... + 'FontSize', fontSize,... + 'ForeGroundColor','black',... + 'backgroundColor','w',... + 'Units','normalized',... + 'Position', [.47 .615 .4 .08]) + + uicontrol('Parent',uip3, ... + 'Style','edit',... + 'Tag', 'f2Edit',... + 'Callback',@valueEdit_Callback, ... + 'Max',1,... + 'String', '',... + 'HorizontalAlignment', 'center',... + 'FontSize', fontSize,... + 'ForeGroundColor','black',... + 'backgroundColor',[.92 .92 .92],... + 'Units','normalized',... + 'Position', [.1 .51 .3 .08]) + uicontrol('Parent',uip3, ... + 'Style','text',... + 'String', 'f2',... + 'HorizontalAlignment', 'left',... + 'FontSize', fontSize,... + 'ForeGroundColor','black',... + 'backgroundColor','w',... + 'Units','normalized',... + 'Position', [.47 .495 .4 .08]) + + uicontrol('Parent',uip3, ... + 'Style','edit',... + 'Tag', 'nfEdit',... + 'Callback',@valueEdit_Callback, ... + 'Max',1,... + 'String', '',... + 'HorizontalAlignment', 'center',... + 'FontSize', fontSize,... + 'ForeGroundColor','black',... + 'backgroundColor',[.92 .92 .92],... + 'Units','normalized',... + 'Position', [.1 .39 .3 .08]) + uicontrol('Parent',uip3, ... + 'Style','text',... + 'String', 'Nf',... + 'HorizontalAlignment', 'left',... + 'FontSize', fontSize,... + 'ForeGroundColor','black',... + 'backgroundColor','w',... + 'Units','normalized',... + 'Position', [.47 .375 .4 .08]) + + uicontrol('Parent',uip3, ... + 'Style','pushbutton',... + 'Tag', 'replotBtn',... + 'Callback', @replotBtn_Callback, ... + 'Max',1,... + 'String', 'Replot',... + 'HorizontalAlignment', 'center',... + 'FontSize', fontSize,... + 'ForeGroundColor','black',... + 'backgroundColor',[.92 .92 .92],... + 'Units','normalized',... + 'Position', [.1 .27 .8 .07]) + + uicontrol('Parent',uip3, ... + 'Style','pushbutton',... + 'Tag', 'figureBtn',... + 'Callback', @figureBtn_Callback, ... + 'Max',1,... + 'String', 'Figure',... + 'HorizontalAlignment', 'center',... + 'FontSize', fontSize,... + 'ForeGroundColor','black',... + 'backgroundColor',[.92 .92 .92],... + 'Units','normalized',... + 'Position', [.1 .16 .8 .07]) + + uicontrol('Parent',uip3, ... + 'Style','pushbutton',... + 'Tag', 'saveAObtn',... + 'Callback', @saveAObtn_Callback, ... + 'Max',1,... + 'String', 'Save as',... + 'HorizontalAlignment', 'center',... + 'FontSize', fontSize,... + 'ForeGroundColor','black',... + 'backgroundColor',[.92 .92 .92],... + 'Units','normalized',... + 'Position', [.1 .05 .8 .07]) + + + +%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%% SUBFUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + % --- Executes on button press in addPoleBtn. + function addPoleBtn_Callback(varargin) + % hObject handle to addPoleBtn (see GCBO) + % eventdata reserved - to be defined in a future version of MATLAB + + % get values from pzEdit + strVal = get(findobj(gcf,'Tag','pzEdit'), 'String'); + val = str2num(strVal); + f = val(1); + if length(val) == 2 + q = val(2); + p = pz(f,q); + else + p = pz(f); + end + + poles = getappdata(gcf, 'poles'); + poles = [poles p]; + setappdata(gcf, 'poles', poles); + + % update list + updatePolesList(); + + % update model + updateModelResp(); + + end + + % --- Executes on button press in addZeroBtn. + function addZeroBtn_Callback(varargin) + % hObject handle to addZeroBtn (see GCBO) + % eventdata reserved - to be defined in a future version of MATLAB + + % get values from pzEdit + strVal = get(findobj(gcf,'tag','pzEdit'), 'String'); + val = str2num(strVal); + f = val(1); + if length(val) == 2 + q = val(2); + z = pz(f,q); + else + z = pz(f); + end + + zeros = getappdata(gcf, 'zeros'); + zeros = [zeros z]; + setappdata(gcf, 'zeros', zeros); + + % update list + updateZerosList(); + + % update model + updateModelResp(); + + end + + %----------- Update Poles List ----------------------------- + function updatePolesList(varargin) + + poles = getappdata(gcf, 'poles'); + pstr = []; + for n=1:length(poles) + p = poles(n); + f = p.f; + q = p.q; + if q>0.5 + pstr = strvcat(pstr, sprintf('%2.2f Hz Q=%2.2f', f, q)); + else + pstr = strvcat(pstr, sprintf('%2.2f Hz', f)); + end + end + + if isempty(poles) + set(findobj(gcf,'tag','poleList'), 'String', ' '); + else + set(findobj(gcf,'tag','poleList'), 'String', pstr); + end + set(findobj(gcf,'tag','poleList'), 'Value', 1); + + end + + %----------- Update Zeros List ----------------------------- + function updateZerosList(varargin) + + zeros = getappdata(gcf, 'zeros'); + pstr = []; + for n=1:length(zeros) + p = zeros(n); + f = p.f; + q = p.q; + if q>0.5 + pstr = strvcat(pstr, sprintf('%2.2f Hz Q=%2.2f', f, q)); + else + pstr = strvcat(pstr, sprintf('%2.2f Hz', f)); + end + end + + if isempty(zeros) + set(findobj(gcf,'tag','zeroList'), 'String', ' '); + else + set(findobj(gcf,'tag','zeroList'), 'String', pstr); + end + set(findobj(gcf,'tag','zeroList'), 'Value', 1); + end + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + %----------- Update Model response ----------------------------- + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + function updateModelResp(varargin) + + gain = str2double(get(findobj(gcf,'tag','gainEdit'), 'String')); + poles = getappdata(gcf, 'poles'); + zeros = getappdata(gcf, 'zeros'); + + pzm = pzmodel(gain, poles, zeros); + + f1s = get(findobj(gcf,'tag','f1Edit'), 'String'); + f2s = get(findobj(gcf,'tag','f2Edit'), 'String'); + nfs = get(findobj(gcf,'tag','nfEdit'), 'String'); + fss = get(findobj(gcf,'tag','fsEdit'), 'String'); + + if isempty(f1s) + f1 = getlowerFreq(pzm)/10; + else + f1 = str2double(f1s); + end + if isempty(f2s) + f2 = getupperFreq(pzm)*10; + else + f2 = str2double(f2s); + end + if isempty(nfs) + nf = 1000; + else + nf = str2double(nfs); + end + + if ~isempty(pzm.poles) || ~isempty(pzm.zeros) + + % make model response + a = resp(pzm, f1, f2, nf); + d = a.data; + mx = d.x; + my = d.y; + + % make IIR response + if isempty(fss) + filt = miir(plist([param('pzmodel', pzm)])); + else + filt = miir(plist([param('pzmodel', pzm) param('fs', str2double(fss))])); + end + setappdata(gcf, 'filt', filt); + set(findobj(gcf,'tag','filterStrEdit'), 'String', ['miir(' string(pzm) ')']); + + filtresp = resp(filt, plist(param('f', mx.'))); + d = filtresp.data; + fx = d.x; + fy = d.y; + + axes(findobj(gcf,'tag','magAxes')); % Select the proper axes + loglog(mx,abs(my), fx, abs(fy), 'r--') + grid on; + axis tight + xlabel(''); + ylabel('Magnitude'); + legend('Pole/Zero model', 'IIR','Location','SouthWest') + set(gca,'tag','magAxes') + + axes(findobj(gcf,'tag','phaseAxes')); % Select the proper axes + semilogx(mx, utils.math.phase(my), fx, utils.math.phase(fy), 'r--') + grid on; + axis tight + xlabel('Frequency [Hz]'); + ylabel('Phase [deg]'); + set(gca,'tag','phaseAxes') + else + axes(findobj(gcf,'tag','magAxes')); % Select the proper axes + cla + axes(findobj(gcf,'tag','phaseAxes')); % Select the proper axes + cla + end + + end + + function valueEdit_Callback(varargin) + updateModelResp() + end + + % --- Executes on button press in replotBtn. + function replotBtn_Callback(varargin) + updateModelResp() + end + + % --- Executes on button press in figureBtn. + function figureBtn_Callback(varargin) + + gain = str2double(get(findobj(gcf,'tag','gainEdit'), 'String')); + poles = getappdata(gcf, 'poles'); + zeros = getappdata(gcf, 'zeros'); + + pzm = pzmodel(gain, poles, zeros); + + f1s = get(findobj(gcf,'tag','f1Edit'), 'String'); + f2s = get(findobj(gcf,'tag','f2Edit'), 'String'); + nfs = get(findobj(gcf,'tag','nfEdit'), 'String'); + fss = get(findobj(gcf,'tag','fsEdit'), 'String'); + + if isempty(f1s) + f1 = getlowerFreq(pzm)/10; + else + f1 = str2double(f1s); + end + if isempty(f2s) + f2 = getupperFreq(pzm)*10; + else + f2 = str2double(f2s); + end + if isempty(nfs) + nf = 1000; + else + nf = str2double(nfs); + end + + % make model response + a = resp(pzm, f1, f2, nf); + a.setName('PZmodel'); + + % make IIR response + if isempty(fss) + filt = miir(plist([param('pzmodel', pzm)])); + else + filt = miir(plist([param('pzmodel', pzm) param('fs', str2double(fss))])); + end + + + filtresp = resp(filt, plist(param('f', a.data.getX))); + filtresp.setName('IIR filter'); + + iplot(a, filtresp) + end + + % --- Executes on button press in clearBtn. + function clearBtn_Callback(varargin) + + setappdata(gcf, 'poles', []); + setappdata(gcf, 'zeros', []); + + % update list + updateZerosList(); + updatePolesList(); + + % update model + updateModelResp(); + end + + + % --- Executes on button press in deletePolesBtn. + function deletePolesBtn_Callback(varargin) + + % get selection from list + values = get(findobj(gcf,'tag','poleList'), 'Value'); + % get poles + poles = getappdata(gcf, 'poles'); + po = []; + for j=1:length(poles) + if j~=values + po = [po poles(j)]; %#ok<AGROW> + end + end + setappdata(gcf, 'poles', po); + updatePolesList(); + % update model + updateModelResp(); + + end + + % --- Executes on button press in deleteZerosBtn. + function deleteZerosBtn_Callback(varargin) + + % get selection from list + values = get(findobj(gcf,'tag','zeroList'), 'Value'); + % get zeros + zeros = getappdata(gcf, 'zeros'); + zo = []; + for j=1:length(zeros) + if j~=values + zo = [zo zeros(j)]; %#ok<AGROW> + end + end + setappdata(gcf, 'zeros', zo); + updateZerosList(); + % update model + updateModelResp(); + end + + % --- Executes on button press in saveAObtn. + function saveAObtn_Callback(varargin) + + % get response + gain = str2double(get(findobj(gcf,'tag','gainEdit'), 'String')); + poles = getappdata(gcf, 'poles'); + zeros = getappdata(gcf, 'zeros'); + pzm = pzmodel(gain, poles, zeros); + + f1s = get(findobj(gcf,'tag','f1Edit'), 'String'); + f2s = get(findobj(gcf,'tag','f2Edit'), 'String'); + nfs = get(findobj(gcf,'tag','nfEdit'), 'String'); + fss = get(findobj(gcf,'tag','fsEdit'), 'String'); + + if isempty(f1s) + f1 = getlowerFreq(pzm)/10; + else + f1 = str2double(f1s); + end + if isempty(f2s) + f2 = getupperFreq(pzm)*10; + else + f2 = str2double(f2s); + end + if isempty(nfs) + nf = 1000; + else + nf = str2double(nfs); + end + + % make model response + a = resp(pzm, f1, f2, nf); + + % Get filename + [filename, pathname] = uiputfile('*.xml', 'LTPDA XML file (*.xml)', 'Save as'); + if isequal(filename,0) || isequal(pathname,0) + else + fname = fullfile(pathname, filename); + save(a, fname); + end + end + + +end \ No newline at end of file