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

    %% Lowpass FIR Filter Design  
% This example shows how to design a lowpass FIR filter using |fdesign|.
% An ideal lowpass filter requires an infinite impulse response. Truncating
% or windowing the impulse response results in the so-called window method
% of FIR filter design.   

%% A Lowpass FIR Filter Design Using Various Windows 
% FIR filters are widely used due to the powerful design algorithms that
% exist for them, their inherent stability when implemented in non-recursive
% form, the ease with which one can attain linear phase, their simple extensibility
% to multirate cases, and the ample hardware support that exists for them
% among other reasons. This example showcases functionality in the DSP System
% Toolbox™ for the design of low pass FIR filters with a variety of characteristics.
% Many of the concepts presented here can be extended to other responses
% such as highpass, bandpass, etc. 
%
% Consider a simple design of a lowpass filter with a cutoff frequency of
% 0.4*pi radians per sample: 
Fc = 0.4;
N = 100;
Hf = fdesign.lowpass('N,Fc',N,Fc);  

%% 
% We can design this lowpass filter using the window method. For example,
% we can use a Hamming window or a Dolph-Chebyshev window: 
Hd1 = design(Hf,'window','window',@hamming,'systemobject',true);
Hd2 = design(Hf,'window','window',{@chebwin,50}, ...
            'systemobject',true);
hfvt = fvtool(Hd1,Hd2,'Color','White');
legend(hfvt,'Hamming window design', ...
       'Dolph-Chebyshev window design')    

%% 
% The choice of filter was arbitrary. Since ideally the order should be
% infinite, in general, a larger order results in a better approximation
% to ideal at the expense of a more costly implementation. For instance,
% with a Dolph-Chebyshev window, we can decrease the transition region by
% increasing the filter order: 
Hf.FilterOrder = 200;
Hd3 = design(Hf,'window','window',{@chebwin,50},...
            'systemobject',true);
hfvt2 = fvtool(Hd2,Hd3,'Color','White');
legend(hfvt2,'Dolph-Chebyshev window design. Order = 100',...
    'Dolph-Chebyshev window design. Order = 200')    

%% Minimum Order Lowpass Filter Design 
% In order to determine a suitable filter order, it is necessary to specify
% the amount of passband ripple and stopband attenuation that will be tolerated.
% It is also necessary to specify the width of the transition region around
% the ideal cutoff frequency. The latter is done by setting the passband
% edge frequency and the stopband edge frequency. The difference between
% the two determines the transition width. 
Fp = 0.38;
Fst = 0.42;
Ap = 0.06;
Ast = 60;
setspecs(Hf,'Fp,Fst,Ap,Ast',Fp,Fst,Ap,Ast);  

%% 
% We can still use the window method, along with a Kaiser window, to design
% the low pass filter. 
Hd4 = design(Hf,'kaiserwin','systemobject',true);
measure(Hd4)  

%%  
% 
%  
%  ans =
%   
%  Sampling Frequency : N/A (normalized frequency)
%  Passband Edge      : 0.38                      
%  3-dB Point         : 0.39539                   
%  6-dB Point         : 0.4                       
%  Stopband Edge      : 0.42                      
%  Passband Ripple    : 0.016058 dB               
%  Stopband Atten.    : 60.092 dB                 
%  Transition Width   : 0.04      

%% 
% One thing to note is that the transition width as specified is centered
% around the cutoff frequency of 0.4 pi. This will become the point at which
% the gain of the lowpass filter is half the passband gain (or the point
% at which the filter reaches 6 dB of attenuation).  

%% Optimal Minimum Order Designs 
% The Kaiser window design is not an optimal design and as a result the
% filter order required to meet the specifications using this method is
% larger than it needs to be. Equiripple designs result in the lowpass filter
% with the smallest possible order to meet a set of specifications. 
Hd5 = design(Hf,'equiripple','systemobject',true);
hfvt3 = fvtool(Hd4,Hd5,'Color','White');
legend(hfvt3,'Kaiser window design','Equiripple design')   

%%
% In this case, 146 coefficients are needed by the equiripple design while
% 183 are needed by the Kaiser window design.