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?