0

Is there a way to retrieve both Principal and Actual values for a Phase Response using the fvtool (Open Filter Visualization Tool) in MatLab?

Thanks

User 5842
  • 107
  • 4

1 Answers1

1

the Principal value, $ -\pi < \Phi \le +\pi $, of phase is always

$$\begin{align} \Phi & \triangleq \operatorname{Arg}\{H(e^{j \omega})\} \\ &= \operatorname{Arg} \bigg\{ \Re\{H(e^{j \omega})\} + j \,\Im\{H(e^{j \omega})\} \bigg\} \\ &= \operatorname{atan2}\left(\Im\{H(e^{j \omega})\},\,\Re\{H(e^{j \omega})\}\right) \\ \end{align}$$

the four-quadrant arctangent:

$$\begin{align} \operatorname{atan2}(y,x) &= \begin{cases} \arctan(\frac y x) &\text{if } x > 0, \\ \arctan(\frac y x) + \pi &\text{if } x < 0 \text{ and } y \ge 0, \\ \arctan(\frac y x) - \pi &\text{if } x < 0 \text{ and } y < 0, \\ +\frac{\pi}{2} &\text{if } x = 0 \text{ and } y > 0, \\ -\frac{\pi}{2} &\text{if } x = 0 \text{ and } y < 0, \\ \text{undefined} &\text{if } x = 0 \text{ and } y = 0 \\ \end{cases} \\ \\ &= \begin{cases} \arctan\left(\frac{y}{x}\right) &\text{if } x > 0, \\ \frac{\pi}{2} - \arctan\left(\frac{x}{y}\right) &\text{if } y > 0, \\ -\frac{\pi}{2} - \arctan\left(\frac{x}{y}\right) &\text{if } y < 0, \\ \arctan\left(\frac{y}{x}\right) \pm \pi &\text{if } x < 0, \\ \text{undefined} &\text{if } x = 0 \text{ and } y = 0 \\ \end{cases} \\ \end{align}$$

if, by "Actual value", you mean the unwrapped phase, if you have $\frac{N}{2}$ data points for frequency

$$ \omega[k] \triangleq \frac{2 \pi}{N}k $$

then, assuming real coefficients, define your phase at DC to be:

$$ \phi[0] = \Phi[0] = \begin{cases} 0 \quad & H(e^{j 0}) = H(1) \ge 0 \\ \pm \pi & H(e^{j 0}) = H(1) < 0 \\ \end{cases} $$

then for $ 1 \le k < \frac{N}{2} $ unwrapped phase is

$$ \phi[k] = \phi[k-1] + \Phi[k] - \Phi[k-1] + \theta[k] $$

where

$$ \theta[k] = \begin{cases} 2 \pi \quad & \text{if } \Phi[k] < \Phi[k-1] - \pi \\ 0 & \text{if } \Phi[k-1] - \pi \le \Phi[k] \le \Phi[k-1] + \pi \\ -2 \pi \quad & \text{if } \Phi[k-1] +\pi < \Phi[k] \\ \end{cases}$$

that's pretty much what MATLAB's unwrap() does.

there's a better way to do the phase difference of adjacent discrete frequencies:

the unwrapped phase for $ 1 \le k < \frac{N}{2} $ can also be expressed as

$$\begin{align} \phi[k] &= \phi[k-1] + \Phi[k] - \Phi[k-1] + \theta[k] \\ &= \phi[k-1] + \Delta \phi[k] \\ \end{align}$$

where

$$\begin{align} \Delta \phi[k] &= \Phi[k] - \Phi[k-1] + \theta[k] \\ &= \phi[k] - \phi[k-1] \\ &= \arg\{H(e^{j \omega[k]})\} - \arg\{H(e^{j \omega[k-1]})\} \\ \\ &= \arg\left\{ \frac{H(e^{j \omega[k]})}{H(e^{j \omega[k-1]})} \right\} \\ \\ &= \arg\left\{ \frac{\Re\{H(e^{j \omega[k]})\} + j \Im\{H(e^{j \omega[k]})\}}{\Re\{H(e^{j \omega[k-1]})\} + j \Im\{H(e^{j \omega[k-1]})\}} \right\} \\ \\ &= \arg\left\{ \frac{(\Re\{H(e^{j \omega[k]})\} + j \Im\{H(e^{j \omega[k]})\})(\Re\{H(e^{j \omega[k-1]})\} - j \Im\{H(e^{j \omega[k-1]})\})}{(\Re\{H(e^{j \omega[k-1]})\} + j \Im\{H(e^{j \omega[k-1]})\})(\Re\{H(e^{j \omega[k-1]})\} - j \Im\{H(e^{j \omega[k-1]})\})} \right\} \\ \\ &= \arg\left\{ \frac{\Re\{H(e^{j \omega[k]})\}\Re\{H(e^{j \omega[k-1]})\} - j^2 \Im\{H(e^{j \omega[k]})\}\Im\{H(e^{j \omega[k-1]})\} + j \Im\{H(e^{j \omega[k]})\}\Re\{H(e^{j \omega[k-1]})\} - j\Re\{H(e^{j \omega[k]})\}\Im\{H(e^{j \omega[k-1]})\}}{|H(e^{j \omega[k-1]})|^2} \right\} \\ \\ & = \arg\left\{ \begin{matrix} \Re\{H(e^{j \omega[k]})\}\Re\{H(e^{j \omega[k-1]})\} + \Im\{H(e^{j \omega[k]})\}\Im\{H(e^{j \omega[k-1]})\} \\ + \ j \big(\Im\{H(e^{j \omega[k]})\}\Re\{H(e^{j \omega[k-1]})\} - \Re\{H(e^{j \omega[k]})\}\Im\{H(e^{j \omega[k-1]})\} \big) \end{matrix} \right\} \\ \\ & = \arctan \left( \frac{\Im\{H(e^{j \omega[k]})\}\Re\{H(e^{j \omega[k-1]})\} - \Re\{H(e^{j \omega[k]})\}\Im\{H(e^{j \omega[k-1]})\}}{\Re\{H(e^{j \omega[k]})\}\Re\{H(e^{j \omega[k-1]})\} + \Im\{H(e^{j \omega[k]})\}\Im\{H(e^{j \omega[k-1]})\}} \right) \\ \\ \end{align}$$

because $\Delta \phi[k]$ is expected to be

$$ -\frac{\pi}{2} < \Delta \phi[k] < \frac{\pi}{2} $$

even smaller in most non-pathological cases.

that might be the best way to unwrap phase given the real and imaginary parts of your frequency response function.

robert bristow-johnson
  • 20,661
  • 4
  • 38
  • 76
  • Great answer! If I now want to plot both the principal and actual value of the Phase Response in MatLab, would I simply do plot([angle(H1) unwrap(angle(H1))];? – User 5842 Feb 05 '17 at 04:40
  • the Principle value and the unwrapped phase will always differ by an integer times $2 \pi$. you just want the unwrapped phase to be most continuous. – robert bristow-johnson Feb 05 '17 at 04:44