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

📄 fdutil.m

📁 matlabDigitalSigalProcess内有文件若干
💻 M
📖 第 1 页 / 共 3 页
字号:
        set(L2,'xdata',[f(1:2)]*Fs/2,'ydata',[minstop minstop])
        if ~setOrderFlag
            set(L2,...
               'vertexdragmode',{'none' 'lr'},...
               'vertexdragcallback',...
                  {'' [module '(''L2drag'',2,2)']},...
               'vertexpointer',{'' 'lrdrag'})
        end
    case 3   % bandpass
        set(L1,'xdata',[f(3:4) NaN f(3:4)]*Fs/2,...
               'ydata',[maxpass maxpass NaN minpass minpass])
        if ~setOrderFlag
            set(L1,...
               'vertexdragmode',{'lr' 'lr' 'none' 'lr' 'lr'},...
               'vertexdragcallback',...
                  {[module '(''L1drag'',3,1)'] [module '(''L1drag'',3,2)'] '' ...
                   [module '(''L1drag'',3,4)'] [module '(''L1drag'',3,5)']},...
               'vertexpointer',{'lrdrag' 'lrdrag' '' 'lrdrag' 'lrdrag'})
        end
        set(L2,'xdata',[f(1:2) NaN f(5:6)]*Fs/2,...
               'ydata',[ minstop minstop NaN minstop minstop])
        if ~setOrderFlag
            set(L2,...
               'vertexdragmode',{'none' 'lr' 'none' 'lr' 'none'},...
               'vertexdragcallback',...
                  {'' [module '(''L2drag'',3,2)'] '' ...
                   [module '(''L2drag'',3,4)'] ''},...
               'vertexpointer',{'' 'lrdrag' '' 'lrdrag' ''})
        end
    case 4   % bandstop
        set(L1,'xdata',[f(1:2) NaN f(1:2) NaN f(5:6) NaN f(5:6)]*Fs/2,...
               'ydata',[ maxpass maxpass NaN minpass minpass NaN ...
                         maxpass maxpass NaN minpass minpass])
        if ~setOrderFlag
            set(L1,...
               'vertexdragmode',{'none' 'lr'   'none' 'none' 'lr' 'none'...
                                 'lr'   'none' 'none' 'lr'   'none'},...
               'vertexdragcallback',...
                  {'' [module '(''L1drag'',4,2)'] '' '' ...
                                                [module '(''L1drag'',4,5)'] '' ...
                   [module '(''L1drag'',4,7)'] '' '' ...
                   [module '(''L1drag'',4,10)'] ''},...
               'vertexpointer',{'' 'lrdrag' '' '' 'lrdrag' '' 'lrdrag' '' '' ...
                                     'lrdrag' ''})
        end
        set(L2,'xdata',[f(3:4)]*Fs/2,'ydata',[minstop minstop])
        if ~setOrderFlag
            set(L2,...
               'vertexdragmode',{'lr' 'lr'},...
               'vertexdragcallback',...
                  {[module '(''L2drag'',4,1)'] [module '(''L2drag'',4,2)']},...
               'vertexpointer',{'lrdrag' 'lrdrag'})
        end
    end
    if setOrderFlag
        set(L1,'vertexdragmode',{'none'},'vertexpointer',{''})
        set(L2,'vertexdragmode',{'none'},'vertexpointer',{''})
    end           
    switch type
    case 1   % lowpass
        if ~dragUpperPassband
            set(L1,'segmentdragmode',{'none' 'none' 'none' 'ud'},...
                   'segmentdragcallback',...
                       {'' '' '' [module '(''Rpdrag'',1,4)']},...
                   'segmentpointer',{'' '' '' 'uddrag'})
        else
            set(L1,'segmentdragmode',{'ud' 'none' 'none' 'ud'},...
                   'segmentdragcallback',...
                       {[module '(''Rpdrag'',1,1)'] '' ...
                        '' [module '(''Rpdrag'',1,4)']},...
                   'segmentpointer',{'uddrag' '' '' 'uddrag'})
        end
        set(L2,'segmentdragmode',{'ud'},...
               'segmentdragcallback',{[module '(''Rsdrag'',1,1)']},...
               'segmentpointer',{'uddrag'})
               
    case 2   % highpass
        if ~dragUpperPassband
            set(L1,'segmentdragmode',{'ud'},...
                   'segmentdragcallback',...
                        {'' '' '' [module '(''Rpdrag'',2,4)']},...
                   'segmentpointer',{'' '' '' 'uddrag'})
        else
            set(L1,'segmentdragmode',{'ud'},...
                   'segmentdragcallback',...
                        {[module '(''Rpdrag'',2,1)'] '' ...
                         '' [module '(''Rpdrag'',2,4)']},...
                   'segmentpointer',{'uddrag' '' '' 'uddrag'})
        end
        set(L2,'segmentdragmode',{'ud' 'none' 'none' 'ud'},...
               'segmentdragcallback',{[module '(''Rsdrag'',2,1)']},...
               'segmentpointer',{'uddrag'})
               
    case 3   % bandpass
        if ~dragUpperPassband
            set(L1,'segmentdragmode',{'none' 'none' 'none' 'ud'},...
                   'segmentdragcallback',...
                      {'' '' '' [module '(''Rpdrag'',3,4)']},...
                   'segmentpointer',{'' '' '' 'uddrag'})
        else
            set(L1,'segmentdragmode',{'ud' 'none' 'none' 'ud'},...
                   'segmentdragcallback',...
                      {[module '(''Rpdrag'',3,1)'] '' ...
                       '' [module '(''Rpdrag'',3,4)']},...
                   'segmentpointer',{'uddrag' '' '' 'uddrag'})
        end      
        set(L2,'segmentdragmode',{'ud' '' '' 'ud'},...
               'segmentdragcallback',...
                  {[module '(''Rsdrag'',3,1)'] '' '' [module '(''Rsdrag'',3,4)']},...
               'segmentpointer',{'uddrag' '' '' 'uddrag'})
               
    case 4   % bandstop
        if ~dragUpperPassband
            set(L1,'segmentdragmode',{'none' 'none' 'none' 'ud' 'none' 'none'...
                                      'none' 'none' 'none' 'ud'},...
                   'segmentdragcallback',...
                      {'' '' '' ...
                       [module '(''Rpdrag'',4,4)'] '' '' ...
                       '' '' '' ...
                       [module '(''Rpdrag'',4,10)']},...
                   'segmentpointer',{'' '' '' 'uddrag' '' '' '' '' '' 'uddrag'})
        else
            set(L1,'segmentdragmode',{'ud' 'none' 'none' 'ud' 'none' 'none'...
                                      'ud' 'none' 'none' 'ud'},...
                   'segmentdragcallback',...
                      {[module '(''Rpdrag'',4,1)'] '' '' ...
                       [module '(''Rpdrag'',4,4)'] '' '' ...
                       [module '(''Rpdrag'',4,7)'] '' '' ...
                       [module '(''Rpdrag'',4,10)']},...
                   'segmentpointer',{'' '' '' 'uddrag' '' '' '' '' '' 'uddrag'})
        end
        set(L2,'segmentdragmode',{'ud'},...
               'segmentdragcallback',{[module '(''Rsdrag'',4,1)']},...
               'segmentpointer',{'uddrag'})
    end


function [newfilt, errstr] = callModuleApply(module,filt,msg,varargin)
% wrapper for feval of module's apply function, in case it errors out 
    newfilt = filt;  % in case of error, return same filter that was passed in
    errstr = '';  % assume no error
    apply_err = 0;
    eval('[newfilt, errstr]=feval(module,''apply'',filt,msg,varargin{:});',...
         'apply_err = 1;')
    if apply_err
        errstr = lasterr;
    end
 
function pokeFilterMeasurements(module,type,f1,f2,f3,f4,Rp,Rs,Fs)
% This function is called by the modules
%    fdkaiser  fdbutter  fdcheby1  fdcheby2
% after a measurement has been edited (or a red line dragged).
% This will update the filter spec in the filter designer
% according to the new values of the measurements.  Note that
% the filter will NOT be imported into the SPTool, until it has
% been redesigned.
    fig = get(f1,'parent');
    ud = get(fig,'userdata');
    f = getFrequencyValues(type,f1,f2,f3,f4,Fs);
    moduleSpecs = getfield(ud.filt.specs,module);
    moduleSpecs.f = f;
    moduleSpecs.Rp = get(Rp,'value');
    moduleSpecs.Rs = get(Rs,'value');
    ud.filt.specs = setfield(ud.filt.specs,module,moduleSpecs);
    set(fig,'userdata',ud)
    
 
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 newspecs = updateSpecStruc(specs)
% update version '1.0' filter design structure to version '2.0'
    if isempty(specs)
        newspecs = specs;
        return
    end
    % first get common fields
    moduleSpecs.setOrderFlag = (specs.ordermode == 2);
    moduleSpecs.type = specs.type;
    moduleSpecs.f = [0; specs.f(:); 1];
    moduleSpecs.Rp = specs.Rp;
    moduleSpecs.Rs = specs.Rs;
    if specs.ordermode == 1
        moduleSpecs.order = specs.order.auto;
    else
        moduleSpecs.order = specs.order.manual;
    end
    if specs.specialparamsmode == 1
        special = specs.special.auto;
    else
        special = specs.special.manual;
    end
    switch specs.method
    case 1
        newspecs.currentModule = 'fdremez';
        newspecs = setfield(newspecs,newspecs.currentModule,moduleSpecs);
        if specs.type == 1 | specs.type == 4
            newspecs.fdremez.wt = special([1 2]);
        else
            newspecs.fdremez.wt = special([2 1]);
        end
    case 2
        newspecs.currentModule = 'fdfirls';
        newspecs = setfield(newspecs,newspecs.currentModule,moduleSpecs);
        newspecs.fdfirls.setOrderFlag = 1;
        if specs.type == 1 | specs.type == 4
            newspecs.fdfirls.wt = special([1 2]);
        else
            newspecs.fdfirls.wt = special([2 1]);
        end
    case 3
        newspecs.currentModule = 'fdkaiser';
        newspecs = setfield(newspecs,newspecs.currentModule,moduleSpecs);
        newspecs.fdkaiser.Wn = special(2:end);
        newspecs.fdkaiser.Beta = special(1);
        newspecs.fdkaiser.wind = kaiser(newspecs.fdkaiser.order+1,newspecs.fdkaiser.Beta);
    case 4
        newspecs.currentModule = 'fdbutter';
        newspecs = setfield(newspecs,newspecs.currentModule,moduleSpecs);
        newspecs.fdbutter.w3db = special;
    case 5
        newspecs.currentModule = 'fdcheby1';
        newspecs = setfield(newspecs,newspecs.currentModule,moduleSpecs);
        newspecs.fdcheby1.Fpass = special;
    case 6
        newspecs.currentModule = 'fdcheby2';
        newspecs = setfield(newspecs,newspecs.currentModule,moduleSpecs);
        newspecs.fdcheby2.Fstop = special;
    case 7
        newspecs.currentModule = 'fdellip';
        newspecs = setfield(newspecs,newspecs.currentModule,moduleSpecs);
        newspecs.fdellip.Fpass = special;
    end


function y = rmax(x)
% Y=RMAX(X)   RUNNING MAXIMUM 
    y = x;
    [ind,peaks] = findpeaks(y);
    [sortPeak,sortPeakInd] = sort(peaks);
    ind = ind(sortPeakInd);
    for i = 1:length(ind)
        if i < length(ind)
            nextPeakInd = min(ind(i+1:end))-1;
            jkl = find(y(ind(i):nextPeakInd) <= sortPeak(i));
            y(ind(i):(ind(i)+length(jkl)-1)) = sortPeak(i);
        else
            y(ind(i):end) = sortPeak(i);
        end
    end
    
function y = rmin(x)
% Y=RMIN(X)   RUNNING MINIMUM 
    y = -rmax(-x);
    
    
function showBandConfigWindow(fig,h)
% Put up a figure to help people understand how the parameters 
% describe the filter specifications
    cfig = findobj(allchild(0),'tag','BandConfigWindow');
    if isempty(cfig)
    % create figure
        cfig = figure('name','Band Configurations','tag','BandConfigWindow');
    end
    figure(cfig)
    co = get(0,'defaultaxescolororder');
    
    filt1 =   [  
     0.017943
     0.030958
    -0.018458
      -0.1084
    -0.081255
      0.15304
      0.40953
      0.40953
      0.15304
    -0.081255
      -0.1084
    -0.018458
     0.030958
     0.017943];
     
     filt2 = [
   -0.0033438
    -0.011265
     0.049015
     -0.05273
    -0.027279
     0.092079
     0.032446
     -0.31319
      0.46599
     -0.31319
     0.032446
     0.092079
    -0.027279
     -0.05273
     0.049015
    -0.011265
   -0.0033438];
   
    filt3 = [
     0.013158
    -0.015591
    -0.034564
     0.018044
    0.0080384
     0.048938
      0.10829
     -0.18719
     -0.25071
       0.2891
       0.2891
     -0.25071
     -0.18719
      0.10829
     0.048938
    0.0080384
     0.018044
    -0.034564
    -0.015591
     0.013158];
     
    filt4 = [
    -0.038718
  -4.2476e-06
     -0.10237
  -1.6168e-05
   -0.0014099
  -2.6903e-05
      0.31052
  -3.1884e-05
      0.50141
  -3.1884e-05
      0.31052
  -2.6903e-05
   -0.0014099
  -1.6168e-05
     -0.10237
  -4.2476e-06
    -0.038718];

    warnsave = warning;
    warning off   % turn off in case log of 0 shows up
         
    % LOWPASS
    subplot(2,2,1)
    h1=plot([0 .4 NaN 0 .4 NaN .6 1],[2 2 NaN -2 -2 NaN -40 -40]);
    set(h1,'color',co(2,:),'linewidth',2)
    
    set(gca,'xtick',[0 .4 .6 1],'xticklabel',{'0','Fp','Fs','Fsamp/2'})
    set(gca,'ytick',[-40 -2 2],'yticklabel',{'-Rs','',''})
    t1=text(0,0,'Rp \{ ');
    set(t1,'horizontalalignment','right','clipping','off')
    title('Lowpass')
    grid on
    [H,f]=freqz(filt1,1,300);
    hold on, plot(f/pi,20*log10(abs(H))); hold off
    set(gca,'ylim',[-60 10],'xlim',[0 1])
    
    % HIGHPASS
    subplot(2,2,2)
    h1=plot([.6 1 NaN .6 1 NaN 0 .4],[2 2 NaN -2 -2 NaN -40 -40]);
    set(h1,'color',co(2,:),'linewidth',2)
    
	 set(gca,'xtick',[0 .4 .6 1],'xticklabel',{'0','Fs','Fp','Fsamp/2'})
    set(gca,'ytick',[-40 -2 2],'yticklabel',{'-Rs','',''})
    t1=text(0,0,'Rp \{ ');
    set(t1,'horizontalalignment','right','clipping','off')
    title('Highpass')
    grid on
    [H,f]=freqz(filt2,1,300);
    hold on, plot(f/pi,20*log10(abs(H))); hold off
    set(gca,'ylim',[-60 10],'xlim',[0 1])
    
    % BANDPASS
    subplot(2,2,3)
    h1=plot([0 .2 NaN .35 .65 NaN .35 .65 NaN .8 1],[-40 -40 NaN 2 2 NaN -2 -2 NaN -40 -40]);
    set(h1,'color',co(2,:),'linewidth',2)
    
    set(gca,'xtick',[0 .2 .35 .65 .8 1],...
        'xticklabel',{'0','Fs1','Fp1','Fp2','Fs2','Fsamp/2'})
    set(gca,'ytick',[-40 -2 2],'yticklabel',{'-Rs','',''})
    t1=text(0,0,'Rp \{ ');
    set(t1,'horizontalalignment','right','clipping','off')
    title('Bandpass')
    grid on
    [H,f]=freqz(filt3,1,300);
    hold on, plot(f/pi,20*log10(abs(H))); hold off
    set(gca,'ylim',[-60 10],'xlim',[0 1])
    
    % BANDSTOP
    subplot(2,2,4)
    h1=plot([0 .2 NaN 0 .2 NaN .35 .65 NaN .8 1 NaN .8 1],...
         [2 2 NaN -2 -2 NaN -40 -40 NaN 2 2 NaN -2 -2]);
    set(h1,'color',co(2,:),'linewidth',2)
    
    set(gca,'xtick',[0 .2 .35 .65 .8 1],...
        'xticklabel',{'0','Fp1','Fs1','Fs2','Fp2','Fsamp/2'})
    set(gca,'ytick',[-40 -2 2],'yticklabel',{'-Rs','',''})
    t1=text(0,0,'Rp \{ ');
    set(t1,'horizontalalignment','right','clipping','off')
    title('Bandstop')
    grid on
    [H,f]=freqz(filt4,1,300);
    hold on, plot(f/pi,20*log10(abs(H))); hold off    
    set(gca,'ylim',[-60 10],'xlim',[0 1])
    
    warning(warnsave)
    
    

⌨️ 快捷键说明

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