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

📄 fdcheby1.m

📁 有关matlab的电子书籍有一定的帮助希望有用
💻 M
📖 第 1 页 / 共 4 页
字号:
    end
    if type > 2
        fchange_ind = (i==(1:4)) * [1 4; 2 3; 2 3; 1 4];
    else
        fchange_ind = i;
    end
    updateLines(0,type,fchange_ind,f1,f2,f3,f4,Rp,Rs,Fs)
    fdutil('pokeFilterMeasurements','fdcheby1',type,f1,f2,f3,f4,Rp,Rs,Fs)


function RChangeMeas(passbandChange,type,Fs,Lresp,L1,L2,f1,f2,f3,f4,Rp,Rs)
%RChangeMeas - interactively track response when Rp or Rs has changed
%  This function is meant to be called when the user
%     a) changes the Rp or Rs measurement
%  or b) drags the Rp or Rs value
%  Xdata, Ydata, values of other frequencies and Rp and Rs are updated as
%  needed.
%  Note that for cheby1, only dragging Rs is allowed in this fashion, so
%  passbandChange is assumed 0 and is ignored.
%  Inputs:
%    passbandChange - boolean == 1 for Rp, 0 for Rs, or vector [0 1] for
%          both Rp and Rs
%    type - band configuration (1 = lp, 2 = hp, 3 = bp, 4 = bs)
%    Fs - sampling frequency
%    Lresp, L1, L2 - fdline objects
%    f1,f2,f3,f4,Rp,Rs - fdmeas objects

    ff = Lresp.xdata;
    delf = ff(2)-ff(1);  % frequency spacing
    Hlog = Lresp.ydata;
    Rs_val = get(Rs,'value');
    [Fstop,Rs_val1] = getFreqMeasurements(ff,Hlog,type,Rp.value,Rs_val);
    if Rs_val ~= Rs_val1
        set(Rs,'value',Rs_val1)
    end
    %Fstop = getFreqMeasurements(ff,Hlog,type,Rp.value,Rs.value);
    i = [];  % which frequencies have changed
    switch type
    case 1
        f2.value = Fstop;
        i = [i 2];
    case 2
        f1.value = Fstop;
        i = [1 i];
    case 3 % bandpass - update f2 f3
        f1.value = Fstop(1);
        f4.value = Fstop(2);
        i = [1 i 4];
    case 4 % bandstop - update f1 f4
        f2.value = Fstop(1);
        f3.value = Fstop(2);
        i = sort([i 2 3]);
    end
    updateLines(passbandChange,type,i,f1,f2,f3,f4,Rp,Rs,Fs)
    fdutil('pokeFilterMeasurements','fdcheby1',type,f1,f2,f3,f4,Rp,Rs,Fs)

    
function updateLines(passbandChange,type,fchange_ind,f1,f2,f3,f4,Rp,Rs,Fs)
% assume values of f1,f2,f3,f4,Rp and Rs are correct now
% fchange_ind - vector of indices indicating which frequencies have
%               changed
    global L1 L2 ax
    
    f = getFrequencyValues(type,f1,f2,f3,f4,Fs)*Fs/2;
    
    if any(passbandChange==1)
        maxpass = 0;
        minpass = -Rp.value;
        % update L1 xdata and ydata
        switch type
        case 1   % lowpass
            set(L1,'xdata',[f(1:2) NaN f(1:2)],...
                   'ydata',[maxpass maxpass NaN minpass minpass])
        case 2   % highpass
            set(L1,'xdata',[f(3:4) NaN f(3:4)],...
                   'ydata',[maxpass maxpass NaN minpass minpass ])
        case 3   % bandpass
            set(L1,'xdata',[f(3:4) NaN f(3:4)],...
                   'ydata',[maxpass maxpass NaN minpass minpass])
        case 4   % bandstop
            set(L1,'xdata',[f(1:2) NaN f(1:2) NaN f(5:6) NaN f(5:6)],...
                   'ydata',[ maxpass maxpass NaN minpass minpass NaN ...
                             maxpass maxpass NaN minpass minpass])
        end
        ylim = [minpass maxpass];
        dyl = (ylim(2)-ylim(1))*.15;
        ax.ylimPassband = ylim + [-dyl/2 dyl/2];
        if length(f)==4
            f(6)=0;  % zeropad for call to xlimpassband
        end
        ax.xlimPassband = fdutil('xlimpassband',type,...
                             Fs,f(2),f(3),f(4),f(5));
    end
    if any(passbandChange==0)
        minstop = -Rs.value;
        % update L2 xdata and ydata
        switch type
        case 1   % lowpass
            set(L2,'xdata',[f(3:4)],'ydata',[minstop minstop])
        case 2   % highpass
            set(L2,'xdata',[f(1:2)],'ydata',[ minstop minstop])
        case 3   % bandpass
            set(L2,'xdata',[f(1:2) NaN f(5:6)],...
                   'ydata',[ minstop minstop NaN minstop minstop])
        case 4   % bandstop
            set(L2,'xdata',[f(3:4)],'ydata',[minstop minstop])
        end
    end
    %fdutil('updateRanges',fchange_ind,f1,f2,f3,f4)
    set(f1,'range',[0 Fs/2])
    set(f2,'range',[0 Fs/2])
    set(f3,'range',[0 Fs/2])
    set(f4,'range',[0 Fs/2])
    
function [f1,f2,f3,f4] = setupFrequencyObjects(type,module,pbobjects,...
                   sbobjects,f,Fs,ax,setValueFlag)

    if nargin<8
        setValueFlag = 1;
    end
    
    switch type
    case 1 % lowpass
        f1 = pbobjects(1);
        f2 = sbobjects(1);
        f3 = sbobjects(2);
        f4 = pbobjects(2);
        pbobjects(2).visible = 'off';
        sbobjects(2).visible = 'off';
        set(f1,'label','Fp')
        set(f2,'label','Fs')
    case 2 % highpass
        f1 = sbobjects(1);
        f2 = pbobjects(1);
        f3 = pbobjects(2);
        f4 = sbobjects(2);
        pbobjects(2).visible = 'off';
        sbobjects(2).visible = 'off';
        set(f1,'label','Fs')
        set(f2,'label','Fp')
    case 3 % bandpass
        f1 = sbobjects(1);
        f2 = pbobjects(1);
        f3 = pbobjects(2);
        f4 = sbobjects(2);
        pbobjects(2).visible = 'on';
        sbobjects(2).visible = 'on';
        set(f1,'label','Fs1')
        set(f2,'label','Fp1')
        set(f3,'label','Fp2')
        set(f4,'label','Fs2')
    case 4
        f1 = pbobjects(1);
        f2 = sbobjects(1);
        f3 = sbobjects(2);
        f4 = pbobjects(2);
        pbobjects(2).visible = 'on';
        sbobjects(2).visible = 'on';
        set(f1,'label','Fp1')
        set(f2,'label','Fs1')
        set(f3,'label','Fs2')
        set(f4,'label','Fp2')
    end
    if setValueFlag
        if type < 3
            set(f1,'value',f(2)*Fs/2,'range',[0 f(3)]*Fs/2)
            set(f2,'value',f(3)*Fs/2,'range',[f(2) 1]*Fs/2)
        else
            set(f1,'value',f(2)*Fs/2,'range',[0 f(3)*Fs/2])
            set(f2,'value',f(3)*Fs/2,'range',[f(2) f(4)]*Fs/2)
            set(f3,'value',f(4)*Fs/2,'range',[f(3) f(5)]*Fs/2)
            set(f4,'value',f(5)*Fs/2,'range',[f(4) 1]*Fs/2)
        end
        ax.xlimPassband = fdutil('xlimpassband',type,...
                             Fs,f1.value,f2.value,f3.value,f4.value);
    end
    set(f1,'range',[0 Fs/2])
    set(f2,'range',[0 Fs/2])
    set(f3,'range',[0 Fs/2])
    set(f4,'range',[0 Fs/2])
    
    f1.callback = [module '(''fchange'',1)'];
    f2.callback = [module '(''fchange'',2)'];
    f3.callback = [module '(''fchange'',3)'];
    f4.callback = [module '(''fchange'',4)'];
        
function [Rp,Rs,f1,f2,f3,f4] = ...
      setupMeasurementObjects(specStruc,Fstop,Fs,order,order1,stopframe1,ax,...
                  pbmeasures,sbmeasures,pbspecs,...
                  sbspecs,Rp,Rs,Fs1m,Fs2m,f1,f2,f3,f4)
%function setupMeasurementObjects(specStruc,Fstop,Fs,...
%                  order1,sbmeasures,Fs1m,Fs2m)
%  set values of MEASUREMENTS objects ... assumes specStruct is current    

    setOrderFlag = specStruc.setOrderFlag;
    type = specStruc.type;
    f = specStruc.f;
    Rpass = specStruc.Rp;
    Rstop = specStruc.Rs;
    Fpass = specStruc.Fpass;
    N = specStruc.order;
    
    if ~setOrderFlag  % estimate order
        set(order1,'visible','on')
        
        fdutil('changeToText',sbmeasures(1:2))
        set(sbmeasures(3),'visible','off')
        
        set(Fs1m,'visible','on','value',Fstop(1),...
            'format','%1.4g')
        if type > 2
            set(Fs1m,'label','Actual Fs1')
            set(Fs2m,'visible','on','value',Fstop(2),...
                'format','%1.4g','label','Actual Fs2')
        else
            set(Fs1m,'label','Actual Fs')
            set(Fs2m,'visible','off')
        end

        order1.value = N;
    else  % set order
        set(order1,'visible','off')
        
        set(sbspecs(1),'visible','off')
        set(sbspecs(2),'visible','off')
        set(sbspecs(3),'visible','off')
        
        fdutil('changeToEdit',sbmeasures(1:2))
        set(sbmeasures(3),'visible','on')
        
        [f1,f2,f3,f4] = setupFrequencyObjects(type,'fdcheby1',pbspecs,...
                                     sbmeasures,f,Fs,ax,0);
                                             
        set(sbmeasures(1),'value',Fstop(1))
        if type > 2
            set(sbmeasures(2),'value',Fstop(2))
        end

        Rs = sbmeasures(3);        
        set(Rs,'value',Rstop,'label','Rs',...
            'visible','on','callback','fdcheby1(''Rschange'')')
    end
    for i=1:3
        set(sbmeasures(i),'enable','on')
    end
    set(order1,'enable','on')


%function specStruc = measureFilt(objSetupFlag,specStruc,Fs,order1,...
%                  sbmeasures,Fs1m,Fs2m,ff,Hlog,L1,L2,ax)

function [Rp,Rs,f1,f2,f3,f4,specStruc] = ...
      measureFilt(objSetupFlag,specStruc,Fs,order,order1,stopframe1,ax,...
                  pbmeasures,sbmeasures,pbspecs,sbspecs,Rp,Rs,Fs1m,Fs2m,f1,f2,f3,f4,...
                  ff,Hlog,L1,L2);

    n = specStruc.order;    
    setOrderFlag = specStruc.setOrderFlag;
    Fpass = specStruc.Fpass*Fs/2;
    
    [Fstop,Rs_val] = getFreqMeasurements(ff,Hlog,specStruc.type,...
                             specStruc.Rp,specStruc.Rs);
    Rs.value = Rs_val;

    if objSetupFlag
        [Rp,Rs,f1,f2,f3,f4] = ...
          setupMeasurementObjects(specStruc,Fstop,Fs,order,order1,stopframe1,ax,...
                     pbmeasures,sbmeasures,pbspecs,sbspecs,...
                     Rp,Rs,Fs1m,Fs2m,f1,f2,f3,f4);
        %setupMeasurementObjects(specStruc,Fstop,Fs,...
        %          order1,sbmeasures,Fs1m,Fs2m)    
    else
        set(Fs1m,'value',Fstop(1))
        if specStruc.type > 2
            set(Fs2m,'value',Fstop(2))
        end
        if ~setOrderFlag
            order1.value = n;
        end
    end

    if setOrderFlag
        % Update stopband edges in specStruc frequency vector:
        switch specStruc.type
        case 1
            f = [0 Fpass Fstop Fs/2];
        case 2
            f = [0 Fstop Fpass Fs/2];
        case 3
            f = [0 Fstop(1) Fpass(:)' Fstop(2) Fs/2];
        case 4
            f = [0 Fpass(1) Fstop(:)' Fpass(2) Fs/2];
        end
        specStruc.f = f*2/Fs;
    else
        f = specStruc.f*Fs/2;
    end
    
    maxpass = 0;   minpass = -specStruc.Rp;   minstop = -specStruc.Rs;
    
    % update L1 and L2 xdata and ydata, pointers, dragmodes
    fdutil('setLines','fdcheby1',L1,L2,0,...
                      specStruc.type,specStruc.f(:)',...
                      Fs,minpass,maxpass,minstop)
                       
    % update [ylim/xlim] passband limits
    ylim = [minpass maxpass];
    dyl = (ylim(2)-ylim(1))*.15;
    set(ax,'ylimPassband',ylim + [-dyl/2 dyl/2]);
    ax.xlimPassband = fdutil('xlimpassband',specStruc.type,...
                              Fs,f(2),f(3),f(end-2),f(end-1));
                              

function f = getFrequencyValues(type,f1,f2,f3,f4,Fs);            
if type < 3  % low or high pass
    f = [0 f1.value f2.value Fs/2]*2/Fs;
else
    f = [0 f1.value f2.value f3.value f4.value Fs/2]*2/Fs;
end

function [setOrderFlag_init, type_init, f_init, Rp_init, Rs_init, ...
         order_init, Fpass_init] = initSpecs(filt)
%initSpecs   Initial specifications for cheby 1 filter, from
%            filt input
%Switches off of filt.currentModule and if it finds any of
% fdellip, fdbutter, fdcheby2, fdremez, fdfirls, or fdkaiser
% retains the type, order, band edge, and any other relevant
% parameters

    % first define default values
    setOrderFlag_init = 0;   % by default, estimate order 
    type_init = 1;  % 1=lowpass, 2=highpass, 3=bandpass, 4=bandstop
    f_init = [0 .2 .25 1];
    Rp_init = 3;
    Rs_init = 20;
    order_init = 30;
    Fpass_init = .22;
    switch filt.specs.currentModule
    case {'fdellip','fdbutter','fdcheby2','fdremez','fdkaiser','fdfirls'}
        s = eval(['filt.specs.' filt.specs.currentModule]);
        setOrderFlag_init = s.setOrderFlag;
        type_init = s.type;
        f_init = s.f;
        Rp_init = s.Rp;
        Rs_init = s.Rs;
        order_init = s.order;
        switch filt.specs.currentModule
        case 'fdellip'
            Fpass_init = s.Fpass;
        case 'fdbutter'
            Fpass_init = s.w3db;
        case 'fdcheby2'
            Fpass_init = s.Fstop;
        case {'fdremez','fdfirls'}
            switch s.type
            case {1,2}
                Fpass_init = s.f(3);
            case 3
                Fpass_init = s.f([2 5]);
            case 4
                Fpass_init = s.f(3:4);
            end
        case 'fdkaiser'
            Fpass_init = s.Wn;
        end
        if any(strcmp(filt.specs.currentModule,...
                 {'fdremez','fdkaiser','fdfirls'}))
            order_init = ceil(order_init/10); 
             %  FIR filters are much higher order than IIR
        end
    case 'fdcheby1'
        if isfield(filt.specs,'fdcheby1')
            setOrderFlag_init = filt.specs.fdcheby1.setOrderFlag;
            type_init = filt.specs.fdcheby1.type;
            f_init = filt.specs.fdcheby1.f;
            Rp_init = filt.specs.fdcheby1.Rp;
            Rs_init = filt.specs.fdcheby1.Rs;
            order_init = filt.specs.fdcheby1.order;
            Fpass_init = filt.specs.fdcheby1.Fpass;
        end
    end
    

⌨️ 快捷键说明

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