Exemplo n.º 1
0
def test_Morlet():
    """Compare against \Psi_0(0) in Table 2 of TC98.

    Value at frequency = 0 should be 0.
    """
    npt.assert_almost_equal(wavelets.Morlet()(0), np.pi**-.25, 3)
    npt.assert_almost_equal(wavelets.Morlet().frequency(0), 0, 6)
Exemplo n.º 2
0
def compare_morlet(N=2000):
    """Compare scipy morlet with my morlet (same, but correct
    argument order).
    """
    data = np.random.random(N)
    wave_anal = WaveletAnalysis(data, wavelet='ricker')
    scales = wave_anal.scales[::-1]

    cwt = wavelets.cwt
    cwt_sp = cwt(data, scipy.signal.morlet, scales)
    cwt_me = cwt(data, wavelets.Morlet(), scales)
    cwt_ri = cwt(data, scipy.signal.ricker, scales)

    t = np.indices(data.shape)
    T, S = np.meshgrid(t, scales)

    fig, ax = plt.subplots(nrows=3)

    ax[0].set_title('Scipy morlet')
    ax[0].contourf(T, S, cwt_sp, 100)

    ax[1].set_title('My morlet')
    ax[1].contourf(T, S, cwt_me, 100)

    ax[2].set_title('Scipy Ricker')
    ax[2].contourf(T, S, cwt_ri, 100)

    fig.tight_layout()

    return fig
Exemplo n.º 3
0
    def wavelet(self, ax):
        ax.set_title('Wavelet power spectrum (morlet)')
        ax.set_xlabel('time after front passage (s)')
        ax.set_ylabel('equivalent fourier frequency (Hz)')

        sig = self.u[20, 20, :]
        wa = wavelets.WaveletAnalysis(sig, dt=0.01, wavelet=wavelets.Morlet(),
                                      unbias=True)

        fourier_freqs = 1 / wa.fourier_periods

        T, S = np.meshgrid(wa.time, fourier_freqs)

        contourf = ax.contourf(T, S, wa.wavelet_power, 100)

        # shade the region between the edge and coi
        C, S = wa.coi
        # fourier period
        Fp = wa.fourier_period(S)
        # fourier freqs
        Ff = 1 / Fp
        ff_min = fourier_freqs.min()
        ax.fill_between(x=C, y1=Ff, y2=ff_min, color='gray', alpha=0.3)

        ax.set_yscale('log')

        return contourf
Exemplo n.º 4
0
def plot_morlet():
    """
    TODO: make a pretty plot of the morlet for the README
    """
    morlet = wavelets.Morlet().time
    s = 1
    T = np.linspace(-5 * s, 5 * s, 200)
    Y = morlet(T, s=s)

    f, a = plt.subplots()
    a.plot(T, Y, 'k')
    a.set_title('Morlet wavelet')
    a.set_xlabel('t / s')

    f.savefig('morlet.png')
Exemplo n.º 5
0
def test_fourier_frequencies():
    # Just some signal, no special meaning
    dt = .1
    x = np.arange(5000) * dt
    signal = np.cos(1. * x) + np.cos(2. * x) + np.cos(3. * x)

    wa = WaveletAnalysis(signal,
                         dt=dt,
                         wavelet=wavelets.Morlet(),
                         unbias=False)
    # Set frequencies and check if they match when retrieving them again
    frequencies = np.linspace(1., 100., 100)
    wa.fourier_frequencies = frequencies
    npt.assert_array_almost_equal(wa.fourier_frequencies, frequencies)
    # Check periods
    npt.assert_array_almost_equal(wa.fourier_periods, 1. / frequencies)

    # Set periods and re-check
    wa.fourier_periods = 1. / frequencies
    npt.assert_array_almost_equal(wa.fourier_frequencies, frequencies)
    npt.assert_array_almost_equal(wa.fourier_periods, 1. / frequencies)
elif source == 1:
    Un = 'current.dat'
elif source == 2:
    Un = Jfile

eJ = []
with open(file_path + Un, 'r') as f:
    info = f.readlines()
for i in info:
    eJ.append(float(i.split()[0]))
eJ = np.array(eJ)
at = np.gradient(eJ, delta)[::take]
tc = np.linspace(0., laser.cycles, len(at))

if wvlet == 'Morlet':
    wave = wavelets.Morlet(w0=w0)
elif wvlet == 'Paul':
    wave = wavelets.Paul(m=m)
elif wvlet == 'DOG':
    wave = wavelets.DOG(m=m)
elif wvlet == 'Ricker' or wvlet == 'Marr' or wvlet == 'Mexican_hat':
    wave = wavelets.Ricker()
else:
    print('Invalid choice of wavelet')

analysis = transform.WaveletAnalysis(data=at,
                                     time=tc,
                                     dt=delta * take,
                                     dj=dj,
                                     wavelet=wave,
                                     unbias=unbias,
Exemplo n.º 7
0
    2 * np.pi * fbasal2 * time)
x += np.random.normal(size=len(x)) * ampruido

x2 = 1.2 * np.cos(2 * np.pi * 0.8 *
                  (time - chrpini)**2) * (time - chrpini) * np.exp(
                      -(time - chrpini) / 10)
x2[(time < chrpini) + (time > chrpstp)] = 0
x += x2

#%%  Wavelet transfom - linearly spaced scales

desiredFreq = np.arange(1, 40, 0.2)  # Frequencies we want to analyse
desiredPeriods = 1 / (desiredFreq * dt)
scales = desiredPeriods / wavelets.Morlet.fourierwl  # scales

wavel1 = wavelets.Morlet(x, scales=scales)

pwr1 = np.sqrt(wavel1.getnormpower())  # Normalized power

fmin = min(desiredFreq)
fmax = max(desiredFreq)

#%% Plot the results  -  add a spectrogram for comparison

plt.figure(1, figsize=(12, 4))
plt.clf()
plt.subplot(311)
plt.plot(time, x, alpha=1)
plt.xlabel('Time (s)')
plt.xlim((0, 50))
Exemplo n.º 8
0
 def __init__(self, **kwargs):
     super(MorletTransform, self).__init__(**kwargs)
     self.wavelet = wavelets.Morlet()
Exemplo n.º 9
0
def test_power_bias():
    """See if the global wavelet spectrum is biased or not.

    Wavelet transform a signal of 3 distinct Fourier frequencies.

    The power spectrum should contain peaks at the frequencies, all
    of which should be the same height.
    """
    dt = 0.1
    x = np.arange(5000) * dt

    T1 = 20 * dt
    T2 = 100 * dt
    T3 = 500 * dt

    w1 = 2 * np.pi / T1
    w2 = 2 * np.pi / T2
    w3 = 2 * np.pi / T3

    signal = np.cos(w1 * x) + np.cos(w2 * x) + np.cos(w3 * x)

    wa = WaveletAnalysis(signal,
                         dt=dt,
                         wavelet=wavelets.Morlet(),
                         unbias=False)

    power_biased = wa.global_wavelet_spectrum
    wa.unbias = True
    power = wa.global_wavelet_spectrum
    wa.mask_coi = True
    power_coi = wa.global_wavelet_spectrum

    freqs = wa.fourier_periods

    fig, ax = plt.subplots(nrows=2)

    ax_transform = ax[0]
    fig_info = (r"Wavelet transform of "
                r"$cos(2 \pi / {T1}) + cos(2 \pi / {T2}) + cos(2 \pi / {T3})$")
    ax_transform.set_title(fig_info.format(T1=T1, T2=T2, T3=T3))
    X, Y = np.meshgrid(wa.time, wa.fourier_periods)
    ax_transform.set_xlabel('time')
    ax_transform.set_ylabel('fourier period')
    ax_transform.set_ylim(10 * dt, 1000 * dt)
    ax_transform.set_yscale('log')
    ax_transform.contourf(X, Y, wa.wavelet_power, 100)

    # shade the region between the edge and coi
    C, S = wa.coi
    F = wa.fourier_period(S)
    f_max = F.max()
    ax_transform.fill_between(x=C, y1=F, y2=f_max, color='gray', alpha=0.3)

    ax_power = ax[1]
    ax_power.set_title('Global wavelet spectrum '
                       '(estimator for power spectrum)')
    ax_power.plot(freqs, power, 'k', label=r'unbiased all domain')
    ax_power.plot(freqs, power_coi, 'g', label=r'unbiased coi only')
    ax_power.set_xscale('log')
    ax_power.set_xlim(10 * dt, wa.time.max())
    ax_power.set_xlabel('fourier period')
    ax_power.set_ylabel(r'power / $\sigma^2$  (bias corrected)')

    ax_power_bi = ax_power.twinx()
    ax_power_bi.plot(freqs, power_biased, 'r', label='biased all domain')
    ax_power_bi.set_xlim(10 * dt, wa.time.max())
    ax_power_bi.set_ylabel(r'power / $\sigma^2$  (bias uncorrected)')
    ax_power_bi.set_yticklabels(ax_power_bi.get_yticks(), color='r')

    label = "T={0}"
    for T in (T1, T2, T3):
        ax_power.axvline(T)
        ax_power.annotate(label.format(T), (T, 1))

    ax_power.legend(fontsize='x-small', loc='lower right')
    ax_power_bi.legend(fontsize='x-small', loc='upper right')

    fig.tight_layout()
    fig.savefig('tests/test_power_bias.png')

    return fig