Mercurial > hg > ltpda
view m-toolbox/m/gui/pzmodel_designer/pzmodel_helper.m @ 50:7d2e2e065cf1 database-connection-manager
Update unit tests
author | Daniele Nicolodi <nicolodi@science.unitn.it> |
---|---|
date | Wed, 07 Dec 2011 17:24:37 +0100 |
parents | f0afece42f48 |
children |
line wrap: on
line source
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