def test_IFT_FT(): # Test IFT(FT(x)) = x np.random.seed(0) t = -50 + 0.01 * np.arange(10000.) x = np.random.random(10000) f, y = FT_continuous(t, x) t, xp = IFT_continuous(f, y) assert_allclose(x, xp, atol=1E-7)
def multiple_power_spectrum(t, x, window_size=10000, step_size=1000): assert x.shape == t.shape assert x.ndim == 1 assert len(x) > window_size N_steps = (len(x) - window_size) // step_size indices = np.arange(window_size) + step_size * np.arange(N_steps)[:, None] X = x[indices].astype(complex) f, H = FT_continuous(t[:window_size], X) i = (f > 0) return f[i], abs(H[:, i])
def update(): global data, ptr, bad #Identify which points to include/exclude goodmask = np.ones(len(data), np.bool) goodmask[bad] = 0 times = np.arange(len(data)) #Placeholder for real timestamps. #Calculate FT #replace bad values with mean if np.sum(goodmask[:ptr]) > 1: tofourier = interp1d(times[goodmask[:ptr]], data[goodmask[:ptr]]) xnew = np.arange(min(times[goodmask[:ptr]]), max(times[goodmask[:ptr]])) ynew = tofourier(xnew) f, H = FT_continuous(xnew, ynew) H = 2 * np.sqrt(H.real**2 + H.imag**2.) / len(ynew) l1.setData(f[len(f) / 2.:], H[len(f) / 2.:])
def check_funcs(t0=1, f0=2, Q=3): t = np.linspace(-5, 5, 10000) h = wavelet(t, t0, f0, Q) f, H = FT_continuous(t, h) assert np.allclose(H, wavelet_FT(f, t0, f0, Q))
#------------------------------------------------------------ # Create the simulated dataset np.random.seed(5) t = np.linspace(-40, 40, 2001)[:-1] h = np.exp(-0.5 * ((t - 20.) / 1.0)**2) hN = h + np.random.normal(0, 0.5, size=h.shape) #------------------------------------------------------------ # Compute the convolution via the continuous Fourier transform # This is more exact than using the discrete transform, because # we have an analytic expression for the FT of the wavelet. Q = 0.3 f0 = 2**np.linspace(-3, -1, 100) f, H = FT_continuous(t, hN) W = np.conj(wavelet_FT(f, 0, f0[:, None], Q)) t, HW = IFT_continuous(f, H * W) #------------------------------------------------------------ # Plot the results fig = plt.figure(figsize=(5, 5)) fig.subplots_adjust(hspace=0.05, left=0.12, right=0.95, bottom=0.08, top=0.95) # First panel: the signal ax = fig.add_subplot(311) ax.plot(t, hN, '-k', lw=1) ax.text(0.02, 0.95, ("Input Signal:\n" "Localized spike plus noise"),
def test_FT_continuous(a, t0, f0, method): t = np.linspace(-9, 10, 10000) h = sinegauss(t, t0, f0, a) f, H = FT_continuous(t, h, method=method) assert_allclose(H, sinegauss_FT(f, t0, f0, a), atol=1E-12)
def test_wavelets(t0, f0, Q): t = np.linspace(-10, 10, 10000) h = sinegauss(t, t0, f0, Q) f, H = FT_continuous(t, h) H2 = sinegauss_FT(f, t0, f0, Q) assert_allclose(H, H2, atol=1E-8)
def check_wavelets(t0, f0, Q, t): h = sinegauss(t, t0, f0, Q) f, H = FT_continuous(t, h) H2 = sinegauss_FT(f, t0, f0, Q) assert_allclose(H, H2, atol=1E-8)
def check_FT_continuous(a, t0, f0, method, t): h = sinegauss(t, t0, f0, a) f, H = FT_continuous(t, h, method=method) assert_allclose(H, sinegauss_FT(f, t0, f0, a), atol=1E-12)
def compute_Wavelet(): from astroML.fourier import FT_continuous, IFT_continuous #---------------------------------------------------------------------- # This function adjusts matplotlib settings for a uniform feel in the textbook. # Note that with usetex=True, fonts are rendered with LaTeX. This may # result in an error if LaTeX is not installed on your system. In that case, # you can set usetex to False. from astroML.plotting import setup_text_plots setup_text_plots(fontsize=8, usetex=False) def wavelet(t, t0, f0, Q): return (np.exp(-(f0 / Q * (t - t0)) ** 2) * np.exp(2j * np.pi * f0 * (t - t0))) def wavelet_FT(f, t0, f0, Q): # this is its fourier transform using # H(f) = integral[ h(t) exp(-2pi i f t) dt] return (np.sqrt(np.pi) * Q / f0 * np.exp(-2j * np.pi * f * t0) * np.exp(-(np.pi * (f - f0) * Q / f0) ** 2)) def check_funcs(t0=1, f0=2, Q=3): t = np.linspace(-5, 5, 10000) h = wavelet(t, t0, f0, Q) f, H = FT_continuous(t, h) assert np.allclose(H, wavelet_FT(f, t0, f0, Q)) #------------------------------------------------------------ # Create the simulated dataset np.random.seed(5) t = np.linspace(-40, 40, 2001)[:-1] h = np.exp(-0.5 * ((t - 20.) / 1.0) ** 2) hN = h + np.random.normal(0, 0.5, size=h.shape) #------------------------------------------------------------ # Compute the convolution via the continuous Fourier transform # This is more exact than using the discrete transform, because # we have an analytic expression for the FT of the wavelet. Q = 0.3 f0 = 2 ** np.linspace(-3, -1, 100) f, H = FT_continuous(t, hN) W = np.conj(wavelet_FT(f, 0, f0[:, None], Q)) t, HW = IFT_continuous(f, H * W) #------------------------------------------------------------ # Plot the results fig = plt.figure(figsize=(5, 5)) fig.subplots_adjust(hspace=0.05, left=0.12, right=0.95, bottom=0.08, top=0.95) # First panel: the signal ax = fig.add_subplot(311) ax.plot(t, hN, '-k', lw=1) ax.text(0.02, 0.95, ("Input Signal:\n" "Localized spike plus noise"), ha='left', va='top', transform=ax.transAxes) ax.set_xlim(-40, 40) ax.set_ylim(-1.2, 2.2) ax.xaxis.set_major_formatter(plt.NullFormatter()) ax.set_ylabel('$h(t)$') # Second panel: the wavelet ax = fig.add_subplot(312) W = wavelet(t, 0, 0.125, Q) ax.plot(t, W.real, '-k', label='real part', lw=1) ax.plot(t, W.imag, '--k', label='imag part', lw=1) ax.legend(loc=1) ax.text(0.02, 0.95, ("Example Wavelet\n" "$t_0 = 0$, $f_0=1/8$, $Q=0.3$"), ha='left', va='top', transform=ax.transAxes) ax.text(0.98, 0.05, (r"$w(t; t_0, f_0, Q) = e^{-[f_0 (t - t_0) / Q]^2}" "e^{2 \pi i f_0 (t - t_0)}$"), ha='right', va='bottom', transform=ax.transAxes) ax.set_xlim(-40, 40) ax.set_ylim(-1.4, 1.4) ax.set_ylabel('$w(t; t_0, f_0, Q)$') ax.xaxis.set_major_formatter(plt.NullFormatter()) # Third panel: the spectrogram ax = fig.add_subplot(313) ax.imshow(abs(HW) ** 2, origin='lower', aspect='auto', cmap=plt.cm.binary, extent=[t[0], t[-1], np.log2(f0)[0], np.log2(f0)[-1]]) ax.set_xlim(-40, 40) ax.text(0.02, 0.95, ("Wavelet PSD"), color='w', ha='left', va='top', transform=ax.transAxes) ax.set_ylim(np.log2(f0)[0], np.log2(f0)[-1]) ax.set_xlabel('$t$') ax.set_ylabel('$f_0$') ax.yaxis.set_major_locator(plt.MultipleLocator(1)) ax.yaxis.set_major_formatter(plt.FuncFormatter(lambda x, *args: ("1/%i" % (2 ** -x)))) plt.show()