##
Creating Minimum Phase Filters

and Signals

Minimum-phase filter design often requires creating a minimum-phase
desired frequency response
from a given magnitude response
). As is clear from
§11.5, any filter transfer function can be made
minimum-phase, in principle, by completely factoring and
``reflecting'' all zeros for which inside the
unit circle, *i.e.*, replacing by . However, factoring a
polynomial this large can be impractical. An approximate
``nonparametric'' method^{12.3}is based on the property of the *complex cepstrum*
(see §8.8) that each minimum-phase zero in the spectrum
gives rise to a causal exponential in the cepstrum, while each
maximum-phase zero corresponds to an anti-causal exponential in the
cepstrum [60]. Therefore, by computing the
cepstrum and converting anti-causal exponentials to causal
exponentials, the corresponding spectrum is
converted *nonparametrically* to minimum-phase form.

A matlab function `mps.m` which carries out this method is
listed in §J.11.^{12.4}It works best for *smooth* desired frequency response curves, but
in principle the error can be made arbitrarily small by simply
enlarging the FFT sizes used. Specifically, the inverse FFT of the log
magnitude frequency response should not ``wrap around'' in the time
domain (negligible ``time aliasing'').

It is important to use something like `mps` when designing
digital filters based on a magnitude frequency-response specification
using ``phase sensitive'' filter-design software (such
as `invfreqz` in matlab). In other words, poor results are
generally obtained when phase-sensitive filter-design software is
asked to design a causal, stable, zero-phase filter. As a general
rule, when phase doesn't matter, ask for minimum phase.

A related practical note is that unstable recursive filter designs can
often be stabilized by simply adding more delay to the desired impulse
response (*i.e.*, adding a negatively sloped linear phase to the desired
phase response). For example, the Steiglitz-McBride algorithm in
Matlab (`stmcb`) is a phase-sensitive IIR filter-design
function that accepts a desired impulse response, while
Matlab's `invfreqz` (which can optionally iterate toward the
Steiglitz-McBride solution), accepts a complex desired frequency
response.

**Next Section:**

Signal Representation and Notation

**Previous Section:**

Is Linear Phase Really Ideal for Audio?