Ejemplo n.º 1
0
    def test_not_equal_when_scale_differs(self):
        fb1 = FrequencyBand(20, 20000)
        scale1 = LinearScale(fb1, 100)

        fb2 = FrequencyBand(20, 20000)
        scale2 = GeometricScale(20, 20000, 0.01, 100)

        self.assertNotEqual(scale1, scale2)
Ejemplo n.º 2
0
    def test_not_equal_when_bands_differ(self):
        fb1 = FrequencyBand(20, 20000)
        scale1 = LinearScale(fb1, 100)

        fb2 = FrequencyBand(20, 20000)
        scale2 = LinearScale(fb2, 50)

        self.assertNotEqual(scale1, scale2)
Ejemplo n.º 3
0
    def test_equals(self):
        fb1 = FrequencyBand(20, 20000)
        scale1 = LinearScale(fb1, 100)

        fb2 = FrequencyBand(20, 20000)
        scale2 = LinearScale(fb2, 100)

        self.assertEqual(scale1, scale2)
Ejemplo n.º 4
0
 def test_can_slice_frequency_dim_with_negative_stop_hz(self):
     scale = LinearScale(FrequencyBand(0, 100), 10)
     arr = ArrayWithUnits(
         np.zeros((13, 10)),
         [IdentityDimension(), FrequencyDimension(scale)])
     sliced = arr[:, :-Hertz(20)]
     self.assertEqual((13, 8), sliced.shape)
     self.assertEqual(
         FrequencyDimension(LinearScale(FrequencyBand(0, 80), 8)),
         sliced.dimensions[-1])
Ejemplo n.º 5
0
 def test_can_access_int_index_and_frequency_band(self):
     tf = ArrayWithUnits(
         np.ones((10, 10)),
         dimensions=[
             TimeDimension(Seconds(1), Seconds(1)),
             FrequencyDimension(LinearScale(FrequencyBand(0, 1000), 10))
         ])
     sliced = tf[0, FrequencyBand(201, 400)]
     self.assertEqual((2,), sliced.shape)
     self.assertIsInstance(sliced.dimensions[0], FrequencyDimension)
Ejemplo n.º 6
0
 def test_ellipsis(self):
     scale = LinearScale(FrequencyBand(0, 10000), 100)
     arr = ArrayWithUnits(
         np.zeros((10, 3, 100)),
         [IdentityDimension(),
          TimeDimension(Seconds(1)),
          FrequencyDimension(scale)])
     sliced = arr[..., FrequencyBand(1000, 5000)]
     self.assertEqual((10, 3, 41), sliced.shape)
     self.assertIsInstance(sliced.dimensions[0], IdentityDimension)
     self.assertIsInstance(sliced.dimensions[1], TimeDimension)
     self.assertIsInstance(sliced.dimensions[2], FrequencyDimension)
Ejemplo n.º 7
0
 def test_can_slice_freq_dimension_with_freq_band_spanning_bins(self):
     frequency = Seconds(1)
     duration = Seconds(1)
     scale = LinearScale(FrequencyBand(20, 22050), 100)
     td = TimeDimension(frequency, duration)
     fd = FrequencyDimension(scale)
     tf = ArrayWithUnits(np.zeros((30, 100)), [td, fd])
     bands = list(scale)
     wide_band = FrequencyBand(bands[0].start_hz, bands[9].stop_hz)
     sliced = tf[:, wide_band]
     self.assertEqual((30, 10), sliced.shape)
     self.assertIsInstance(sliced, ArrayWithUnits)
Ejemplo n.º 8
0
 def test_scale_is_modified_after_slice(self):
     frequency = Seconds(1)
     duration = Seconds(1)
     scale = LinearScale(FrequencyBand(20, 22050), 100)
     td = TimeDimension(frequency, duration)
     fd = FrequencyDimension(scale)
     tf = ArrayWithUnits(np.zeros((30, 100)), [td, fd])
     bands = list(scale)
     wide_band = FrequencyBand(bands[0].start_hz, bands[9].stop_hz)
     sliced = tf[:, wide_band]
     self.assertEqual((30, 10), sliced.shape)
     self.assertIsInstance(sliced, ArrayWithUnits)
     self.assertLess(sliced.dimensions[1].scale.stop_hz, scale.stop_hz)
     self.assertEqual(10, sliced.dimensions[1].scale.n_bands)
Ejemplo n.º 9
0
 def test_can_apply_weighting_to_filter_bank(self):
     sr = SR11025()
     band = FrequencyBand(20, sr.nyquist)
     scale = MelScale(band, 100)
     bank = fir_filter_bank(scale, 256, sr, np.hanning(25))
     weighted = bank * AWeighting()
     self.assertSequenceEqual(bank.dimensions, weighted.dimensions)
Ejemplo n.º 10
0
 def test_can_invert_frequency_weighting(self):
     td = TimeDimension(Seconds(1), Seconds(1))
     fd = FrequencyDimension(LinearScale(FrequencyBand(20, 22050), 100))
     tf = ArrayWithUnits(np.random.random_sample((90, 100)), [td, fd])
     weighted = tf * AWeighting()
     inverted = weighted / AWeighting()
     np.testing.assert_allclose(tf, inverted)
Ejemplo n.º 11
0
 def test_can_slice_frequency_dim_with_start_and_end_hz(self):
     scale = LinearScale(FrequencyBand(0, 100), 10)
     arr = ArrayWithUnits(
         np.zeros((13, 10)),
         [IdentityDimension(), FrequencyDimension(scale)])
     sliced = arr[:, Hertz(20):Hertz(80)]
     self.assertEqual((13, 7), sliced.shape)
Ejemplo n.º 12
0
def frequency_decomposition(x, sizes):
    sizes = sorted(sizes)

    if x.ndim == 1:
        end = x.dimensions[0].end
        x = ArrayWithUnits(x[None, ...],
                           [TimeDimension(end, end), x.dimensions[0]])

    original_size = x.shape[-1]
    time_dimension = x.dimensions[-1]
    samplerate = audio_sample_rate(time_dimension.samples_per_second)
    data = x.copy()

    bands = []
    frequency_bands = []
    start_hz = 0

    for size in sizes:
        if size != original_size:
            s = resample(data, size, axis=-1)
        else:
            s = data.copy()

        bands.append(s)
        data -= resample(s, original_size, axis=-1)

        stop_hz = samplerate.nyquist * (size / original_size)
        frequency_bands.append(FrequencyBand(start_hz, stop_hz))
        start_hz = stop_hz

    scale = ExplicitScale(frequency_bands)
    return FrequencyAdaptive(bands,
                             scale=scale,
                             time_dimension=x.dimensions[0])
Ejemplo n.º 13
0
 def test_can_apply_a_weighting_to_time_frequency_representation(self):
     td = TimeDimension(Seconds(1), Seconds(1))
     fd = FrequencyDimension(LinearScale(FrequencyBand(20, 22050), 100))
     tf = ArrayWithUnits(np.ones((90, 100)), [td, fd])
     weighting = AWeighting()
     result = tf * weighting
     self.assertGreater(result[0, -1], result[0, 0])
Ejemplo n.º 14
0
 def test_slicing_geometric_scale_returns_explicit_scale(self):
     scale = GeometricScale(start_center_hz=20,
                            stop_center_hz=5000,
                            bandwidth_ratio=0.05,
                            n_bands=100)
     sliced = scale[FrequencyBand(100, 1000)]
     self.assertIsInstance(sliced, ExplicitScale)
Ejemplo n.º 15
0
    def test_can_multiply_by_frequency_weighting_linear_scale(self):
        frequency = Seconds(1)
        duration = Seconds(1)
        scale = LinearScale(FrequencyBand(20, 22050), 100)

        td = TimeDimension(frequency, duration)
        fd = FrequencyDimension(scale)

        tf = ArrayWithUnits(np.ones((30, 100)), [td, fd])
        result = tf * AWeighting()
        self.assertIsInstance(result, ArrayWithUnits)
        peak_frequency_band = FrequencyBand(9000, 11000)
        lower_band = FrequencyBand(100, 300)
        peak_slice = np.abs(result[:, peak_frequency_band]).max()
        lower_slice = np.abs(result[:, lower_band]).max()
        self.assertGreater(peak_slice, lower_slice)
Ejemplo n.º 16
0
 def test_from_example(self):
     td = TimeDimension(Seconds(1), Seconds(1))
     fd = FrequencyDimension(LinearScale(FrequencyBand(20, 22050), 100))
     tf = ArrayWithUnits(np.ones((30, 100)), [td, fd])
     from_example = ArrayWithUnits.from_example(np.ones((30, 100)), tf)
     self.assertEqual(tf.shape, from_example.shape)
     self.assertItemsEqual(tf.dimensions, from_example.dimensions)
Ejemplo n.º 17
0
 def test_can_get_weights_from_tf_representation(self):
     td = TimeDimension(Seconds(1), Seconds(1))
     fd = FrequencyDimension(LinearScale(FrequencyBand(20, 22050), 100))
     tf = ArrayWithUnits(np.ones((90, 100)), [td, fd])
     weighting = AWeighting()
     weights = weighting.weights(tf)
     self.assertEqual((100, ), weights.shape)
Ejemplo n.º 18
0
 def test_metaslice(self):
     scale1 = GeometricScale(20, 5000, 0.02, 3)
     bands = list(scale1)
     slices1 = [slice(0, 10), slice(10, 100), slice(100, 1000)]
     dim1 = ExplicitFrequencyDimension(scale1, slices1)
     dim2 = dim1.metaslice(FrequencyBand(15, 1000), 2)
     self.assertEqual(bands[:2], list(dim2.scale)[:2])
     self.assertEqual(slices1[:2], dim2.slices[:2])
Ejemplo n.º 19
0
 def test_can_construct_instance(self):
     frequency = Seconds(1)
     duration = Seconds(1)
     scale = LinearScale(FrequencyBand(20, 22050), 100)
     td = TimeDimension(frequency, duration)
     fd = FrequencyDimension(scale)
     tf = ArrayWithUnits(np.zeros((30, 100)), [td, fd])
     self.assertIsInstance(tf, ArrayWithUnits)
Ejemplo n.º 20
0
 def test_sum_along_frequency_axis(self):
     td = TimeDimension(Seconds(1), Seconds(1))
     fd = FrequencyDimension(LinearScale(FrequencyBand(20, 22050), 100))
     tf = ArrayWithUnits(np.ones((30, 100)), [td, fd])
     result = tf.sum(axis=1)
     self.assertIsInstance(result, ArrayWithUnits)
     self.assertEqual(1, len(result.dimensions))
     self.assertEqual((30,), result.shape)
     self.assertIsInstance(result.dimensions[0], TimeDimension)
Ejemplo n.º 21
0
 def test_can_use_negative_axis_indices_max(self):
     td = TimeDimension(Seconds(1), Seconds(1))
     fd = FrequencyDimension(LinearScale(FrequencyBand(20, 22050), 100))
     tf = ArrayWithUnits(np.ones((30, 100)), [td, fd])
     result = tf.max(axis=-1)
     self.assertIsInstance(result, ArrayWithUnits)
     self.assertEqual(1, len(result.dimensions))
     self.assertEqual((30,), result.shape)
     self.assertIsInstance(result.dimensions[0], TimeDimension)
Ejemplo n.º 22
0
 def test_can_slice_frequency_dimension_with_integer_indices(self):
     frequency = Seconds(1)
     duration = Seconds(1)
     scale = LinearScale(FrequencyBand(20, 22050), 100)
     td = TimeDimension(frequency, duration)
     fd = FrequencyDimension(scale)
     tf = ArrayWithUnits(np.zeros((30, 100)), [td, fd])
     sliced = tf[:, 10: 20]
     self.assertEqual((30, 10), sliced.shape)
     self.assertIsInstance(sliced, ArrayWithUnits)
Ejemplo n.º 23
0
 def test_can_multiply_by_array(self):
     frequency = Seconds(1)
     duration = Seconds(1)
     scale = LinearScale(FrequencyBand(20, 22050), 100)
     td = TimeDimension(frequency, duration)
     fd = FrequencyDimension(scale)
     tf = ArrayWithUnits(np.ones((30, 100)), [td, fd])
     result = tf * np.ones(100)
     self.assertIsInstance(result, ArrayWithUnits)
     np.testing.assert_allclose(tf, result)
Ejemplo n.º 24
0
 def test_can_access_time_slice_and_int_index(self):
     tf = ArrayWithUnits(
         np.ones((10, 10)),
         dimensions=[
             TimeDimension(Seconds(1), Seconds(1)),
             FrequencyDimension(LinearScale(FrequencyBand(0, 1000), 10))
         ])
     sliced = tf[TimeSlice(start=Seconds(1), duration=Seconds(2)), 0]
     self.assertEqual((2,), sliced.shape)
     self.assertIsInstance(sliced.dimensions[0], TimeDimension)
Ejemplo n.º 25
0
 def test_can_use_keepdims_with_sum(self):
     td = TimeDimension(Seconds(1), Seconds(1))
     fd = FrequencyDimension(LinearScale(FrequencyBand(20, 22050), 100))
     tf = ArrayWithUnits(np.ones((30, 100)), [td, fd])
     result = tf.sum(axis=-1, keepdims=True)
     self.assertIsInstance(result, ArrayWithUnits)
     self.assertEqual(2, len(result.dimensions))
     self.assertEqual((30, 1), result.shape)
     self.assertIsInstance(result.dimensions[0], TimeDimension)
     self.assertIsInstance(result.dimensions[1], IdentityDimension)
Ejemplo n.º 26
0
    def test_raises_if_scale_length_does_not_match_frequency_dimension(self):
        frequency = Seconds(1)
        duration = Seconds(1)
        scale = LinearScale(FrequencyBand(20, 22050), 1000)

        td = TimeDimension(frequency, duration)
        fd = FrequencyDimension(scale)

        self.assertRaises(
            ValueError,
            lambda: ArrayWithUnits(np.ones((30, 100)), [td, fd]))
Ejemplo n.º 27
0
 def test_can_add_axis_at_end(self):
     _id = IdentityDimension()
     td = TimeDimension(Seconds(1), Seconds(1))
     fd = FrequencyDimension(LinearScale(FrequencyBand(20, 22050), 100))
     tf = ArrayWithUnits(np.ones((3, 30, 100)), [_id, td, fd])
     tf2 = tf[..., None]
     self.assertEqual(4, tf2.ndim)
     self.assertIsInstance(tf2.dimensions[0], IdentityDimension)
     self.assertIsInstance(tf2.dimensions[1], TimeDimension)
     self.assertIsInstance(tf2.dimensions[2], FrequencyDimension)
     self.assertIsInstance(tf2.dimensions[3], IdentityDimension)
Ejemplo n.º 28
0
 def test_can_use_tuple_indices_for_first_dimension(self):
     tf = ArrayWithUnits(
         np.ones((10, 10)),
         dimensions=[
             TimeDimension(Seconds(1), Seconds(1)),
             FrequencyDimension(LinearScale(FrequencyBand(0, 1000), 10))
         ])
     subset = tf[tuple([2, 4, 6]), ...]
     self.assertEqual((3, 10), subset.shape)
     self.assertIsInstance(subset, ArrayWithUnits)
     self.assertIsInstance(subset.dimensions[0], TimeDimension)
     self.assertIsInstance(subset.dimensions[1], FrequencyDimension)
Ejemplo n.º 29
0
 def test_can_iterate_over_time_frequency_representation(self):
     tf = ArrayWithUnits(
         np.ones((10, 10)),
         dimensions=[
             TimeDimension(Seconds(1), Seconds(1)),
             FrequencyDimension(LinearScale(FrequencyBand(0, 1000), 10))
         ])
     rows = [row for row in tf]
     self.assertEqual(10, len(rows))
     for row in rows:
         self.assertIsInstance(row, ArrayWithUnits)
         self.assertIsInstance(row.dimensions[0], FrequencyDimension)
         self.assertEqual((10,), row.shape)
Ejemplo n.º 30
0
    def test_can_apply_sliding_window(self):
        sr = SR11025()
        hl = sr.half_lapped()
        scale = GeometricScale(20, sr.nyquist, 0.175, 64)
        td = TimeDimension(frequency=hl.frequency, duration=hl.duration)
        fd = FrequencyDimension(scale)

        arr = ArrayWithUnits(np.zeros((99, 64)), [td, fd])

        ts = TimeSlice(duration=hl.frequency * 64)
        fs = FrequencyBand(0, sr.nyquist)

        windowed = arr.sliding_window((ts, fs))
        self.assertEqual((1, 64, 64), windowed.shape)