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

📄 filtview.m

📁 matlabDigitalSigalProcess内有文件若干
💻 M
📖 第 1 页 / 共 5 页
字号:
        Fs = evalin('base',ud.prefs.Fs,'1');
        switch ud.prefs.freqrange
        case 1    % [0 Fs/2]
            flim = [Fs/ud.prefs.nfft Fs/2];
        case 2    % [0 Fs]
            flim = [Fs/ud.prefs.nfft Fs];
        end
        set(ud.ht.a([1 2 3]),'xscale','log','xlim',flim)
    end

    if ud.prefs.tool.ruler & any(ud.ht.a(1:3) == ud.mainaxes)
        plotIndex = find(ud.mainaxes == ud.ht.a);

        % Make sure that ud.limits matches new axes limits 
        ud = filtview('setudlimits',ud,ud.ht.a,plotIndex);
        set(fig,'userdata',ud)
        
        % Make sure that ruler values stay within the new axes limits
        ruler('inbounds',fig,'xlim',plotIndex)
        ud = get(fig,'userdata');
        
        ruler('newlimits',fig,plotIndex,ud.focusline)
        ruler('newsig',fig,plotIndex)
    end

    p = sptool('getprefs','filtview1');
    p.freqscale = get(ud.ht.fscalepop,'value');
    sptool('setprefs','filtview1',p)

% ----------------------------------------------------------------------
% filtview('frangepop',fig)
%   callback of frequency range popup
%
case 'frangepop'
    if nargin > 1
        fig = varargin{2};
    else
        fig = gcf;
    end

    ud = get(fig,'userdata');
    oldmode = ud.prefs.freqrange;
    popupval = get(ud.ht.frangepop,'value');
    popupstr = get(ud.ht.frangepop,'string');
    if (oldmode == popupval)
        return
    end
    switch popupval
    case 1
        ud.prefs.freqrange = 1;
    case 2
        ud.prefs.freqrange = 2;
    case 3
        % if in log scaling, don't allow display of negative frequencies
        if strcmp(ud.prefs.freqscale,'log')
            % so don't change range!
            msgbox({'Sorry, you can''t set the range to include negative' ...
                'frequencies when the Frequency Axis Scaling is logarithmic.'},...
                'Logarithmic Scaling Conflict','warn','modal')
            set(ud.ht.frangepop,'value',ud.prefs.freqrange)
            return
        end
        ud.prefs.freqrange = 3;
    end
    set(fig,'userdata',ud)
    
    filtview('plots',[ud.prefs.plots(1:3); 0; 0; 0],fig)
    fvzoom('zoomout',[ud.prefs.plots(1:3)' 0 0 0],fig) % sets userdata
    ud = get(fig,'userdata'); 
        
    % Make sure that rulers appear within the new axes limits
    if ud.prefs.tool.ruler & any(ud.ht.a(1:3) == ud.mainaxes)
        plotIndex = find(ud.mainaxes == ud.ht.a);
        ruler('inbounds',fig,'xlim',plotIndex) % make sure ruler limits are 
                                               % within the new axes limits
        if (ud.prefs.freqrange ~= oldmode)
            ruler('updatepeaksgroup',fig)
        end
    end

    p = sptool('getprefs','filtview1');
    p.freqrange = get(ud.ht.frangepop,'value');
    sptool('setprefs','filtview1',p)

% ----------------------------------------------------------------------
% filtview('Fs',fig)
%   callback of sampling frequency edit box 
%   (or you can use this to set the sampling frequency if you
%   set the string of ud.ht.Fsedit first)
%
case 'Fs'
    if nargin < 2
        fig = gcf;
    else
        fig = varargin{2};
    end

    ud = get(fig,'userdata');

    str = get(ud.ht.Fsedit,'string');

    if isequal(str,ud.prefs.Fs)
        return
    end

    [Fs,err] = validarg(str,[0 Inf],[1 1],'sampling frequency');
    if err
        set(ud.ht.Fsedit,'string',ud.prefs.Fs)
        return
    else
        ud.prefs.Fs = str;
        set(fig,'userdata',ud)
        if ~isempty(ud.tabfig)    % update settings figure
            data = get(ud.tabfig,'userdata');
            % this panel has been created since it is the first 1
            fvprefhand('populate',ud.tabfig,1,ud.prefs)
        end
        fvzoom('zoomout',ud.prefs.plots,fig)
        filtview('plots',ud.prefs.plots,fig)
    end
 
% ----------------------------------------------------------------------
% filtview('plots',plots,fig,need_update)
%   updates the plots indicated with a '1' in the plots vector
%   
case 'plots'
    if nargin < 3
        fig = gcf;
    else
        fig = varargin{3};
    end

    ud = get(fig,'userdata');

    if nargin < 4
        need_update = 1:length(ud.filt);   % everything needs updating
    else
        need_update = varargin{4};
    end
    
    plots = varargin{2};
    if all(plots==0)
        return
    end

    if isempty(ud.filt)
        % uninitialized tool - no filter
        % set axes limits to default value [0 1]
        for i=1:3
            if plots(i)
                set(ud.ht.a(i),'xlim',[0 1])
            end
        end
        return
    end
    
    maxFs = evalin('base',ud.prefs.Fs,'1');
    nfft = ud.prefs.nfft;
    
    if strcmp(ud.prefs.freqscale,'log')
        xlim1 = maxFs/ud.prefs.nfft;
    else
        xlim1 = 0;
    end
    switch ud.prefs.freqrange
    case 1    % [0 Fs/2]     
        flim = [xlim1 maxFs/2];
    case 2    % [0 Fs]      
        flim = [xlim1 maxFs];
    case 3    % [-Fs/2 Fs/2]
        flim = [-maxFs/2 maxFs/2];
    end

    % Loop through selected filters that need updating        
    for i = need_update
        Fs = ud.filt(i).Fs;
        switch ud.prefs.freqrange
        case 1    % [0 Fs/2]
            ud.filt(i).f = 0:Fs/nfft:(Fs/2 - Fs/(2*nfft));
        case 2    % [0 Fs]
            ud.filt(i).f = 0:Fs/nfft:(Fs - Fs/nfft);
        case 3    % [-Fs/2 Fs/2]
            ud.filt(i).f = fftshift(0:Fs/nfft:(Fs - Fs/nfft));
            ind = find(ud.filt(i).f>=Fs/2);
            ud.filt(i).f(ind) = ud.filt(i).f(ind)-Fs;
        end
    
        if any(plots([1 2 3]))
            ud.filt(i).H = fft(ud.filt(i).tf.num,nfft);
            warnsave = warning; 
            warning('off')   % prevent possible divide by 0 message
            ud.filt(i).H = ud.filt(i).H./fft(ud.filt(i).tf.den,nfft);
            warning(warnsave)
            switch ud.prefs.freqrange
            case 1    % [0 Fs/2]
                ud.filt(i).H = ud.filt(i).H(1:nfft/2);
            case 3    % [-Fs/2 Fs/2]
                ud.filt(i).H = fftshift(ud.filt(i).H);
            end
        end
        
        if isempty(ud.filt(i).lineinfo)
            lineColor = ud.colororder{1};
            lineStyle = ud.linestyleorder{1};
        else
            lineColor = ud.filt(i).lineinfo.color;
            lineStyle = ud.filt(i).lineinfo.linestyle;
        end
        
        if plots(1)
            if isempty(ud.lines(i).mag)
                ud.lines(i).mag = line(1,1,'tag','magline',...
                    'parent',ud.ht.a(1), ...
                    'buttondownfcn','filtview(''mdown'')');
            end
            set(ud.lines(i).mag,'color',lineColor,'linestyle',lineStyle)
            if strcmp(ud.prefs.magmode,'decibels')
                absH = abs(ud.filt(i).H);
                ind = find(absH>0);
                dbH = -Inf; dbH = dbH(ones(size(absH)));
                dbH(ind) = 20*log10(absH(ind));
                set(ud.lines(i).mag,'xdata',ud.filt(i).f,...
                    'ydata',dbH,'visible','on')
            else
                set(ud.lines(i).mag,'xdata',ud.filt(i).f,...
                    'ydata',abs(ud.filt(i).H),'visible','on')
            end        
        end
        
        if plots(2)
            if isempty(ud.lines(i).phase)
                ud.lines(i).phase = line(1,1,'tag','phaseline',...
                    'parent',ud.ht.a(2), ...
                    'buttondownfcn','filtview(''mdown'')');
            end
            set(ud.lines(i).phase,'color',lineColor,'linestyle',lineStyle)
            if ud.prefs.freqrange < 3
                pha = unwrap(angle(ud.filt(i).H));
            else
                pha_neg = unwrap(angle(ud.filt(i).H(nfft/2:-1:1)));
                pha_neg = pha_neg(end:-1:1);
                pha_pos = unwrap(angle(ud.filt(i).H((nfft/2+1):end)));
                pha = [pha_neg(:); pha_pos(:);];
            end

            switch ud.prefs.phasemode
            case 'degrees'
                set(ud.lines(i).phase,'xdata',ud.filt(i).f,...
                    'ydata',pha*180/pi,'visible','on')
            case 'radians'
                set(ud.lines(i).phase,'xdata',ud.filt(i).f,...
                    'ydata',pha,'visible','on')
            end
        end
        
        if plots(3)
            warnsave = warning; 
            warning('off');  % turn off divide by zero warning
            ud.filt(i).G = grpdelay(ud.filt(i).tf.num,ud.filt(i).tf.den,...
                           ud.filt(i).f,Fs);
            warning(warnsave);  
            if isempty(ud.lines(i).grpdelay)
                ud.lines(i).grpdelay = line(1,1,'tag','delayline',...
                    'parent',ud.ht.a(3), ... 
                    'buttondownfcn','filtview(''mdown'')');
            end
            set(ud.lines(i).grpdelay,'color',lineColor,'linestyle',lineStyle)
            set(ud.lines(i).grpdelay,'xdata',ud.filt(i).f,...
                'ydata',ud.filt(i).G,'visible','on')
        end
     
        if plots(4)
            if isempty(ud.lines(i).z)               
                ud.lines(i).z = line(NaN,NaN,'tag','zerosline',...
                    'linestyle','none','marker','o',...
                    'parent',ud.ht.a(4),...
                    'buttondownfcn','filtview(''mdown'')');
            end
            set(ud.lines(i).z,'color',lineColor)
            if isempty(ud.lines(i).p)
                ud.lines(i).p = line(NaN,NaN,'tag','polesline',...
                    'linestyle','none','marker','x',...
                    'parent',ud.ht.a(4),...
                    'buttondownfcn','filtview(''mdown'')');
            end
            set(ud.lines(i).p,'color',lineColor)
            if isempty(ud.filt(i).zpk)
                if ~isempty(ud.filt(i).ss)
                    [z,p,k] = ss2zp(ud.filt(i).ss.a,ud.filt(i).ss.b,...
                        ud.filt(i).ss.c,ud.filt(i).ss.d,1);
                elseif ~isempty(ud.filt(i).sos)
                    [z,p,k] = sos2zp(ud.filt(i).sos);
                else
                    if length(ud.filt(i).tf.den)<length(ud.filt(i).tf.num)
                        den = ud.filt(i).tf.den;
                        den(length(ud.filt(i).tf.num)) = 0;   % zero pad
                        [z,p,k] = tf2zp(ud.filt(i).tf.num,den);
                    else
                        [z,p,k] = tf2zp(ud.filt(i).tf.num,ud.filt(i).tf.den);
                    end
                end
                ud.filt(i).zpk.z = z;
                ud.filt(i).zpk.p = p; 
                ud.filt(i).zpk.k = k;
            end
            set(ud.lines(i).z,'xdata',real(ud.filt(i).zpk.z),...
                'ydata',imag(ud.filt(i).zpk.z),'visible','on')
            set(ud.lines(i).p,'xdata',real(ud.filt(i).zpk.p),...
                'ydata',imag(ud.filt(i).zpk.p),'visible','on')
            set(ud.ht.a(4),'ylimmode','auto','xlimmode','auto')
            apos = get(ud.ht.a(4),'Position');
            set(ud.ht.a(4),'DataAspectRatio',[1 1 1],...
                'PlotBoxAspectRatio',apos([3 4 4]))
        end
        if any(plots([5 6]))
            [ud.filt(i).imp,ud.filt(i).t] = ...
                impz(ud.filt(i).tf.num,ud.filt(i).tf.den,ud.prefs.nimp,Fs);
        end
        if plots(5)
            if isempty(ud.lines(i).imp)
                ud.lines(i).imp = line(nan,nan,'tag','implinedots',...
                    'linestyle','none','marker','o',...
                    'parent',ud.ht.a(5),...
                    'buttondownfcn','filtview(''mdown'')');
            end
            set(ud.lines(i).imp,'color',lineColor,'markerfacecolor',lineColor)
            if isempty(ud.lines(i).impstem)
                ud.lines(i).impstem = line(nan,nan,'color',lineColor,...
                    'linestyle','-',...
                    'tag','implinestem',...
                    'parent',ud.ht.a(5),...
                    'buttondownfcn','filtview(''mdown'')');
            end
            set(ud.lines(i).impstem,'color',lineColor,'linestyle',lineStyle)
            if isempty(ud.lines(i).impc)
                ud.lines(i).impc = line(nan,nan,'tag','implinedotsc',...
                    'linestyle','none','marker','*',...

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -