def test_magic_setitem_wrong_norm(): """Test the magic function __setitem__.""" signal = Signal([1, 2, 3], 44100, fft_norm='none') set_signal = Signal([1, 2, 3], 44100, fft_norm='rms') with pytest.raises(ValueError, match='FFT norms do not match'): signal[0] = set_signal
def test_dtype(sine): """Test for the getter od dtype.""" dtype = np.float64 signal = Signal(sine.time, sine.sampling_rate, dtype=dtype) assert signal.dtype == dtype
def test_cshape(sine_two_by_two_channel): """Test the attribute cshape.""" signal = Signal(sine_two_by_two_channel.time, sine_two_by_two_channel.sampling_rate) assert signal.cshape == sine_two_by_two_channel.cshape
def test_re_setter_freq(): """Test the warning for estimating the number of samples from n_bins.""" signal = Signal([1, 2, 3], 44100, domain='freq', n_samples=4) with pytest.warns(UserWarning): signal.freq = [1, 2, 3, 4]
def test_setter_sampligrate(sine): """Test if attribute sampling rate is set correctly.""" signal = Signal(sine.time, sine.sampling_rate) signal.sampling_rate = 1000 assert signal._sampling_rate == 1000
def test_setter_time(sine, impulse): """Test if attribute time is set correctly.""" signal = Signal(sine.time, sine.sampling_rate) signal.time = impulse.time assert signal._domain == 'time' npt.assert_allclose(signal._data, impulse.time)
def test_getter_freq(sine, impulse): """Test if attribute freq is accessed correctly.""" signal = Signal(sine.time, sine.sampling_rate, fft_norm='rms') signal._domain = 'freq' signal._data = impulse.freq npt.assert_allclose(signal.freq, impulse.freq)
def test_domain_getter_time(): signal = Signal(np.array([1]), 44100) signal._domain = 'time' assert signal.domain == 'time'
def test_domain_setter_error(): signal = Signal(np.array([1]), 44100) with pytest.raises(ValueError, match='Incorrect domain'): signal.domain = 'quark'
def test_domain_getter_freq(): signal = Signal(np.array([1]), 44100) signal._domain = 'freq' assert signal.domain == 'freq'
def test___eq___equal(): signal = Signal([1, 2, 3], 44100) actual = Signal([1, 2, 3], 44100) assert signal == actual
def test_magic_len(): """Test the magic function __len__.""" signal = Signal([1, 2, 3], 44100) assert len(signal) == 3
def test_magic_setitem_wrong_n_samples(): """Test the magic function __setitem__.""" signal = Signal([1, 2, 3, 4], 44100) set_signal = Signal([1, 2, 3], 44100) with pytest.raises(ValueError, match='number of samples does not match'): signal[0] = set_signal
def test_signal_comment(): signal = Signal([1, 2, 3], 44100, comment='Bla') assert signal.comment == 'Bla' signal.comment = 'Blub' assert signal.comment == 'Blub'
def test_times(sine): """Test for the time instances.""" signal = Signal(sine.time, sine.sampling_rate, domain='time') npt.assert_allclose(signal.times, sine.times)
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_getter_time(sine, impulse): """Test if attribute time is accessed correctly.""" signal = Signal(sine.time, sine.sampling_rate) signal._domain = 'time' signal._data = impulse.time npt.assert_allclose(signal.time, impulse.time)
def test_signal_init(): """Test to init Signal without optional parameters.""" signal = Signal(np.array([1., 2., 3.]), 44100) assert isinstance(signal, Signal)
def test_signal_init_list(sine): signal = Signal(sine.time.tolist(), sine.sampling_rate, domain='time') assert isinstance(signal, Signal)
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_setter_freq(sine, impulse): """Test if attribute freq is set correctly.""" signal = Signal(sine.time, sine.sampling_rate) signal.freq = impulse.freq assert signal.domain == 'freq' npt.assert_allclose(signal._data, impulse.freq)
def test_signal_init_val(): """Test to init Signal with complete parameters.""" signal = Signal([1, 2, 3], 44100, domain='time', fft_norm='none') assert isinstance(signal, Signal)
def test_getter_sampling_rate(sine): """Test if attribute sampling rate is accessed correctly.""" signal = Signal(sine, sine.sampling_rate) signal._sampling_rate = 1000 assert signal.sampling_rate == 1000
def test_n_samples(): """Test for number of samples.""" signal = Signal([1, 2, 3], 44100, domain='time') assert signal.n_samples == 3
def test_getter_fft_norm(sine): signal = Signal(sine.time, sine.sampling_rate, fft_norm='psd') assert signal.fft_norm == 'psd'
def read_sofa(filename): """ Import a SOFA file as :py:class:`~pyfar.classes.audio.Signal` object. Parameters ---------- filename : string, Path Input SOFA file (cf. [#]_, [#]_). Returns ------- signal : Signal :py:class:`~pyfar.classes.audio.Signal` object containing the data stored in `SOFA_Object.Data.IR`. `cshape` is equal to ``(number of measurements, number of receivers)``. source_coordinates : Coordinates Coordinates object containing the data stored in `SOFA_object.SourcePosition`. The domain, convention and unit are automatically matched. receiver_coordinates : Coordinates Coordinates object containing the data stored in `SOFA_object.RecevierPosition`. The domain, convention and unit are automatically matched. Notes ----- * This function is based on the python-sofa [#]_. * Currently, only SOFA files of `DataType` ``FIR`` are supported. References ---------- .. [#] https://www.sofaconventions.org .. [#] “AES69-2015: AES Standard for File Exchange-Spatial Acoustic Data File Format.”, 2015. .. [#] https://github.com/spatialaudio/python-sofa """ sofafile = sofa.Database.open(filename) # Check for DataType if sofafile.Data.Type == 'FIR': domain = 'time' data = np.asarray(sofafile.Data.IR) sampling_rate = sofafile.Data.SamplingRate.get_values() # Check for units if sofafile.Data.SamplingRate.Units != 'hertz': raise ValueError( "SamplingRate:Units" "{sofafile.Data.SamplingRate.Units} is not supported.") else: raise ValueError("DataType {sofafile.Data.Type} is not supported.") signal = Signal(data, sampling_rate, domain=domain) # Source s_values = sofafile.Source.Position.get_values() s_domain, s_convention, s_unit = _sofa_pos(sofafile.Source.Position.Type) source_coordinates = Coordinates( s_values[:, 0], s_values[:, 1], s_values[:, 2], domain=s_domain, convention=s_convention, unit=s_unit) # Receiver r_values = sofafile.Receiver.Position.get_values() r_domain, r_convention, r_unit = _sofa_pos(sofafile.Receiver.Position.Type) receiver_coordinates = Coordinates( r_values[:, 0], r_values[:, 1], r_values[:, 2], domain=r_domain, convention=r_convention, unit=r_unit) return signal, source_coordinates, receiver_coordinates
def test_signal_length(sine): """Test for the signal length.""" signal = Signal(sine.time, sine.sampling_rate) assert signal.signal_length == sine.times[-1]
def test_n_bins(sine): """Test for number of freq bins.""" signal = Signal(sine.time, sine.sampling_rate, domain='time') assert signal.n_bins == sine.n_bins
def test_magic_getitem_slice(sine_two_by_two_channel): """Test slicing operations by the magic function __getitem__.""" signal = Signal(sine_two_by_two_channel.time, sine_two_by_two_channel.sampling_rate, domain='time') npt.assert_allclose(signal[:1]._data, sine_two_by_two_channel.time[:1])
def test_magic_setitem_wrong_sr(): """Test the magic function __setitem__.""" signal = Signal([1, 2, 3], 44100) set_signal = Signal([1, 2, 3], 48000) with pytest.raises(ValueError, match='sampling rates do not match'): signal[0] = set_signal