Parks-McClellan optimal FIR filter design
Parks-McClellan Bandpass Filter
Use the Parks-McClellan algorithm to design an FIR bandpass filter of order 17. Specify normalized stopband frequencies of and rad/sample and normalized passband frequencies of and rad/sample. Plot the ideal and actual magnitude responses.
f = [0 0.3 0.4 0.6 0.7 1]; a = [0 0 1 1 0 0]; b = firpm(17,f,a); [h,w] = freqz(b,1,512); plot(f,a,w/pi,abs(h)) legend('Ideal','firpm Design') xlabel 'Radian Frequency (\omega/\pi)', ylabel 'Magnitude'
Parks-McClellan Lowpass Filter
Design a lowpass filter with a 1500 Hz passband cutoff frequency and 2000 Hz stopband cutoff frequency. Specify a sampling frequency of 8000 Hz. Require a maximum stopband amplitude of 0.01 and a maximum passband error (ripple) of 0.001. Obtain the required filter order, normalized frequency band edges, frequency band amplitudes, and weights using
[n,fo,ao,w] = firpmord([1500 2000],[1 0],[0.001 0.01],8000); b = firpm(n,fo,ao,w); fvtool(b,1)
FIR Bandpass Filter with Asymmetric Attenuation
Use the Parks-McClellan algorithm to create a 50th-order equiripple FIR bandpass filter to be used with signals sampled at 1 kHz.
N = 50; Fs = 1e3;
Specify that the passband spans the frequencies between 200 Hz and 300 Hz and that the transition region on either side of the passband has a width of 50 Hz.
Fstop1 = 150; Fpass1 = 200; Fpass2 = 300; Fstop2 = 350;
Design the filter so that the optimization fit weights the low-frequency stopband with a weight of 3, the passband with a weight of 1, and the high-frequency stopband with a weight of 100. Display the magnitude response of the filter.
Wstop1 = 3; Wpass = 1; Wstop2 = 100; b = firpm(N,[0 Fstop1 Fpass1 Fpass2 Fstop2 Fs/2]/(Fs/2), ... [0 0 1 1 0 0],[Wstop1 Wpass Wstop2]); fvtool(b,1)
n — Filter order
real positive scalar
Filter order, specified as a real positive scalar.
f — Normalized frequency points
Normalized frequency points, specified as a real-valued vector. The argument must be in the range [0, 1] , where 1 corresponds to the Nyquist frequency. The number of elements in the vector is always a multiple of 2. The frequencies must be in increasing order.
a — Desired amplitude
Desired amplitudes at the points specified in
specified as a vector.
a must be
the same length. The length must be an even number.
The desired amplitude at frequencies between pairs of points (f(k), f(k+1)) for k odd is the line segment connecting the points (f(k), a(k)) and (f(k+1), a(k+1)).
The desired amplitude at frequencies between pairs of points (f(k), f(k+1)) for k even is unspecified. The areas between such points are transition regions or regions that are not important for a particular application.
ftype — Filter type
Filter type for linear-phase filters with odd symmetry (type III and type
IV), specified as either
'hilbert'— The output coefficients in
bobey the relation b(k) = –b(n + 2 – k), k = 1, ..., n + 1. This class of filters includes the Hilbert transformer, which has a desired amplitude of 1 across the entire band.
h = firpm(30,[0.1 0.9],[1 1],'hilbert');
designs an approximate FIR Hilbert transformer of length 31.
'differentiator'— For nonzero amplitude bands, the filter weighs the error by a factor of 1/f so that the error at low frequencies is much smaller than at high frequencies. For FIR differentiators, which have an amplitude characteristic proportional to frequency, these filters minimize the maximum relative error (the maximum of the ratio of the error to the desired amplitude).
lgrid — Density of frequency grid
16 (default) | 1-by-1 cell array with integer value
Control the density of the frequency grid, which has roughly
(lgrid*n)/(2*bw) frequency points, where
bw is the fraction of the total frequency band
interval [0,1] covered by
lgrid often results in filters that more exactly
match an equiripple filter, but that take longer to compute. The default
16 is the minimum value that should be specified
fresp — Frequency response
Frequency response, specified as a function handle. The function is called
firpm with this syntax:
[dh,dw] = fresp(n,f,gf,w)
The arguments are similar to those for
nis the filter order.
fis the vector of normalized frequency band edges that appear monotonically between 0 and 1, where 1 is the Nyquist frequency.
gfis a vector of grid points that have been linearly interpolated over each specified frequency band by
gfdetermines the frequency grid at which the response function must be evaluated, and contains the same data returned by
fgridfield of the
wis a vector of real, positive weights, one per band, used during optimization.
wis optional in the call to
firpm; if not specified, it is set to unity weighting before being passed to
dware the desired complex frequency response and band weight vectors, respectively, evaluated at each frequency in grid
b — Filter coefficients
Filter coefficients, returned as a row vector of length
n + 1. The coefficients are in increasing
err — Maximum ripple height
Maximum ripple height, returned as a scalar.
res — Frequency response characteristics
Frequency response characteristics, returned as a structure. The structure
res has the following fields:
Frequency grid vector used for the filter design optimization
Desired frequency response for each point in
Weighting for each point in
Actual frequency response for each point in
Error at each point in
Vector of indices into
Vector of extremal frequencies
If your filter design fails to converge, the filter design might not be correct. Verify the design by checking the frequency response.
If your filter design fails to converge and the resulting filter design is not correct, attempt one or more of the following:
Increase the filter order.
Relax the filter design by reducing the attenuation in the stopbands and/or broadening the transition regions.
firpm designs a linear-phase FIR filter using the Parks-McClellan
algorithm . The Parks-McClellan algorithm uses the Remez exchange algorithm and
Chebyshev approximation theory to design filters with an optimal fit between the desired
and actual frequency responses. The filters are optimal in the sense that the maximum
error between the desired frequency response and the actual frequency response is
minimized. Filters designed this way exhibit an equiripple behavior in their frequency
responses and are sometimes called equiripple filters.
discontinuities at the head and tail of its impulse response due to this equiripple
These are type I (
n odd) and type II (
linear-phase filters. Vectors
a specify the
frequency-amplitude characteristics of the filter:
fis a vector of pairs of frequency points, specified in the range between 0 and 1, where 1 corresponds to the Nyquist frequency. The frequencies must be in increasing order. Duplicate frequency points are allowed and, in fact, can be used to design a filter exactly the same as those returned by the
fir2functions with a rectangular (
ais a vector containing the desired amplitude at the points specified in
The desired amplitude function at frequencies between pairs of points (f(k), f(k+1)) for k odd is the line segment connecting the points (f(k), a(k)) and (f(k+1), a(k+1)).
The desired amplitude function at frequencies between pairs of points (f(k), f(k+1)) for k even is unspecified. These are transition or "don’t care" regions.
aare the same length. This length must be an even number.
The figure below illustrates the relationship between the
a vectors in defining a desired amplitude response.
firpm always uses an even filter order for configurations with even
symmetry and a nonzero passband at the Nyquist frequency. The reason for the even filter
order is that for impulse responses exhibiting even symmetry and odd orders, the
frequency response at the Nyquist frequency is necessarily 0. If you specify an
firpm increments it by 1.
firpm designs type I, II, III, and IV linear-phase filters. Type I
and type II are the defaults for
n even and
respectively, while type III (
n even) and type IV
n odd) are specified with
'differentiator', respectively, using the
ftype argument. The different types of filters have different
symmetries and certain constraints on their frequency responses. (See  for more details.)
|Linear Phase Filter Type||Filter Order||Symmetry of Coefficients||Response H(f),
You can also use
firpm to write a function that defines the desired
frequency response. The predefined frequency response function handle for
@firpmfrf, which designs a
linear-phase FIR filter.
b = firpm(n,f,a,w) is equivalent to
the predefined frequency response function handle for
If desired, you can write your own response function. Use
private/firpmfrf and see Create Function Handle for
 Digital Signal Processing Committee of the IEEE Acoustics, Speech, and Signal Processing Society, eds. Selected Papers in Digital Signal Processing. Vol. II. New York: IEEE Press, 1976.
 Digital Signal Processing Committee of the IEEE Acoustics, Speech, and Signal Processing Society, eds. Programs for Digital Signal Processing. New York: IEEE Press, 1979, algorithm 5.1.
 Oppenheim, Alan V., Ronald W. Schafer, and John R. Buck. Discrete-Time Signal Processing. Upper Saddle River, NJ: Prentice Hall, 1999, p. 486.
 Parks, Thomas W., and C. Sidney Burrus. Digital Filter Design. New York: John Wiley & Sons, 1987, p. 83.
 Rabiner, Lawrence R., James H. McClellan, and Thomas W. Parks. "FIR Digital Filter Design Techniques Using Weighted Chebyshev Approximation." Proceedings of the IEEE®. Vol. 63, Number 4, 1975, pp. 595–610.
C/C++ Code Generation
Generate C and C++ code using MATLAB® Coder™.
Usage notes and limitations:
All inputs must be constants. Expressions or variables are allowed if their values do not change.