Products & Services Solutions Academia Support User Community Company

Learn more about Filter Design Toolbox   

firgr - Parks-McClellan FIR filter

Syntax

b = firgr(n,f,a,w)
b = firgr(n,f,a,'hilbert')
b = firgr(m,f,a,r),
b = firgr({m,ni},f,a,r)
b = firgr(n,f,a,w,e)
b = firgr(n,f,a,s)
b = firgr(n,f,a,s,w,e)
b = firgr(...,'1')
b = firgr(...,'minphase')
b = firgr(..., 'check')
b = firgr(...,{lgrid}),
[b,err] = firgr(...)
[b,err,res] = firgr(...)
b = firgr(n,f,fresp,w)
b = firgr(n,f,{fresp,p1,p2,...},w)
b = firgr(n,f,a,w)

Description

firgr is a minimax filter design algorithm you use to design the following types of real FIR filters:

b = firgr(n,f,a,w) returns a length n+1 linear phase FIR filter which has the best approximation to the desired frequency response described by f and a in the minimax sense. w is a vector of weights, one per band. When you omit w, all bands are weighted equally. For more information on the input arguments, refer to firpm in Signal Processing Toolbox User's Guide.

b = firgr(n,f,a,'hilbert') and b = firgr(n,f,a,'differentiator') design FIR Hilbert transformers and differentiators. For more information on designing these filters, refer to firpm in Signal Processing Toolbox User's Guide.

b = firgr(m,f,a,r), where m is one of 'minorder', 'mineven' or 'minodd', designs filters repeatedly until the minimum order filter, as specified in m, that meets the specifications is found. r is a vector containing the peak ripple per frequency band. You must specify r. When you specify 'mineven' or 'minodd', the minimum even or odd order filter is found.

b = firgr({m,ni},f,a,r) where m is one of 'minorder', 'mineven' or 'minodd', uses ni as the initial estimate of the filter order. ni is optional for common filter designs, but it must be specified for designs in which firpmord cannot be used, such as while designing differentiators or Hilbert transformers.

b = firgr(n,f,a,w,e) specifies independent approximation errors for different bands. Use this syntax to design extra ripple or maximal ripple filters. These filters have interesting properties such as having the minimum transition width. e is a cell array of strings specifying the approximation errors to use. Its length must equal the number of bands. Entries of e must be in the form 'e#' where # indicates which approximation error to use for the corresponding band. For example, when e = {'e1','e2','e1'}, the first and third bands use the same approximation error 'e1' and the second band uses a different one 'e2'. Note that when all bands use the same approximation error, such as {'e1','e1','e1',...}, it is equivalent to omitting e, as in b = firgr(n,f,a,w).

b = firgr(n,f,a,s) is used to design filters with special properties at certain frequency points. s is a cell array of strings and must be the same length as f and a. Entries of s must be one of:

For example, the following command designs a bandstop filter with zero-valued single-point stop bands (notches) at 0.25 and 0.55.

b = firgr(42,[0 0.2 0.25 0.3 0.5 0.55 0.6 1],...
[1 1 0 1 1 0 1 1],{'n' 'n' 's' 'n' 'n' 's' 'n' 'n'})

b = firgr(82,[0 0.055 0.06 0.1 0.15 1],[0 0 0 0 1 1],...{'n' 'i' 'f' 'n' 'n' 'n'}) designs a highpass filter with the gain at 0.06 forced to be zero. The band edge at 0.055 is indeterminate since the first two bands actually touch. The other band edges are normal.

b = firgr(n,f,a,s,w,e) specifies weights and independent approximation errors for filters with special properties. The weights and properties are included in vectors w and e. Sometimes, you may need to use independent approximation errors to get designs with forced values to converge. For example,

b = firgr(82,[0 0.055 0.06 0.1 0.15 1], [0 0 0 0 1 1],... 
{'n' 'i' 'f' 'n' 'n' 'n'}, [10 1 1] ,{'e1' 'e2' 'e3'});

b = firgr(...,'1') designs a type 1 filter (even-order symmetric). You can specify type 2 (odd-order symmetric), type 3 (even-order antisymmetric), and type 4 (odd-order antisymmetric) filters as well. Note that restrictions apply to a at f = 0 or f = 1 for FIR filter types 2, 3, and 4.

b = firgr(...,'minphase') designs a minimum-phase FIR filter. You can use the argument 'maxphase' to design a maximum phase FIR filter.

b = firgr(..., 'check') returns a warning when there are potential transition-region anomalies.

b = firgr(...,{lgrid}), where {lgrid} is a scalar cell array. The value of the scalar controls the density of the frequency grid by setting the number of samples used along the frequency axis.

[b,err] = firgr(...) returns the unweighted approximation error magnitudes. err contains one element for each independent approximation error returned by the function.

[b,err,res] = firgr(...) returns the structure res comprising optional results computed by firgr. res contains the following fields.

Structure Field

Contents

res.fgrid

Vector containing the frequency grid used in the filter design optimization

res.des

Desired response on fgrid

res.wt

Weights on fgrid

res.h

Actual frequency response on the frequency grid

res.error

Error at each point (desired response - actual response) on the frequency grid

res.iextr

Vector of indices into fgrid of external frequencies

res.fextr

Vector of external frequencies

res.order

Filter order

res.edgecheck

Transition-region anomaly check. One element per band edge. Element values have the following meanings: 1 = OK, 0 = probable transition-region anomaly, -1 = edge not checked. Computed when you specify the 'check' input option in the function syntax.

res.iterations

Number of s iterations for the optimization

res.evals

Number of function evaluations for the optimization

firgr is also a "function function," allowing you to write a function that defines the desired frequency response.

b = firgr(n,f,fresp,w) returns a length N + 1 FIR filter which has the best approximation to the desired frequency response as returned by the user-defined function fresp. Use the following firgr syntax to call fresp:

[dh,dw] = fresp(n,f,gf,w)

where:

firgr includes a predefined frequency response function named 'firpmfrf2'. You can write your own based on the simpler 'firpmfrf'. See the help for private/firpmfrf for more information.

b = firgr(n,f,{fresp,p1,p2,...},w) specifies optional arguments p1, p2,..., pn to be passed to the response function fresp.

b = firgr(n,f,a,w) is a synonym for b = firgr(n,f,{'firpmfrf2',a},w), where a is a vector containing your specified response amplitudes at each band edge in f. By default, firgr designs symmetric (even) FIR filters. 'firpmfrf2' is the predefined frequency response function. If you do not specify your own frequency response function (the fresp string variable), firgr uses 'firpmfrf2'.

b = firgr(...,'h') and b = firgr(...,'d') design antisymmetric (odd) filters. When you omit the 'h' or 'd' arguments from the firgr command syntax, each frequency response function fresp can tell firgr to design either an even or odd filter. Use the command syntax sym = fresp('defaults',{n,f,[],w,p1,p2,...}).

firgr expects fresp to return sym = 'even' or sym = 'odd'. If fresp does not support this call, firgr assumes even symmetry.

For more information about the input arguments to firgr, refer to firpm.

Examples

These examples demonstrate some filters you might design using firgr.

Example 1

design an FIR filter with two single-band notches at 0.25 and 0.55

b1 = firgr(42,[0 0.2 0.25 0.3 0.5 0.55 0.6 1],[1 1 0 1 1 0 1 1],... 
{'n' 'n' 's' 'n' 'n' 's' 'n' 'n'});

Example 2

design a highpass filter whose gain at 0.06 is forced to be zero. The gain at 0.055 is indeterminate since it should abut the band.

b2 = firgr(82,[0 0.055 0.06 0.1 0.15 1],[0 0 0 0 1 1],...
{'n' 'i' 'f' 'n' 'n' 'n'});

Example 3

design a second highpass filter with forced values and independent approximation errors.

b3 = firgr(82,[0 0.055 0.06 0.1 0.15 1], [0 0 0 0 1 1], ...
{'n' 'i' 'f' 'n' 'n' 'n'}, [10 1 1] ,{'e1' 'e2' 'e3'});

Use the filter visualization tool to view the results of the filters created in these examples.

fvtool(b1,1,b2,1,b3,1)

Here is the figure from FVTool.

See Also

butter, cheby1, cheby2, ellip, freqz, filter, firls, fircls, and firpm in Signal Processing Toolbox documentation

References

Shpak, D.J. and A. Antoniou, "A generalized Remez method for the design of FIR digital filters," IEEE Trans. Circuits and Systems, pp. 161-174, Feb. 1990.

  


Free Early Verification Kit

Learn how to apply early verification to your development process through these technical resources.

How much time do you spend on testing to ensure implementation meets system-level requirements?

 © 1984-2009- The MathWorks, Inc.    -   Site Help   -   Patents   -   Trademarks   -   Privacy Policy   -   Preventing Piracy   -   RSS