📄 filtview.m
字号:
if ud.prefs.tool.ruler, ruler('hidelines',fig,'all'), end
filtview('plots',ud.prefs.plots,fig,need_update)
ud = get(fig,'userdata');
bringToFront(fig,ud.focusIndex)
% New filter. Set the focusline correctly so that the rulers
% will be set on appropriate subplot and focus on
% correct line - if rulers were on imaginary line of complex
% filter and new filter is also complex, focus rulers on the
% imaginary line of new filter.
if ~isempty(f(ind))
plotIndex = find(ud.mainaxes==ud.ht.a);
ud = filtview('setudlimits',ud,ud.ht.a,plotIndex);
realFilterFlag = (isreal(ud.filt(ud.focusIndex).tf.num) &...
isreal(ud.filt(ud.focusIndex).tf.den));
if isempty(ud.focusIndex)
h = [];
else
hstepc = ud.lines(ud.focusIndex).stepc;
himpc = ud.lines(ud.focusIndex).impc;
h = [hstepc himpc];
end
if isempty(ud.focusline) | isempty(h) | realFilterFlag | ...
all(ud.focusline~=h)
realDataFlag = 1; % data is real
else
realDataFlag = 0; % data is complex
end
ud.focusline = setFocusLine(ud.mainaxes,ud.lines,...
plotIndex, ud.focusIndex,realDataFlag);
set(fig,'userdata',ud)
if ud.prefs.tool.ruler
ruler('newlimits',fig,plotIndex)
ruler('newsig',fig,plotIndex)
ruler('showlines',fig,ud.focusline)
end
end
ud = get(fig,'userdata');
if isempty(ind) % No filters in SPTool
sptlegend('setstring',{ },{},fig,0)
else
sptlegend('setstring',{ud.filt.label},{},fig,0)
if isempty(find(ud.prefs.plots)) & ~isempty(ud.filt)
sptlegend('setvalue',ud.legend.legendline,...
ud.focusIndex,1,fig)
set(ud.legend.legendline,'color',...
ud.filt(ud.focusIndex).lineinfo.color)
else
sptlegend('setvalue',ud.focusline,ud.focusIndex,1,fig)
end
set(ud.legend.legendline,'linestyle',...
ud.filt(ud.focusIndex).lineinfo.linestyle)
end
end % newly selected filter(s) (f(ind)) doesn't equal ud.filt
end % filter viewer exists - fig is not empty
%------------------------------------------------------------------------
% enable = filtview('action',verb.action)
% respond to button push in SPTool
% possible actions are
% 'view'
%
case 'action'
SPTfig = gcf;
fig = findobj('type','figure','tag','filtview');
% get all filters (f) and the indexes (ind) of the selected filters
[f,ind] = sptool('Filters',1,SPTfig);
if isempty(fig) % create the filter viewer
filtview(f(ind))
else % set filter viewer's visibility 'ON'
set(fig,'visible','on')
figure(fig)
ud = get(fig,'userdata');
if ~isequal(f(ind),ud.filt)
ud.filt = f(ind);
ud.prefs.Fs = sprintf('%.9g',max([f(ind).Fs]));
set(ud.ht.Fsedit,'string',ud.prefs.Fs)
set(fig,'userdata',ud)
filtview('plots',ud.prefs.plots,fig)
ud.prefs.Fs = sprintf('%.9g',max([f(ind).Fs]));
[FsStr filtLabelStr] = filtFsLabelStrs(ud.prefs,ud.ht,ud.filt);
set(ud.ht.filterLabel,'string',filtLabelStr)
set(ud.ht.Fsedit,'string',FsStr)
set(fig,'userdata',ud)
end
end
%------------------------------------------------------------------------
% filtview('SPTclose',verb.action)
% respond to SPTool closing
% possible actions are
% 'view'
%
case 'SPTclose'
fig = findobj('type','figure','tag','filtview');
if ~isempty(fig) % destroy the filtview tool
ud = get(fig,'userdata');
delete(fig)
end
%------------------------------------------------------------------------
% filtview('print')
% print contents of filtview (assumed in gcf)
%
case 'print'
%------------------------------------------------------------------------
% filtview('help')
% Callback of help button in toolbar
%
case 'help'
fig = gcf;
ud = get(fig,'userdata');
if ud.pointer ~= 2 % if not in help mode
% enter help mode
saveEnableControls = [ud.legend.legendpopup
ud.legend.legendbutton
ud.ht.magpop
ud.ht.phasepop];
ax = [ud.ht.a ud.toolbar.toolbar];
titleStr = 'Filter Viewer Help';
helpFcn = 'fvhelpstr';
spthelp('enter',fig,saveEnableControls,ax,titleStr,helpFcn)
else
spthelp('exit')
end
%------------------------------------------------------------------------
% errstr = filtview('setprefs',panelName,p)
% Set preferences for the panel with name panelName
%
% Inputs:
% panelName - string; must be either 'ruler','color', 'filtview1',
% or 'filtview2'
% (see sptprefreg for definitions)
% p - preference structure for this panel
%
case 'setprefs'
errstr = '';
panelName = varargin{2};
p = varargin{3};
% first do error checking
switch panelName
case 'filtview1'
arbitrary_obj = {'arb' 'obj'};
nfft = evalin('base',p.nfft,'arbitrary_obj');
if isequal(nfft,arbitrary_obj)
errstr = 'Sorry, the FFT Length you entered could not be evaluated';
elseif isempty(nfft) | (round(nfft)~=nfft | nfft<=0 | ~isreal(nfft))
errstr = ['The FFT Length must be a positive integer.'];
end
if isempty(errstr)
nimp = evalin('base',p.nimp,'arbitrary_obj');
if isequal(nimp,arbitrary_obj)
errstr = 'Sorry, the Time Response Length you entered could not be evaluated';
elseif ~isempty(nimp) & (round(nimp)~=nimp | nimp<=0 | ~isreal(nimp))
errstr = ['The Time Response Length must be a positive integer' ...
' or the empty matrix ''[]'' (to get the default value).'];
end
end
if isempty(errstr) & (p.freqscale == 2 & p.freqrange == 3)
errstr = ['You can''t have frequency log scaling with a negative ' ...
'frequency range.'];
end
case 'filtview2' % tiling
end
varargout{1} = errstr;
if ~isempty(errstr)
return
end
% now set preferences
fig = findobj('type','figure','tag','filtview');
if ~isempty(fig)
ud = get(fig,'userdata');
newprefs = ud.prefs;
switch panelName
case 'ruler'
markerStr = { '+' 'o' '*' '.' 'x' ...
'square' 'diamond' 'v' '^' '>' '<' 'pentagram' 'hexagram'}';
newprefs.ruler.color = p.rulerColor;
newprefs.ruler.marker = markerStr{p.rulerMarker};
newprefs.ruler.markersize = p.markerSize;
if ud.prefs.tool.ruler
rc = evalin('base',newprefs.ruler.color);
set(ud.ruler.lines,'color',rc);
set(ud.ruler.markers,'color',rc,'marker',newprefs.ruler.marker,...
'markersize',evalin('base',newprefs.ruler.markersize))
end
case 'color'
newprefs.colororder = p.colorOrder;
newprefs.linestyleorder = p.linestyleOrder;
ud.colororder = num2cell(evalin('base',newprefs.colororder),2);
ud.linestyleorder = num2cell(evalin('base',newprefs.linestyleorder),2);
case 'filtview1'
newprefs.tool.zoompersist = p.zoomFlag;
newprefs.tool.ruler = p.rulerEnable;
newprefs.nfft = evalin('base',p.nfft);
newprefs.nimp = evalin('base',p.nimp);
set(ud.ht.magpop,'value',p.magscale)
set(ud.ht.phasepop,'value',p.phaseunits)
set(ud.ht.fscalepop,'value',p.freqscale)
set(ud.ht.frangepop,'value',p.freqrange)
newprefs.magmode = {'linear' 'log' 'decibels'};
newprefs.magmode = newprefs.magmode{p.magscale};
newprefs.phasemode = {'degrees' 'radians'};
newprefs.phasemode = newprefs.phasemode{p.phaseunits};
newprefs.freqscale = {'linear' 'log'};
newprefs.freqscale = newprefs.freqscale{p.freqscale};
newprefs.freqrange = p.freqrange;
% enable / disable ruler
if ud.prefs.tool.ruler ~= newprefs.tool.ruler
if newprefs.tool.ruler
% Enable ruler and ruler popupmenu
rulerPrefs = sptool('getprefs','ruler');
typeStr = {'vertical','horizontal','track','slope'};
ud.prefs.ruler.type = typeStr{rulerPrefs.initialType};
set(fig,'userdata',ud)
% Account for the case where the filter was cleared
% while viewing it in the filter viewer
if isfield(ud,'filt.tf.den')
realFilterFlag = (isreal(ud.filt(ud.focusIndex).tf.num)...
& isreal(ud.filt(ud.focusIndex).tf.den));
else
realFilterFlag = 1;
end
% Find mainaxes to focus rulers
[ud.mainaxes,ud.focusline,plotIndex,visPlots] = ...
setMainaxes(ud.mainaxes,ud.ht.a,ud.lines,realFilterFlag);
set(fig,'userdata',ud)
% Update rulerpopup; display (initialize) ruler panel
% and focus ruler on appropriate subplot
rulerPopStr = filtview('plotTitles',realFilterFlag);
rulerPopVal = min(plotIndex,length(rulerPopStr));
popupCallback = 'filtview(''rulerpopup'')';
ruler('init',fig,rulerPopStr,rulerPopVal,...
popupCallback,ud.ht.a)
ud = get(fig,'userdata');
new_ud = filtview('setudlimits',ud,ud.ht.a,plotIndex);
set(fig,'userdata',new_ud)
ruler('newlimits',fig,plotIndex)
ruler('newsig',fig,plotIndex)
noTrackZeroPole(fig,new_ud)
else
ruler('close',fig)
end
ud = get(fig,'userdata');
end
case 'filtview2'
if p.mode1
newprefs.tilemode = [2 3];
elseif p.mode2
newprefs.tilemode = [3 2];
elseif p.mode3
newprefs.tilemode = [6 1];
elseif p.mode4
newprefs.tilemode = [1 6];
end
end
ud.prefs = newprefs;
set(fig,'userdata',ud)
fvresize(1,fig)
if newprefs.tool.ruler
ruler('resizebtns',fig)
end
fvzoom('zoomout',ud.prefs.plots,fig)
filtview('plots',ud.prefs.plots,fig)
% Update ruler's XY limits; limits might have changed due to
% preferences changes
if ud.prefs.tool.ruler & newprefs.tool.ruler
ud = get(fig,'userdata');
plotIndex = find(ud.mainaxes==ud.ht.a);
new_ud = filtview('setudlimits',ud,ud.ht.a,plotIndex);
set(fig,'userdata',new_ud)
ruler('newlimits',fig,plotIndex)
ruler('newsig',fig,plotIndex)
end
end
end % of switch statement
function setstem(h,x,y)
%SETSTEM Set xdata and ydata of two handles for stem plots
set(h(1),'xdata',x,'ydata',y)
x = x(:); % make it a column
xx = x(:,[1 1 1])';
xx = xx(:);
n = nan;
y = [zeros(size(x)) y(:) n(ones(length(x),1),:)]';
set(h(2),'xdata',xx,'ydata',y(:));
function [mainaxes,focusline,plotIndex,visPlots] = ...
setMainaxes(oldMainaxes,axesList,lineList,realDataFlag)
%SETMAINAXES Set a new axes (if mainaxes was set invisible), from
% the list of visible axes, to be the new mainaxes (where rulers
% will be focused). Otherwise, use the input OldMainaxes as the
% new mainaxes.
% Inputs:
% oldMainaxes - handle to previous mainaxes
% axesList - list of axes handles of all possible subplots
% lineList - structure containing the handles to each line
% of all subplots
% realDataFlag - flag indicating that line which rulers are focused on is
% real
% Outputs:
% mainaxes - handle to the newly selected subplot axes
% focusline - handle to the newly selected line
% plotIndex - index into the list of the handles of all subplots
% visPlots - indices of visible plots of vector containing
% all subplots
%
visPlots = find(strcmp(get(axesList,'visible'),'on'));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -