Problem statement

I have a collection of magnitude (only) responses I'd like to turn into FIR filter kernels that are

  1. matched in phase
  2. "minimal" in phase, with respect to the complete system
  3. have little to no "pre-ring"
  4. maintain the design magnitude to a high degree

In the ideal case, I'm hoping for a solution that is analytic rather than parametric.

Meeting the first requirement can be expressed as:

$$ \phi_s(f) = arg\{ H_0(f) \} = arg\{ H_1(f) \} = ... = arg\{ H_n(f) \} $$

And, is very easy to meet in a linear phase case.

Accumulating phase

In attempting to meet the second condition, I've tried something akin to a "cascading" of phase given minimum phase versions of each filter. I've done this by

  1. returning the "Hilbert" minimum phase for each magnitude response
  2. accumulating these responses, and then defining this as the system phase
  3. reassigning system phase to each response

Here's an expression for the accumulation I used to find the system phase:

$$ \phi_s(f) = \sum_{i=0}^n - \mathscr H \{ \ln( |H_n(f)| ) \} $$

Unfortunately, for my responses, this results in a poor outcome, returning kernels with way too much smearing / lag at low frequencies in the time domain. All this smearing is far from "minimal" in any sense!

I'm suspicious this may be a result of the two definitions of minimum phase discussed earlier.

Minimum phase of L-2 norm of magnitudes

The most promising results I've had after a bit of hacking is to take the L-2 norm of my magnitude set and use this as a minimum phase target:

$$ |H_{L2}(f)| = \biggl(\sum_{i=0}^n |H_n(f)|^2 \biggr)^{1/2} $$

$$ \phi_{L2}(f) = - \mathscr H \{ \ln (|H_{L2}(f)|) \} $$

Setting $\phi_s(f) = \phi_{L2}(f)$ returns kernels with coefficients packed towards the beginning and end of the table. Rotating the table, a linear phase offset, by $\max\bigl(\phi_{L2}(f)\bigr)$, turns the end into a "pre-ring".

While not beautiful, this does get me closer to what I think I'm looking for.

Some more details on my magnitudes

$|H_0(f)|$ is allpass; the remaining are highpass with every increasing roll-off slopes and cut-off frequencies.


Is there a nice off the shelf know solution? In my mind, the problem is very similar to a matched phase cross-over.

Am I asking too much? In the ideal case I'd like to have no "pre-ring". Maybe that's not possible?

Am I asking the right question(s)? In other words, is "minimum phase" what I'm looking for. What I really want is for my kernels to be matched in phase, and respond "as soon as possible".


1 Answer 1


The Hilbert "transform" or relation define one phase response for a given magnitude response, so you can't get both matched and minimum phase in your case.


  • $\begingroup$ So... do you know of a good way to meet the four listed conditions I'd like to meet? $\endgroup$ Commented Jun 13, 2019 at 17:47
  • 1
    $\begingroup$ No, and I think you're hitting physics there. You'll have to make compromise, and it strongly depend on your end application. What is the purpose of this filter? $\endgroup$ Commented Jun 14, 2019 at 11:13

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.