Creating Minimum Phase Filters
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'' method12.3is 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 . 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.4It 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.
Signal Representation and Notation
Is Linear Phase Really Ideal for Audio?