www.gusucode.com > dsp 案例源码程序 matlab代码 > dsp/LowpassFilterDesignExample.m
%% Lowpass Filter Design in MATLAB % This example shows how to design lowpass filters. The example highlights % some of the most commonly used command-line tools in the DSP System % Toolbox. Alternatively, you can use the Filter Builder app to implement % all the designs presented here. For more design options, see % <../examples/designing-low-pass-fir-filters.html Designing Low Pass FIR % Filters>. %% Introduction % When designing a lowpass filter, the first choice you make is whether to % design an FIR or IIR filter. You generally choose FIR filters when a % linear phase response is important. FIR filters also tend to be preferred % for fixed-point implementations because they are typically more robust to % quantization effects. FIR filters are also used in many high-speed % implementations such as FPGAs or ASICs because they are suitable for % pipelining. IIR filters (in particular biquad filters) are used in % applications (such as audio signal processing) where phase linearity is % not a concern. IIR filters are generally computationally more efficient % in the sense that they can meet the design specifications with fewer % coefficients than FIR filters. IIR filters also tend to have a shorter % transient response and a smaller group delay. However, the use of % minimum-phase and multirate designs can result in FIR filters comparable % to IIR filters in terms of group delay and computational efficiency. %% FIR Lowpass Designs - Specifying the Filter Order % There are many practical situations in which you must specify the filter % order. One such case is if you are targeting hardware which has % constrained the filter order to a specific number. Another common % scenario is when you have computed the available computational budget % (MIPS) for your implementation and this affords you a limited filter % order. FIR design functions in the Signal Processing Toolbox (including % |fir1|, |firpm|, and |firls|) are all capable of designing lowpass % filters with a specified order. In the DSP System Toolbox, the preferred % function for lowpass FIR filter design with a specified order is % <../ref/firceqrip.html firceqrip>. This function designs optimal % equiripple lowpass/highpass FIR filters with specified passband/stopband % ripple values and with a specified passband-edge frequency. The % stopband-edge frequency is determined as a result of the design. %% % Design a lowpass FIR filter for data sampled at 48 kHz. The passband-edge % frequency is 8 kHz. The passband ripple is 0.01 dB and the stopband % attenuation is 80 dB. Constrain the filter order to 120. N = 120; Fs = 48e3; Fp = 8e3; Ap = 0.01; Ast = 80; %% % Obtain the maximum deviation for the passband and stopband ripples in % linear units. Rp = (10^(Ap/20) - 1)/(10^(Ap/20) + 1); Rst = 10^(-Ast/20); %% % Design the filter using |firceqrip| and view the magnitude frequency % response. NUM = firceqrip(N,Fp/(Fs/2),[Rp Rst],'passedge'); fvtool(NUM,'Fs',Fs) %% % The resulting stopband-edge frequency is about 9.64 kHz. %% Minimum-Order Designs % Another design function for optimal equiripple filters is |firgr|. % |firgr| can design a filter that meets passband/stopband ripple % constraints as well as a specified transition width with the smallest % possible filter order. For example, if the stopband-edge frequency is % specified as 10 kHz, the resulting filter has an order of 100 rather than % the 120th-order filter designed with |firceqrip|. The smaller filter % order results from the larger transition band. %% % Specify the stopband-edge frequency of 10 kHz. Obtain a minimum-order % FIR filter with a passband ripple of 0.01 dB and 80 dB of stopband % attenuation. Fst = 10e3; NumMin = firgr('minorder',[0 Fp/(Fs/2) Fst/(Fs/2) 1], [1 1 0 0],[Rp,Rst]); %% % Plot the magnitude frequency responses for the minimum-order FIR filter % obtained with |firgr| and the 120th-order filter designed with % |firceqrip|. The minimum-order design results in a filter with order 100. % The transition region of the 120th-order filter is, as expected, narrower % than that of the filter with order 100. hvft = fvtool(NUM,1,NumMin,1,'Fs',Fs); legend(hvft,'N = 120','N = 100') %% Filtering Data % To apply the filter to data, you can use the |filter| command or you can % use |dsp.FIRFilter|. |dsp.FIRFilter| has the advantage of managing state % when executed in a loop. |dsp.FIRFilter| also has fixed-point % capabilities and supports C code generation, HDL code generation, and % optimized code generation for ARM(R) Cortex(R) M and ARM Cortex A. %% % Filter 10 seconds of white noise with zero mean and unit standard % deviation in frames of 256 samples with the 120th-order FIR lowpass % filter. View the result on a spectrum analyzer. LP_FIR = dsp.FIRFilter('Numerator',NUM); SA = dsp.SpectrumAnalyzer('SampleRate',Fs,'SpectralAverages',5); tic while toc < 10 x = randn(256,1); y = LP_FIR(x); step(SA,y); end %% Using |dsp.LowpassFilter| % |dsp.LowpassFilter| is an alternative to using |firceqrip| and |firgr| in % conjuction with |dsp.FIRFilter|. Basically, |dsp.LowpassFilter| condenses % the two step process into one. |dsp.LowpassFilter| provides the same % advantages that |dsp.FIRFilter| provides in terms of fixed-point support, % C code generation support, HDL code generation support, and ARM Cortex % code generation support. %% % Design a lowpass FIR filter for data sampled at 48 % kHz. The passband-edge frequency is 8 kHz. The passband ripple is 0.01 dB % and the stopband attenuation is 80 dB. Constrain the filter order to 120. % Create a |dsp.FIRFilter| based on your specifications. LP_FIR = dsp.LowpassFilter('SampleRate',Fs,... 'DesignForMinimumOrder',false,'FilterOrder',N,... 'PassbandFrequency',Fp,'PassbandRipple',Ap,'StopbandAttenuation',Ast); %% % The coefficients in |LP_FIR| are identical to the coefficients % in |NUM|. NUM_LP = tf(LP_FIR); %% % You can use |LP_FIR| to filter data directly, as shown in the % preceding example. You can also analyze the filter using FVTool or % measure the response using |measure|. fvtool(LP_FIR,'Fs',Fs); measure(LP_FIR) %% Minimum-Order Designs with dsp.LowpassFilter % You can use |dsp.LowpassFilter| to design minimum-order filters and use % |measure| to verify that the design meets the prescribed specifications. % The order of the filter is again 100. LP_FIR_minOrd = dsp.LowpassFilter('SampleRate',Fs,... 'DesignForMinimumOrder',true,'PassbandFrequency',Fp,... 'StopbandFrequency',Fst,'PassbandRipple',Ap,'StopbandAttenuation',Ast); measure(LP_FIR_minOrd) Nlp = order(LP_FIR_minOrd) %% Designing IIR Filters % Elliptic filters are the IIR counterpart to optimal equiripple FIR % filters. Accordingly, you can use the same specifications to design % elliptic filters. The filter order you obtain for an IIR filter is much % smaller than the order of the corresponding FIR filter. %% % Design an elliptic filter with the same sampling frequency, cutoff % frequency, passband-ripple constraint, and stopband attenuation as the % 120th-order FIR filter. Reduce the filter order for the elliptic filter % to 10. N = 10; LP_IIR = dsp.LowpassFilter('SampleRate',Fs,'FilterType','IIR',... 'DesignForMinimumOrder',false,'FilterOrder',N,... 'PassbandFrequency',Fp,'PassbandRipple',Ap,'StopbandAttenuation',Ast); %% % Compare the FIR and IIR designs. Compute the cost of the two % implementations. hfvt = fvtool(LP_FIR,LP_IIR,'Fs',Fs); legend(hfvt,'FIR Equiripple, N = 120', 'IIR Elliptic, N = 10'); cost_FIR = cost(LP_FIR) cost_IIR = cost(LP_IIR) %% % The FIR and IIR filters have similar magnitude responses. The cost of the % IIR filter is about 1/6 the cost of the FIR filter. %% Running the IIR Filters % The IIR filter is designed as a biquad filter. To apply the filter to % data, use the same commands as in the FIR case. %% % Filter 10 seconds of white Gaussian noise with zero mean and unit % standard deviation in frames of 256 samples with the 10th-order IIR % lowpass filter. View the result on a spectrum analyzer. SA = dsp.SpectrumAnalyzer('SampleRate',Fs,'SpectralAverages',5); tic while toc < 10 x = randn(256,1); y = LP_IIR(x); SA(y); end %% Variable Bandwidth FIR and IIR Filters % You can also design filters that allow you to change the cutoff frequency % at run-time. |dsp.VariableBandwidthFIRFilter| and % |dsp.VariableBandwidthIIRFilter| can be used for such cases.