def test_stockwell_core(): """Test stockwell transform""" # adapted from # http://vcs.ynic.york.ac.uk/docs/naf/intro/concepts/timefreq.html sfreq = 1000.0 # make things easy to understand dur = 0.5 onset, offset = 0.175, 0.275 n_samp = int(sfreq * dur) t = np.arange(n_samp) / sfreq # make an array for time pulse_freq = 15. pulse = np.cos(2. * np.pi * pulse_freq * t) pulse[0:int(onset * sfreq)] = 0. # Zero before our desired pulse pulse[int(offset * sfreq):] = 0. # and zero after our desired pulse width = 0.5 freqs = fftpack.fftfreq(len(pulse), 1. / sfreq) fmin, fmax = 1.0, 100.0 start_f, stop_f = [np.abs(freqs - f).argmin() for f in (fmin, fmax)] W = _precompute_st_windows(n_samp, start_f, stop_f, sfreq, width) st_pulse = _st(pulse, start_f, W) st_pulse = np.abs(st_pulse) ** 2 assert_equal(st_pulse.shape[-1], len(pulse)) st_max_freq = freqs[st_pulse.max(axis=1).argmax(axis=0)] # max freq assert_allclose(st_max_freq, pulse_freq, atol=1.0) assert_true(onset < t[st_pulse.max(axis=0).argmax(axis=0)] < offset) # test inversion to FFT, by averaging local spectra, see eq. 5 in # Moukadem, A., Bouguila, Z., Ould Abdeslam, D. and Alain Dieterlen. # "Stockwell transform optimization applied on the detection of split in # heart sounds." width = 1.0 start_f, stop_f = 0, len(pulse) W = _precompute_st_windows(n_samp, start_f, stop_f, sfreq, width) y = _st(pulse, start_f, W) # invert stockwell y_inv = fftpack.ifft(np.sum(y, axis=1)).real assert_array_almost_equal(pulse, y_inv)
def test_stockwell_core(): """Test stockwell transform.""" # adapted from # http://vcs.ynic.york.ac.uk/docs/naf/intro/concepts/timefreq.html sfreq = 1000.0 # make things easy to understand dur = 0.5 onset, offset = 0.175, 0.275 n_samp = int(sfreq * dur) t = np.arange(n_samp) / sfreq # make an array for time pulse_freq = 15. pulse = np.cos(2. * np.pi * pulse_freq * t) pulse[0:int(onset * sfreq)] = 0. # Zero before our desired pulse pulse[int(offset * sfreq):] = 0. # and zero after our desired pulse width = 0.5 freqs = fftpack.fftfreq(len(pulse), 1. / sfreq) fmin, fmax = 1.0, 100.0 start_f, stop_f = [np.abs(freqs - f).argmin() for f in (fmin, fmax)] W = _precompute_st_windows(n_samp, start_f, stop_f, sfreq, width) st_pulse = _st(pulse, start_f, W) st_pulse = np.abs(st_pulse)**2 assert_equal(st_pulse.shape[-1], len(pulse)) st_max_freq = freqs[st_pulse.max(axis=1).argmax(axis=0)] # max freq assert_allclose(st_max_freq, pulse_freq, atol=1.0) assert (onset < t[st_pulse.max(axis=0).argmax(axis=0)] < offset) # test inversion to FFT, by averaging local spectra, see eq. 5 in # Moukadem, A., Bouguila, Z., Ould Abdeslam, D. and Alain Dieterlen. # "Stockwell transform optimization applied on the detection of split in # heart sounds." width = 1.0 start_f, stop_f = 0, len(pulse) W = _precompute_st_windows(n_samp, start_f, stop_f, sfreq, width) y = _st(pulse, start_f, W) # invert stockwell y_inv = fftpack.ifft(np.sum(y, axis=1)).real assert_array_almost_equal(pulse, y_inv)
def test_stockwell_core(): """Test stockwell transform""" # taken from # http://vcs.ynic.york.ac.uk/docs/naf/intro/concepts/timefreq.html sfreq = 1000.0 # make things easy to understand t = np.arange(sfreq) # make an array for time t /= sfreq # scale it so it goes to 1, i.e. 1 sec of time pulse_freq = 15. pulse = np.cos(2. * np.pi * pulse_freq * t) pulse[0:175] = 0. # Zero before our desired pulse pulse[275:] = 0. # and zero after our desired pulse width = 0.5 freqs = fftpack.fftfreq(len(pulse), 1. / sfreq) fmin, fmax = 1.0, 100.0 start_f, stop_f = [np.abs(freqs - f).argmin() for f in (fmin, fmax)] st_precomputed = _precompute_st_windows(1000, start_f, stop_f, sfreq, width) st_pulse = _st(pulse, *st_precomputed) st_pulse = np.abs(st_pulse) ** 2 assert_equals(st_pulse.shape[-1], len(pulse)) st_max_freq = st_pulse.max(axis=1).argmax(axis=0) # max freq assert_equals(st_max_freq, pulse_freq) assert_true(175 < st_pulse.max(axis=0).argmax(axis=0) < 275) # max time # test inversion to FFT, by averaging local spectra, see eq. 5 in # Moukadem, A., Bouguila, Z., Ould Abdeslam, D. and Alain Dieterlen. # "Stockwell transform optimization applied on the detection of split in # heart sounds." width = 1.0 start_f, stop_f = 0, len(pulse) st_precomputed = _precompute_st_windows(1000, start_f, stop_f, sfreq, width) y = _st(pulse, *st_precomputed) # invert stockwell y_inv = fftpack.ifft(np.sum(y, axis=1)).real assert_array_almost_equal(pulse, y_inv)