phases = (phases + np.pi) % (2 * np.pi) - np.pi
import numpy as np
phases = np.arctan2(np.sin(phases), np.cos(phases))
Questo funziona perché sin(fasi)/cos(fasi) ==tan(fasi). Restituiamo le fasi (modulo 2π) usando la funzione inversa-tangente. Matematicamente, la funzione inversa-tangente è multivalore, quindi nei linguaggi di programmazione è solitamente definita per restituire la fase in un intervallo fisso.
La funzione arcotangente a due parametri, ovvero np.arctan2(numerator, denominator)
, è la stessa della regolare funzione arctangente tranne per il fatto che tiene traccia dei segni del numeratore e denominatore, e quindi è in grado di restituire la fase modulo 2π, invece della regolare np.arctan(numerator/denominator)
funzione che è in grado di restituire solo la fase modulo π. L'implementazione di Numpy di arctan2
La funzione è definita per restituire la fase nell'intervallo [-π, +π], che è l'intervallo richiesto dall'OP.
Spiegazione aggiuntiva:questo metodo arctan2 segue direttamente dalla rappresentazione complessa ed è interamente matematicamente equivalente a:
phases = np.angle(np.exp(1j*phases))
che potrebbe essere più intuitivo. E in effetti, l'angle
di numpy la funzione usa arctan2
dietro le quinte per separare le componenti immaginarie e reali dell'esponenziale, ovvero il seno e il coseno.
Questa risposta è una leggera variazione della risposta sega_sai che è:
phases = ( phases + np.pi) % (2 * np.pi ) - np.pi
Questo mappa le fasi su [-pi, pi) -> il che significa che pi è mappato su -pi
Mostrato qui:
In [27]: phases = np.pi
In [28]: phases = ( phases + np.pi) % (2 * np.pi ) - np.pi
In [29]: print phases
-3.14159265359
Il che è perfettamente legittimo, ma se vuoi una mappatura di (-pi, pi] allora
Volte l'input e l'output dell'operazione buy -1. Così:
phases = (( -phases + np.pi) % (2.0 * np.pi ) - np.pi) * -1.0