⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 filtdes.m

📁 有关matlab的电子书籍有一定的帮助希望有用
💻 M
📖 第 1 页 / 共 5 页
字号:
    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 + -