📄 filtdes.m
字号:
case 'create'
enable = 'on'; % this creates a new design; can always hit this button
% also need to focus the filtdes on the currently selected filter
fig = findobj('type','figure','tag','filtdes');
if ~isempty(fig) % the filtdes is open
f = sptool('Filters',0,SPTfig); % get the selected filters
designInd = find(strcmp('design',{f.type}));
f = f(designInd);
ud = get(fig,'userdata');
varargout{1} = enable;
if isequal(ud.filt,f)
set(ud.ht.filtMenu,'string',{f.label},...
'value',find(strcmp({f.label},ud.filt.label)))
return
end
if isempty(f) & isempty(ud.filt) % empty designer and no change
return
end
if isempty(f) % "clear" filtdes state
ud = get(fig,'userdata');
% instead of deleting all objects, just make them
% invisible
objCell = {ud.Objects.fdspec ud.Objects.fdax ...
ud.Objects.fdline ud.Objects.fdmeas};
for j=1:length(objCell)
for i=1:length(objCell{j})
set(objCell{j}(i),'visible','off')
end
end
ud.filt = [];
set(fig,'userdata',ud)
set(ud.ht.filtMenu,'string',{'<no filters>'},'value',1)
set(ud.ht.FsEdit,'enable','off','string','-')
set([ud.ht.autoDesign ud.ht.filtMenu ud.ht.modulePopup ...
ud.ht.overlay],'enable','off')
return
elseif ~isempty(ud.filt) & ~isempty(f)
ni = find(strcmp(ud.filt.label,{f.label})); % new index of
% previously selected filter with same name
if ~isempty(ni)
% we may not have to do anything here if the same
% exact filter was selected.
% before comparison, copy fields that filtview may
% have changed but filtdes doesn't care about:
ud.filt.imp = f(ni).imp;
ud.filt.step = f(ni).step;
ud.filt.t = f(ni).t;
ud.filt.H = f(ni).H;
ud.filt.G = f(ni).G;
ud.filt.f = f(ni).f;
ud.filt.zpk = f(ni).zpk;
if isequal(f(ni),ud.filt)
set(ud.ht.filtMenu,'string',{f.label},'value',ni)
return
end
else
ni = 1;
end
else
% ud.filt is empty, coming from empty state
ni = 1;
set(ud.ht.FsEdit,'enable','on')
set([ud.ht.autoDesign ud.ht.filtMenu ud.ht.modulePopup ...
ud.ht.overlay],'enable','on')
end
switch msg
case 'label'
set(ud.ht.filtMenu,'string',{f.label})
case 'Fs'
if strcmp(f.type,'design')
filtdes('Fsedit',f.Fs,fig)
end
otherwise
filtdes('setfilt',f(ni),fig)
set(ud.ht.filtMenu,'string',{f.label},'value',ni)
end
end
case 'change'
f = sptool('Filters',0,SPTfig);
if isempty(f)
enable = 'off';
elseif ~isempty(find(strcmp({f.type},'design')))
enable = 'on'; % this edits current design
else
enable = 'off';
end
end
varargout{1} = enable;
%------------------------------------------------------------------------
% filtdes('action',verb.action)
% respond to button push in SPTool
% possible actions are
% 'create'
% 'change'
case 'action'
switch varargin{2}
case 'create'
SPTfig = gcf;
[err,errstr,struc] = importfilt('make',{1 1 1 sptool('commonFs')});
struc.type = 'design';
labelList = sptool('labelList',SPTfig);
[popupString,fields,FsFlag,defaultLabel] = importfilt('fields');
struc.label = uniqueDefaultLabel(labelList,defaultLabel);
fig = findobj('type','figure','tag','filtdes');
if isempty(fig) % create the filtdes tool if not open
filtdes(struc)
fig = gcf;
ud = get(fig,'userdata');
struc = ud.filt;
end
sptool('import',struc,1) % puts new struc in SPTool AND
% focuses filtdes on the struc
% now bring filtdes to the front:
figure(fig)
case 'change'
SPTfig = gcf;
fig = findobj('type','figure','tag','filtdes');
if isempty(fig) % create the filtdes tool
f = sptool('Filters',0); % get the selected filter
designInd = find(strcmp('design',{f.type}));
f = f(designInd);
filtdes(f(1))
fig = gcf;
ud = get(fig,'userdata');
set(ud.ht.filtMenu,'string',{f.label},'value',1)
end
% bring filtdes figure to front:
figure(fig)
end
%------------------------------------------------------------------------
%filtdes('setfilt',f,fig)
% Set filter designer to filter object f
case 'setfilt'
f = varargin{2};
fig = varargin{3};
ud = get(fig,'userdata');
ptr = getptr(fig);
setptr(fig,'watch')
updateSPToolFlag = 0;
if ~isstruct(f.specs) | ~isfield(f.specs,'currentModule') | ...
isempty(find(strcmp(ud.modules,f.specs.currentModule)))
f.specs.currentModule = ud.modules{1};
updateSPToolFlag = 1;
end
moduleInd = find(strcmp(ud.modules,f.specs.currentModule));
if ~isequal(ud.currentModule,ud.modules{moduleInd})
% delete existing objects
% filtdes('clear',fig)
end
set(ud.ht.modulePopup,'value',moduleInd)
[newfilt,errstr] = feval(ud.modules{moduleInd},'init',f);
updateSPToolFlag = updateSPToolFlag | (~isequal(newfilt,f));
ud = get(fig,'userdata');
ud.filt = newfilt;
ud.currentModule = ud.modules{moduleInd};
set(fig,'userdata',ud)
set(ud.ht.FsEdit,'string',sprintf('%1.5g',ud.filt.Fs))
if updateSPToolFlag
ud.filt = importFiltNoLineinfo(ud.filt);
set(fig,'userdata',ud)
end
set(fig,ptr{:})
%------------------------------------------------------------------------
%filtdes('error')
case 'error'
error(varargin{2})
%------------------------------------------------------------------------
%obj = filtdes('findobj','fdspec'|'fdax'|'fdline'|'fdmeas',{prop,val,...})
% find filtdes objects
case 'findobj'
fig = findobj('tag','filtdes');
ud = get(fig,'userdata');
switch varargin{2}
case 'fdspec'
obj = ud.Objects.fdspec;
case 'fdax'
obj = ud.Objects.fdax;
case 'fdline'
obj = ud.Objects.fdline;
case 'fdmeas'
obj = ud.Objects.fdmeas;
otherwise
error('Can only find fdspec, fdax, fdline, or fdmeas')
end
propIndx = 3;
while ~isempty(obj) & (length(varargin)>propIndx)
props = get(obj,varargin{propIndx});
if length(obj)==1
props = {props};
end
for i = length(obj):-1:1
if ~isequal(props{i},varargin{propIndx+1})
obj(i) = [];
end
end
propIndx = propIndx + 2;
end
varargout{1} = obj;
%------------------------------------------------------------------------
%filtdes('fdspec')
case 'fdspec'
fig = gcbf;
ud = get(fig,'userdata');
h = get(ud.Objects.fdspec,'h');
if length(h) == 1
h = {h};
end
ind = find([h{:}] == gcbo);
oldval = ud.Objects.fdspec(ind).value;
% Get new value from edit box and execute the edit box's callback
userchange(ud.Objects.fdspec(ind));
if ud.Objects.fdspec(ind).value ~= oldval
if get(ud.ht.autoDesign,'value') == 1
filtdes('apply')
else
set([ud.ht.revert ud.ht.apply],'enable','on')
end
end
%------------------------------------------------------------------------
%filtdes('fdmeas')
case 'fdmeas'
fig = gcbf;
ud = get(fig,'userdata');
h = get(ud.Objects.fdmeas,'h');
if length(h) == 1
h = {h};
end
ind = find([h{:}] == gcbo);
userchange(ud.Objects.fdmeas(ind));
%------------------------------------------------------------------------
% filtdes('apply')
% Callback for Apply button
%
case 'apply'
fig = findobj('tag','filtdes');
ud = get(fig,'userdata');
oldptr = getptr(fig);
setptr(fig,'watch')
newfilt = ud.filt;
[newfilt, errmsg] = fdutil('callModuleApply',ud.currentModule,newfilt,'button');
if ~isempty(errmsg)
set(fig,oldptr{:})
str = sprintf(['Sorry, the desired filter could not be designed.\n' ...
'Reverting to the last valid filter.\n' ...
'The error message is: \n%s'],errmsg);
msgbox(str,'Error','error','modal')
filtdes('revert')
return
end
if ~isequal(ud.filt,newfilt)
ud.filt = newfilt;
ud.filt = importFiltNoLineinfo(ud.filt);
sptool('import',ud.filt,1)
set(fig,'userdata',ud)
end
for i = 1:length(ud.Objects.fdspec)
ud.Objects.fdspec(i).revertvalue = ud.Objects.fdspec(i).value;
end
set([ud.ht.revert ud.ht.apply],'enable','off')
set(fig,oldptr{:})
%------------------------------------------------------------------------
% filtview('revert')
% Callback of Revert button
%
case 'revert'
fig = findobj('tag','filtdes');
ud = get(fig,'userdata');
for i = 1:length(ud.Objects.fdspec)
ud.Objects.fdspec(i).value = ud.Objects.fdspec(i).revertvalue;
end
set([ud.ht.revert ud.ht.apply],'enable','off')
feval(ud.currentModule,'revert');
%------------------------------------------------------------------------
% filtview('Fsedit')
% Callback of Sampling frequency edit box
% filtview('Fsedit',Fs)
% Pass argument Fs to change this filter's sampling frequency
case 'Fsedit'
fig = findobj('type','figure','tag','filtdes');
ud = get(fig,'userdata');
if nargin>1
val = varargin{2};
errstr = '';
else
[val,errstr] = fdutil('fdvalidstr',...
get(ud.ht.FsEdit,'string'),0,0,[0 Inf],[0 0]);
end
if ~isempty(errstr)
msgbox(errstr,'Error','error','modal')
elseif ud.filt.Fs ~= val
oldFs = ud.filt.Fs;
ud.filt.Fs = val;
set(fig,'userdata',ud)
newfilt = feval(ud.currentModule,'Fs',ud.filt,oldFs);
if ~isequal(ud.filt,newfilt)
ud = get(fig,'userdata');
ud.filt = newfilt;
ud.filt = importFiltNoLineinfo(ud.filt);
sptool('import',ud.filt,1)
set(fig,'userdata',ud)
% since Fs was either changed by the user in filtdes, or the change
% in SPTool to Fs resulted in a change to the ud.filt besides
% ud.filt.Fs
elseif nargin == 1
ud.filt = importFiltNoLineinfo(ud.filt);
sptool('import',ud.filt,1)
set(fig,'userdata',ud)
% since Fs was changed by user in filtdes
end
end
set(ud.ht.FsEdit,'string',sprintf('%1.5g',ud.filt.Fs))
%------------------------------------------------------------------------
% filtview('SPTclose')
% closerequestfcn of figure, and also called when SPTool closes
%
case 'SPTclose'
fig = findobj('type','figure','tag','filtdes');
if ~isempty(fig)
delete(fig)
end
%------------------------------------------------------------------------
% filtview('overlay')
% Callback of Overlay Spectrum... button
%
case 'overlay'
fig = gcbf;
ud = get(fig,'userdata');
s = sptool('Spectra');
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -