def test_setter_fft_norm(): spec_power_unitary = np.atleast_2d([1, 2, 1]) spec_power_amplitude = np.atleast_2d([1 / 4, 2 / 4, 1 / 4]) signal = Signal(spec_power_unitary, 44100, n_samples=4, domain='freq', fft_norm='unitary') # changing the fft_norm also changes the spectrum signal.fft_norm = 'amplitude' assert signal.fft_norm == 'amplitude' npt.assert_allclose(signal.freq, spec_power_amplitude, atol=1e-15) # changing the fft norm in the time domain does not change the time data signal.domain = 'time' time_power_amplitude = signal._data.copy() signal.fft_norm = 'unitary' npt.assert_allclose(signal.time, time_power_amplitude) npt.assert_allclose(signal.freq, spec_power_unitary) # setting an invalid fft_norm with pytest.raises(ValueError): signal.fft_norm = 'bullshit'
def test_get_arithmetic_data_with_signal(): # all possible combinations of `domain`, `signal_type`, and `fft_norm` meta = [['time', None], ['freq', None], ['time', 'unitary'], ['freq', 'unitary'], ['time', 'amplitude'], ['freq', 'amplitude'], ['time', 'rms'], ['freq', 'rms'], ['time', 'power'], ['freq', 'power'], ['time', 'psd'], ['freq', 'psd']] # reference signal - _get_arithmetic_data should return the data without # any normalization regardless of the input data s_ref = Signal([1, 0, 0], 44100) for m_in in meta: # create input signal with current domain, type, and norm s_in = Signal([1, 0, 0], 44100, fft_norm=m_in[1]) s_in.domain = m_in[0] for domain in ['time', 'freq']: print(f"Testing from {m_in[0]} ({m_in[1]}) to {domain}.") # get output data data_out = signal._get_arithmetic_data(s_in, n_samples=3, domain=domain) if domain == 'time': npt.assert_allclose(s_ref.time, data_out, atol=1e-15) elif domain == 'freq': npt.assert_allclose(s_ref.freq, data_out, atol=1e-15)
def test_iter_write(): data = np.ones((3, 1024)) * np.atleast_2d(np.arange(3)).T sig = Signal(data, 1) sig.domain = 'time' for idx, s in enumerate(sig): sig[idx] = s
def test_iter_domain_change(): data = np.ones((3, 1024)) * np.atleast_2d(np.arange(3)).T sig = Signal(data, 1) sig.domain = 'time' with pytest.raises(RuntimeError, match='domain changes'): for s in sig: s.freq
def test_domain_setter_time_when_freq(sine): signal = Signal(sine.freq, sine.sampling_rate, domain='freq', fft_norm=sine.fft_norm) domain = 'time' signal.domain = domain assert signal.domain == domain npt.assert_allclose(signal._data, sine.time, atol=1e-10, rtol=1e-10)
def test_domain_setter_freq_when_time(sine_stub): signal = Signal(sine_stub.time, sine_stub.sampling_rate, domain='time', fft_norm=sine_stub.fft_norm) domain = 'freq' signal.domain = domain assert signal.domain == domain npt.assert_allclose(signal._data, sine_stub.freq, rtol=1e-10, atol=1e-10)
def test_domain_setter_time_when_time(): signal = Signal(np.array([1]), 44100) domain = 'time' signal._domain = domain signal.domain = domain assert signal.domain == domain
def test_domain_setter_freq_when_freq(): signal = Signal(np.array([1]), 44100) domain = 'freq' signal._domain = domain signal.domain = domain assert signal.domain == domain
def test_domain_setter_error(): signal = Signal(np.array([1]), 44100) with pytest.raises(ValueError, match='Incorrect domain'): signal.domain = 'quark'