• No results found

FILTER DESIGN AND APPLICATION USING THE MATLAB SIGNAL PROCESSING TOOLBOX

Digital Filters

FILTER DESIGN AND APPLICATION USING THE MATLAB SIGNAL PROCESSING TOOLBOX

FIR Filters

The MATLAB Signal Processing Toolbox includes routines that can be used to apply both FIR and IIR filters. While they are not necessary for either the design or application of FIR filters, they do ease the design of both filter types, particu-larly for filters with complex frequency characteristics or demanding attenuation requirements. Within the MATLAB environment, filter design and application occur in either two or three stages, each stage executed by separate, but related routines. In the three-stage protocol, the user supplies information regarding the filter type and desired attenuation characteristics, but not the filter order. The first-stage routines determine the appropriate order as well as other parameters required by the second-stage routines. The second stage routines generate the filter coefficients, b(n), based the arguments produced by the first-stage routines including the filter order. A two-stage design process would start with this stage, in which case the user would supply the necessary input arguments including the filter order. Alternatively, more recent versions of MATLAB’s Signal Pro-cessing Toolbox provide an interactive filter design package called FDATool (for filter design and analysis tool) which performs the same operations de-scribed below, but utilizing a user-friendly graphical user interface (GUI). An-other Signal Processing Toolbox package, the SPTool (signal processing tool) is useful for analyzing filters and generating spectra of both signals and filters.

New MATLAB releases contain detailed information of the use of these two packages.

The final stage is the same for all filters including IIR filters: a routine that takes the filter coefficients generated by the previous stage and applies them to the data. In FIR filters, the final stage could be implemented using convolu-tion as was done in previous examples, or the MATLAB filter routine de-scribed earlier, or alternatively the MATLAB Signal Processing Toolbox routine filtfiltcan be used for improved phase properties.

One useful Signal Processing Toolbox routine determines the frequency response of a filter given the coefficients. Of course, this can be done using the FFT as shown in Examples 4.2 and 4.3, and this is the approach used by the MATLAB routine. However the MATLAB routine freqz, also includes fre-quency scaling and plotting, making it quite convenient. The freqz routine

TLFeBOOK

Digital Filters 109

plots, or produces, both the magnitude and the phase characteristics of a filter’s frequency response:

[h,w] = freqz (b,a,n,fs);

where againbandaare the filter coefficients andnis the number of points in the desired frequency spectra. Setting n as a power of 2 is recommended to speed computation (the default is 512). The input argument,fs, is optional and specifies the sampling frequency. Both output arguments are also optional: if freqz is called without the output arguments, the magnitude and phase plots are produced. If specified, the output vectorhis the n-point complex frequency response of the filter. The magnitude would be equal toabs(h)while the phase would be equal to angle(h). The second output argument, w, is a vector the same length as h containing the frequencies of h and is useful in plotting. Iffs is given,wis in Hz and ranges between 0 and fs/2; otherwisewis in rad/sample and ranges between 0 andπ.

Two-Stage FIR Filter Design

Two-stage filter design requires that the designer known the filter order, i.e., the number of coefficients in b(n), but otherwise the design procedure is straightforward. The MATLAB Signal Processing Toolbox has two filter design routines based on the rectangular filters described above, i.e., Eqs. (10)–(13).

Although implementation of these equations using standard MATLAB code is straightforward (as demonstrated in previous examples), the FIR design routines replace many lines of MATLAB code with a single routine and are seductively appealing. While both routines are based on the same approach, one allows greater flexibility in the specification of the desired frequency curve. The basic rectangular filter is implemented with the routinefir1as:

b = fir1(n,wn,’ftype’ window);

where n is the filter order,wn the cutoff frequency, ftype the filter type, and window specifies the window function (i.e., Blackman, Hamming, triangular, etc.). The output,b, is a vector containing the filter coefficients. The last two input arguments are optional. The input argument ftypecan be either‘high’

for a highpass filter, or‘stop’for a stopband filter. If not specified, a lowpass or bandpass filter is assumed depending on the length of wn. The argument, window, is used as it is in thepwelchroutine: the function name includes argu-ments specifying window length (see Example 4.3 below) or other arguargu-ments.

The window length should equalnⴙ1. For bandpass and bandstop filters,nmust be even and is incremented if not, in which case the window length should be suitably adjusted. Note that MATLAB’s popular default window, the Hamming

TLFeBOOK

window, is used if this argument is not specified. The cutoff frequency is either a scalar specifying the lowpass or highpass cutoff frequency, or a two-element vector that specifies the cutoff frequencies of a bandpass or bandstop filter. The cutoff frequency(s) ranges between 0 and 1 normalized to fs/2 (e.g., if,wn= 0.5, then fc= 0.5 * fs/2). Other options are described in the MATLAB Help file on this routine.

A related filter design algorithm,fir2, is used to design rectangular filters when a more general, or arbitrary frequency response curve is desired. The command structure forfir2is;

b = fir2(n,f,A,window)

where nis the filter order,fis a vector of normalized frequencies in ascending order, and Ais the desired gain of the filter at the corresponding frequency in vector f. (In other words, plot(f,A) would show the desired magnitude fre-quency curve.) ClearlyfandAmust be the same length, but duplicate frequency points are allowed, corresponding to step changes in the frequency response.

Again, frequency ranges between 0 and 1, normalized to fs/2. The argument window is the same as in fir1, and the output,b, is the coefficient function.

Again, other optional input arguments are mentioned in the MATLAB Help file on this routine.

Several other more specialized FIR filters are available that have a two-stage design protocol. In addition, there is a three-two-stage FIR filter described in the next section.

Example 4.4 Design a window-based FIR bandpass filter having the fre-quency characteristics of the filter developed in Example 4.3 and shown in Figure 4.12.

% Example 4.4 and Figure 4.12 Design a window-based bandpass

% filter with cutoff frequencies of 5 and 15 Hz.

% Assume a sampling frequency of 100 Hz.

% Filter order = 128

%

clear all; close all;

fs = 100; % Sampling frequency

order = 128; % Filter order

wn = [5*fs/2 15*fs/2]; % Specify cutoff

% frequencies

b = fir1(order,wn); % On line filter design,

% Hamming window [h,freq] = freqz(b,1,512,100); % Get frequency response plot(freq,abs(h),’k’); % Plot frequency response

xlabel(’Frequency (Hz)’); ylabel(’H(f)’);

TLFeBOOK

Digital Filters 111

FIGURE4.12 The frequency response of an FIR filter based in the rectangular filter design described in Eq. (10). The cutoff frequencies are 5 and 15 Hz. The frequency response of this filter is identical to that of the filter developed in Exam-ple 4.5 and presented in Figure 4.10. However, the development of this filter required only one line of code.

Three-Stage FIR Filter Design

The first stage in the three-stage design protocol is used to determine the filter order and cutoff frequencies to best approximate a desired frequency response curve. Inputs to these routines specify an ideal frequency response, usually as a piecewise approximation and a maximum deviation from this ideal response.

The design routine generates an output that includes the number of stages re-quired, cutoff frequencies, and other information required by the second stage.

In the three-stage design process, the first- and second-stage routines work to-gether so that the output of the first stage can be directly passed to the input of the second-stage routine. The second-stage routine generates the filter coeffi-cient function based on the input arguments which include the filter order, the cutoff frequencies, the filter type (generally optional), and possibly other argu-ments. In cases where the filter order and cutoff frequencies are known, the

TLFeBOOK

first stage can be bypassed and arguments assigned directly to the second-stage routines. This design process will be illustrated using the routines that imple-ment Parks–McClellan optimal FIR filter.

The first design stage, the determination of filter order and cutoff frequen-cies uses the MATLAB routineremezord. (First-stage routines end in the letters ordwhich presumably stands for filter order). The calling structure is

[n, fo, ao, w] = remezord (f,a,dev,Fs);

The input arguments,f,aanddevspecify the desired frequency response curve in a somewhat roundabout manner. Fsis the sampling frequency and is optional (the default is 2 Hz so that fs/2= 1 Hz). Vector fspecifies frequency ranges between 0 and fs/2 as a pair of frequencies whileaspecifies the desired gains within each of these ranges. Accordingly,fhas a length of2n—2, where nis the length ofa. Thedevvector specifies the maximum allowable deviation, or ripple, within each of these ranges and is the same length asa. For example, assume you desire a bandstop filter that has a passband between 0 and 100 with a ripple of 0.01, a stopband between 300 and 400 Hz with a gain of 0.1, and an upper passband between 500 and 1000 Hz (assuming fs/2= 1000) with the same ripple as the lower passband. The f, a, and dev vectors would be: f = [100 300 400 500]; a = [1 0 1]; and dev = [.01 .1 .01]. Note that the ideal stopband gain is given as zero by vector awhile the actual gain is specified by the allowable deviation given in vector dev. Vectordev requires the deviation or ripple to be specified in linear units not in db. The application of this design routine is shown in Example 4.5 below.

The output arguments include the required filter order,n, the normalized frequency ranges,fo, the frequency amplitudes for those ranges,a0, and a set of weights, w, that tell the second stage how to assess the accuracy of the fit in each of the frequency ranges. These four outputs become the input to the second stage filter design routineremez. The calling structure to the routine is:

b = remez (n, f, a, w,’ftype’);

where the first four arguments are supplied by remezord although the input argument w is optional. The fifth argument, also optional, specifies either a hilbertlinear-phase filter (most common, and the default) or a differentia-torwhich weights the lower frequencies more heavily so they will be the most accurately constructed. The output is the FIR coefficients,b.

If the desired filter order is known, it is possible to bypass remezord and input the arguments n,f, and adirectly. The input argument,n, is simply the filter order. Input vectors fandaspecify the desired frequency response curve in a somewhat different manner than described above. The frequency vector still contains monotonically increasing frequencies normalized to fs/2; i.e., ranging

TLFeBOOK

Digital Filters 113

between 0 and 1 where 1 corresponds to fs/2. The a vector represents desired filter gain at each end of a frequency pair, and the gain between pairs is an unspecified transition region. To take the example above: a bandstop filter that has a passband (gain= 1) between 0 and 100, a stopband between 300 and 400 Hz with a gain of 0.1, and an upper passband between 500 and 700 Hz; assum-ing fs/2= 1 kHz, thefand a vector would be: f = [0 .1 .3 .4 .5 .7]; a = [1 1 .1 .1 1 1]. Note that the desired frequency curve is unspecified between 0.1 and 0.3 and also between 0.4 and 0.5.

As another example, assume you wanted a filter that would differentiate a signal up to 0.2fs/2 Hz, then lowpass filter the signal above 0.3fs/2 Hz. Thef andavector would be:f = [0 .1 .3 1];a = [0 1 0 0].

Another filter that uses the same input structure asremezordis the least square linear-phase filter design routine firls. The use of this filter in for calculation the derivative is found in the Problems.

The following example shows the design of a bandstop filter using the Parks–McClellan filter in a three-stage process. This example is followed by the design of a differentiator Parks–McClellan filter, but a two-stage design protocol is used.

Example 4.5 Design a bandstop filter having the following characteris-tics: a passband gain of 1 (0 db) between 0 and 100, a stopband gain of−40 db between 300 and 400 Hz, and an upper passband gain of 1 between 500 and 1000 Hz. Maximum ripple for the passband should be ±1.5 db. Assume fs= 2 kHz. Use the three-stage design process. In this example, specifying the dev argument is a little more complicated because the requested deviations are given in db whileremezordexpects linear values.

% Example 4.5 and Figure 4.13

% Bandstop filter with a passband gain of 1 between 0 and 100,

% a stopband gain of -40 db between 300 and 400 Hz,

% and an upper passband gain of 1 between 500 and fs/2 Hz (1000

% Hz).

% Maximum ripple for the passband should be±1.5 db

%

rp_pass = 3; % Specify ripple

% tolerance in passband

rp_stop = 40; % Specify error

% tolerance in passband

fs = 2000; % Sample frequency: 2

% kHz

f = [100 300 400 500]; % Define frequency

% ranges

a= [1 0 1]; % Specify gain in

% those regions

%

TLFeBOOK

FIGURE4.13 The magnitude and phase frequency response of a Parks–McClel-lan bandstop filter produced in Example 4.5. The number of filter coefficients as determined byremezordwas 24.

% Now specify the deviation converting from db to linear dev = [(10v(rp_pass/20)-1)/(10v(rp_pass/20)ⴙ1) 10v

(-rp_stop/20)....(10v(rp_pass/20)-1)/(10v(rp_pass/

20)ⴙ1)];

%

% Design filter - determine filter order

[n, fo, ao, w] = remezord(f,a,dev,fs) % Determine filter

% order, Stage 1 b = remez(n, fo, ao, w); % Determine filter

% weights, Stage 2 freq.(b,1,[ ],fs); % Plot filter

fre-% quency response In Example 4.5 the vector assignment for the a vector is straightforward:

the desired gain is given as 1 in the passband and 0 in the stopband. The actual stopband attenuation is given by the vector that specifies the maximum desirable

TLFeBOOK

Digital Filters 115

error, thedevvector. The specification of this vector, is complicated by the fact that it must be given in linear units while the ripple and stopband gain are specified in db. The db to linear conversion is included in thedevassignment.

Note the complicated way in which the passband gain must be assigned.

Figure 4.13 shows the plot produced byfreqzwith no output arguments, a= 1,n= 512 (the default), andbwas the FIR coefficient function produced in Example 4.6 above. The phase plot demonstrates the linear phase characteristics of this FIR filter in the passband. This will be compared with the phase charac-teristics of IIR filter in the next section.

The frequency response curves for Figure 4.13 were generated using the MATLAB routinefreqz, which applies the FFT to the filter coefficients follow-ing Eq. (7). It is also possible to generate these curves by passfollow-ing white noise through the filter and computing the spectral characteristics of the output. A comparison of this technique with the direct method used above is found in Problem 1.

Example 4.6 Design a differentiator using the MATLAB FIR filter re-mez. Use a two-stage design process (i.e., select a 28-order filter and bypass the first stage design routine remezord). Compare the derivative produced by this signal with that produced by the two-point central difference algorithm. Plot the results in Figure 4.14.

The FIR derivative operator will be designed by requesting a linearly in-creasing frequency characteristic (slope= 1) up to some fcHz, then a sharp drop off within the next 0.1fs/2 Hz. Note that to make the initial magnitude slope equal to 1, the magnitude value atfcshould be: fc* fs* π.

% Example 4.6 and Figure 4.14

% Design a FIR derivative filter and compare it to the

% Two point central difference algorithm

%

close all; clear all;

load sig1; % Get data

Ts = 1/200; % Assume a Ts of 5 msec.

fs = 1/Ts; % Sampling frequency

order = 28; % FIR Filter order

L = 4; % Use skip factor of 4

fc = .05 % Derivative cutoff

% frequency

FIGURE4.14 Derivative produced by an FIR filter (left) and the two-point central difference differentiator (right). Note that the FIR filter does produce a cleaner derivative without reducing the value of the peak velocity. The FIR filter order (n= 28) and deriviative cutoff frequency (fc= .05 fs/2) were chosen empirically to produce a clean derivative with a maximal velocity peak. As in Figure 4.5 the velocity (i.e., derivative) was scaled by1/2to be more compatible with response amplitude.

a = [0 (fc*fs*pi) 0 0]; % Upward slope until .05 fs

% then lowpass

b = remez(order,f,a, % Design filter

coeffi-’differentiator’); % cients and

d_dt1 = filter(b,1,data); % apply FIR Differentiator figure;

subplot(1,2,1);

hold on;

plot(t,data(1:400)ⴙ12,’k’); % Plot FIR filter

deriva-% tive (data offset) plot(t,d_dt1(1:400)/2,’k’); % Scale velocity by 1/2 ylabel(’Time(sec)’);

ylabel(’x(t) & v(t)/2’);

TLFeBOOK

Digital Filters 117

%

%

% Now apply two-point central difference algorithm hn = zeros((2*L)ⴙ1,1); % Set up h(n) hn(1,1) = 1/(2*L* Ts);

hn((2*L)ⴙ1,1) = -1/(2*L*Ts); % Note filter weight

% reversed if d_dt2 = conv(data,hn); % using convolution

%

subplot(1,2,2);

hold on;

plot(data(1:400)ⴙ12,’k’); % Plot the two-point

cen-% tral difference plot(d_dt2(1:400)/2,’k’); % algorithm derivative ylabel(’Time(sec)’);

ylabel(’x(t) & v(t)/2’);

IIR Filters

IIR filter design under MATLAB follows the same procedures as FIR filter design; only the names of the routines are different. In the MATLAB Signal Processing Toolbox, the three-stage design process is supported for most of the IIR filter types; however, as with FIR design, the first stage can be bypassed if the desired filter order is known.

The third stage, the application of the filter to the data, can be imple-mented using the standardfilterroutine as was done with FIR filters. A Signal Processing Toolbox routine can also be used to implement IIR filters given the filter coefficients:

y = filtfilt(b,a,x)

The arguments for filtfiltare identical to those in filter. The only difference is that filtfilt improves the phase performance of IIR filters by running the algorithm in both forward and reverse directions. The result is a filtered sequence that has zero-phase distortion and a filter order that is doubled.

The downsides of this approach are that initial transients may be larger and the approach is inappropriate for many FIR filters that depend on phase response for proper operations. A comparison between the filterandfiltfilt algo-rithms is made in the example below.

As with our discussion of FIR filters, the two-stage filter processes will be introduced first, followed by three-stage filters. Again, all filters can be im-plemented using a two-stage process if the filter order is known. This chapter concludes with examples of IIR filter application.

TLFeBOOK

Two-Stage IIR Filter Design

The Yule–Walker recursive filter is the only IIR filter that is not supported by an order-selection routine (i.e., a three-stage design process). The design routine yulewalk allows for the specification of a general desired frequency response curve, and the calling structure is given on the next page.

[b,a] = yulewalk(n,f,m)

wherenis the filter order, andmandfspecify the desired frequency characteris-tic in a fairly straightforward way. Specifically,mis a vector of the desired filter gains at the frequencies specified inf. The frequencies infare relative to fs/2:

the first point infmust be zero and the last point 1. Duplicate frequency points are allowed and correspond to steps in the frequency response. Note that this is the same strategy for specifying the desired frequency response that was used by the FIR routinesfir2andfirls (see Help file).

Example 4.7 Design an 12th-order Yule–Walker bandpass filter with cutoff frequencies of 0.25 and 0.5. Plot the frequency response of this filter and compare with that produced by the FIR filterfir2of the same order.

% Example 4.7 and Figure 4.15

% Design a 12th-order Yulewalk filter and compare

% its frequency response with a window filter of the same

% order

[b,a] = yulewalk(n,f,m); % Construct Yule–Walker IIR Filter h = freqz(b,a,256);

b1 = fir2(n,f,m); % Construct FIR rectangular window

% filter h1 = freqz(b1,1,256);

plot(f,m,’k’); % Plot the ideal “window” freq.

% response hold on

w = (1:256)/256;

plot(w,abs(h),’--k’); % Plot the Yule-Walker filter plot(w,abs(h1),’:k’); % Plot the FIR filter

xlabel(’Relative Frequency’);

TLFeBOOK

Digital Filters 119

FIGURE4.15 Comparison of the frequency response of 12th-order FIR and IIR filters. Solid line shows frequency characteristics of an ideal bandpass filter.

Three-Stage IIR Filter Design: Analog Style Filters

All of the analog filter types—Butterworth, Chebyshev, and elliptic—are sup-ported by order selection routines (i.e., first-stage routines). The first-stage

All of the analog filter types—Butterworth, Chebyshev, and elliptic—are sup-ported by order selection routines (i.e., first-stage routines). The first-stage