This morning, I asked a similar question about separating simple signals - with constant frequency - into exponential components. User @AndreasH suggested that a hilbert transform can do this as follows:

$$\cos(\omega_1 t) + j ~\textrm{Hilbert}[\cos(\omega_1 t)] = e^{j\omega_1 t}$$

This works great when $\omega_1$ is a real constant, and when time is linear. Is there a way to do it for a more complicated signal? For example,

$$x(t)=\cos(\omega_o t^2 ) $$

When I perform a hilbert transform on this one, I get something with a lot of error functions.

How can I get $y(t)=e^{j\omega_o t^2}$ from $x(t)$?

  • $\begingroup$ Perhaps this isn't possible analytically; but perhaps digitally? $\endgroup$ – axsvl77 Oct 18 '17 at 19:39
  • $\begingroup$ I don't know what you mean by "is there a transform to give..." $\endgroup$ – Dave Kielpinski Oct 18 '17 at 23:22
  • $\begingroup$ I think what he means is whether there's a transform (like Hilbert transform) that would turn $x(t)=cos(w_0t^2)$ into $y(t)=e^{j w_0 t^2}$. $\endgroup$ – Atul Ingle Oct 19 '17 at 1:56
  • $\begingroup$ @axsvl77 I think you are missing a $j$ from many of your complex exponentials. $\endgroup$ – Atul Ingle Oct 19 '17 at 1:57
  • $\begingroup$ @DaveKielpinski More clear? $\endgroup$ – axsvl77 Oct 19 '17 at 11:29

Hilbert transform method from your earlier question and Jason R's answer should still work. What you are interested in is extracting the instantaneous phase of your function. For a signal $x(t)$ this is given by $\phi(t) = \angle x_a(t)$ where $x_a(t)$ is the analytic signal of $x(t)$.

Digitally you can do this using a Hilbert transform too. Here's a code snippet in Python:

import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import hilbert

if __name__=='__main__':

  t = np.linspace(0,3,100)
  x = np.cos(10*t*t)

  y = np.imag(hilbert(x))

  x_a = x + 1j*y
  inst_phase = np.angle(x_a)

  true_phase = 10*t*t
  true_phase_wrapped = (true_phase-np.pi)%(2*np.pi)-np.pi

  plt.plot(t, x)
  plt.plot(t, inst_phase)
  plt.plot(t, true_phase_wrapped)
  plt.legend((r'$x(t)=\cos(10t^2)$', r'$\angle x_a(t)$', 
      r'$10 t^2$ wrapped to $[-\pi,\pi]$'))

  plt.plot(t, np.unwrap(inst_phase))
  plt.plot(t, true_phase)
  plt.legend(('unwrapped inst. phase', 'true phase=$10t^2$'))

Figure 1 Figure 2

  • $\begingroup$ Thanks for your answer! When I implement the hilbert transform using this code in mathematica, It most certainly works for $\cos(\omega t^2)$. However, with a time shift, $\cos(\omega (t-1)^2)$ it does not work. $\endgroup$ – axsvl77 Oct 27 '17 at 18:12
  • $\begingroup$ Here's my graph - for t<1, the green line and the blue line should be similar. What did I do wrong? $\endgroup$ – axsvl77 Oct 27 '17 at 18:29
  • $\begingroup$ I installed python, ran your code with every t replaced by (t-1), and have a similar response as my mathematica code; for $0<t<1$, the signal is inverted. What is happening there? $\endgroup$ – axsvl77 Oct 27 '17 at 18:41

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

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