www.gusucode.com > dsp 案例源码程序 matlab代码 > dsp/DesigningFilterswithNonEquirippleStopbandExample.m

    %% Designing Filters with Non-Equiripple Stopband  
% This example shows how to design lowpass filters with stopbands that are
% not equiripple.   

%% Optimal Non-Equiripple Lowpass Filters 
% To start, set up the filter parameters and use |fdesign| to create a constructor
% for designing the filter. 
  N = 100;
  Fp = 0.38;
  Fst = 0.42;
  Hf = fdesign.lowpass('N,Fp,Fst',N,Fp,Fst);  

%% 
% Equiripple designs achieve optimality by distributing the deviation from
% the ideal response uniformly. This has the advantage of minimizing the
% maximum deviation (ripple). However, the overall deviation, measured in
% terms of its energy tends to be large. This may not always be desirable.
% When low pass filtering a signal, this implies that remnant energy of
% the signal in the stopband may be relatively large. When this is a concern,
% least-squares methods provide optimal designs that minimize the energy
% in the stopband. 
  Hd1 = design(Hf,'equiripple','systemobject',true);
  Hd2 = design(Hf,'firls','systemobject',true);
  hfvt = fvtool(Hd1,Hd2,'Color','White');
  legend(hfvt,'Equiripple design','Least-squares design')   

%%
% Notice how the attenuation in the stopband increases with frequency for
% the least-squares designs while it remains constant for the equiripple
% design. The increased attenuation in the least-squares case minimizes
% the energy in that band of the signal to be filtered.  

%% Equiripple Designs with Increasing Stopband Attenuation 
% An often undesirable effect of least-squares designs is that the ripple
% in the passband region close to the passband edge tends to be large. For
% low pass filters in general, it is desirable that passband frequencies
% of a signal to be filtered are affected as little as possible. To this
% extent, an equiripple passband is generally preferable. If it is still
% desirable to have an increasing attenuation in the stopband, we can use
% design options for equiripple designs to achieve this. 
  Hd3 = design(Hf,'equiripple','StopbandShape','1/f',...
              'StopbandDecay',4,'systemobject',true);
  hfvt2 = fvtool(Hd2,Hd3,'Color','White');
  legend(hfvt2,'Least-squares design',...
        'Equiripple design with stopband decaying as (1/f)^4')    

%% 
% Notice that the stopbands are quite similar. However the equiripple design
% has a significantly smaller passband ripple, 
  mls = measure(Hd2);
  meq = measure(Hd3);
  mls.Apass
  meq.Apass 

%% 
% Filters with a stopband that decays as (1/f)^M will decay at 6M dB per
% octave. Another way of shaping the stopband is using a linear decay. For
% example given an approximate attenuation of 38 dB at 0.4*pi, if an attenuation
% of 70 dB is desired at pi, and a linear decay is to be used, the slope
% of the line is given by (70-38)/(1-0.4) = 53.333. Such a design can be
% achieved from: 
  Hd4 = design(Hf,'equiripple','StopbandShape','linear',...
              'StopbandDecay',53.333,'systemobject',true);
  hfvt3 = fvtool(Hd3,Hd4,'Color','White');
  legend(hfvt3,'Equiripple design with stopband decaying as (1/f)^4',...
      'Equiripple design with stopband decaying linearly and a slope of 53.333')    

%% 
% Yet another possibility is to use an arbitrary magnitude specification
% and select two bands (one for the passband and one for the stopband).
% Then, by using weights for the second band, it is possible to increase
% the attenuation throughout the band. 
  N = 100;
  B = 2;  % number of bands
  F = [0 .38 .42:.02:1];
  A = [1 1 zeros(1,length(F)-2)];
  W = linspace(1,100,length(F)-2);
  Harb = fdesign.arbmag('N,B,F,A',N,B,F(1:2),A(1:2),F(3:end),...
                        A(3:end));
  Ha = design(Harb,'equiripple','B2Weights',W,...
             'systemobject',true);
  fvtool(Ha,'Color','White')