Optimal IIR filter with prescribed group-delay

`[num,den] = iirgrpdelay(n,f,edges,a)`

[num,den] = iirgrpdelay(n,f,edges,a,w)

[num,den] = iirgrpdelay(n,f,edges,a,w,radius)

[num,den] = iirgrpdelay(n,f,edges,a,w,radius,p)

[num,den] = iirgrpdelay(n,f,edges,a,w,radius,p,dens)

[num,den] = iirgrpdelay(n,f,edges,a,w,radius,p,dens,initden)

[num,den] = iirgrpdelay(n,f,edges,a,w,radius,p,dens,initden,tau)

[num,den,tau] = iirgrpdelay(n,f,edges,a,w)

`[num,den] = iirgrpdelay(n,f,edges,a)`

returns
an allpass IIR filter of order `n`

(`n`

must
be even) which is the best approximation to the relative group-delay
response described by `f`

and `a`

in
the least-pth sense. `f`

is a vector of frequencies
between 0 and 1 and `a`

is specified in samples.
The vector `edges`

specifies the band-edge frequencies
for multi-band designs. `iirgrpdelay`

uses a constrained
Newton-type algorithm. Always check your resulting filter using `grpdelay`

or `freqz`

.

`[num,den] = iirgrpdelay(n,f,edges,a,w)`

uses
the weights in `w`

to weight the error. `w`

has
one entry per frequency point and must be the same length as `f`

and `a`

).
Entries in `w`

tell `iirgrpdelay`

how
much emphasis to put on minimizing the error in the vicinity of each
specified frequency point relative to the other points.

`f`

and `a`

must have the
same number of elements. `f`

and `a`

can
contains more elements than the vector `edges`

contains.
This lets you use `f`

and `a`

to
specify a filter that has any group-delay contour within each band.

`[num,den] = iirgrpdelay(n,f,edges,a,w,radius)`

returns
a filter having a maximum pole radius equal to `radius`

,
where 0<`radius`

<1. `radius`

defaults
to 0.999999. Filters whose pole radius you constrain to be less than
1.0 can better retain transfer function accuracy after quantization.

`[num,den] = iirgrpdelay(n,f,edges,a,w,radius,p)`

,
where `p`

is a two-element vector [```
pmin
pmax
```

], lets you determine the minimum and maximum values
of `p`

used in the least-pth algorithm. `p`

defaults
to [2 128] which yields filters very similar to the L-infinity, or
Chebyshev, norm. `pmin`

and `pmax`

should
be even. If `p`

is `'inspect'`

,
no optimization occurs. You might use this feature to inspect the
initial pole/zero placement.

`[num,den] = iirgrpdelay(n,f,edges,a,w,radius,p,dens)`

specifies
the grid density `dens`

used in the optimization
process. The number of grid points is `(dens*(n+1))`

.
The default is 20. `dens`

can be specified as a single-element
cell array. The grid is not equally spaced.

`[num,den] = iirgrpdelay(n,f,edges,a,w,radius,p,dens,initden)`

allows
you to specify the initial estimate of the denominator coefficients
in vector `initden`

. This can be useful for difficult
optimization problems. The pole-zero editor in Signal
Processing Toolbox™ software
can be used for generating `initden`

.

`[num,den] = iirgrpdelay(n,f,edges,a,w,radius,p,dens,initden,tau)`

allows
the initial estimate of the group delay offset to be specified by
the value of `tau`

, in samples.

`[num,den,tau] = iirgrpdelay(n,f,edges,a,w)`

returns
the resulting group delay offset. In all cases, the resulting filter
has a group delay that approximates [`a + tau`

].
Allpass filters can have only positive group delay and a non-zero
value of tau accounts for any additional group delay that is needed
to meet the shape of the contour specified by `(f,a)`

.
The default for `tau`

is `max`

(`a`

).

Hint: If the zeros or poles cluster together, your filter order
may be too low or the pole radius may be too small (overly constrained).
Try increasing `n`

or `radius`

.

For group-delay equalization of an IIR filter, compute `a`

by
subtracting the filter's group delay from its maximum group delay.
For example,

[be,ae] = ellip(4,1,40,0.2); f = 0:0.001:0.2; g = grpdelay(be,ae,f,2); % Equalize only the passband. a = max(g)-g; [num,den]=iirgrpdelay(8, f, [0 0.2], a);

Antoniou, A., *Digital Filters: Analysis, Design, and
Applications*, Second Edition, McGraw-Hill, Inc. 1993.