Source code for naif._base_funcs

import numpy as np
from scipy import integrate

twopi = 2.*np.pi

#--------------------
[docs]def chi_p(t, p=1): """ Window function \chi_p(t) Parameters ---------- t: float array (size N) Time symmetric, from -T/2 to T/2 p: int, optional p parameter Returns ------- float array Window function chi_p """ T = t[-1] - t[0] # total integration time fact_p = np.math.factorial(p) fact_2p = np.math.factorial(2*p) return (2.**p*fact_p**2/fact_2p)*(1. + np.cos(twopi*t/T))**p
# ----------------------- # Scalar product with Window function:
[docs]def inner_prod(t, u1_chi, u2): """ Inner product <u_1, u_2> Parameters ---------- t: float array (size N) Time symmetric, from -T/2 to T/2 u1_chi: complex array u_1 * chi_p(t) - 1st arg. of inner prod. times window u_2: complex array Second argument of inner product Returns ------- complex Innter product <u_1, u_2> """ T = t[-1] - t[0] integrand = u1_chi*np.conj(u2) return (1./T)*integrate.simps(integrand, t)
# -----------------------
[docs]def mn_phi_om(om, f_chi, t): """ Calculates -\|(phi(omega)\| = -\|<f(t), exp(i om t)>\| The continuous projection of the time series onto the frequency space. It calcuates the minimum (instead of the maximum) because Brent's looks for minima Parameters ---------- om: float Frequency omega (continuous) f_chi: complex array f_k * chi_p(t) - the windowed time-series t: float array Time symmetric, from -T/2 to T/2 Returns ------- float -\|phi(omega)\| """ return -np.abs(inner_prod(t, f_chi, np.exp(1j*om*t)))
# -----------------------
[docs]def gs(t, u, e, chi): """ Gram-Schimidt orthonomal basis For each peak identified at om, build vector u = exp(i* om * t), and obtain e_k's normal to all previous ones (by Gram-Schimidt orthonomalization). Parameters ---------- t: float array Time symmetric, from -T/2 to T/2 u: complex array u_k = exp(i om_k t) - non-orthonormal vectors e: complex, array e_k: set of orthonormal vectors already calc. (it has only elements up to k) chi: float array chi_p(t) - the window function Returns ------- complex array Orthonormal vectors """ k = len(e) u_chi = u*chi # projection of u_k onto e_j: proj_ue_kj = np.zeros((k,1), dtype=np.complex128) for j in range(k): proj_ue_kj[j] = inner_prod(t, u_chi, e[j]) tmp_e = u - np.sum(proj_ue_kj*e, axis=0) tmp_e_chi = tmp_e*chi return tmp_e/np.sqrt(inner_prod(t, tmp_e_chi, tmp_e))