changeset 94:c3318a95625b

Return step as well
author Chris Cannam
date Mon, 02 Feb 2015 16:32:44 +0000
parents 4bed6bf67243
children 3e5791890b65
files test/test_collect.py vamp/collect.py
diffstat 2 files changed, 25 insertions(+), 15 deletions(-) [+]
line wrap: on
line diff
--- a/test/test_collect.py	Mon Feb 02 16:08:42 2015 +0000
+++ b/test/test_collect.py	Mon Feb 02 16:32:44 2015 +0000
@@ -22,12 +22,13 @@
 
 def test_collect_runs_at_all():
     buf = input_data(blocksize * 10)
-    results = list(vamp.collect(buf, rate, plugin_key, "input-timestamp"))
+    step, results = vamp.collect(buf, rate, plugin_key, "input-timestamp")
     assert results != []
 
 def test_collect_one_sample_per_step():
     buf = input_data(blocksize * 10)
-    results = list(vamp.collect(buf, rate, plugin_key, "input-timestamp"))
+    step, results = vamp.collect(buf, rate, plugin_key, "input-timestamp")
+    assert abs(float(step) - (1024.0 / rate)) < eps
     assert len(results) == 10
     for i in range(len(results)):
         # The timestamp should be the frame number of the first frame in the
@@ -38,21 +39,23 @@
 
 def test_collect_fixed_sample_rate():
     buf = input_data(blocksize * 10)
-    results = list(vamp.collect(buf, rate, plugin_key, "curve-fsr"))
+    step, results = vamp.collect(buf, rate, plugin_key, "curve-fsr")
+    assert abs(float(step) - 0.4) < eps
     assert len(results) == 10
     for i in range(len(results)):
         assert abs(results[i] - i * 0.1) < eps
 
 def test_collect_fixed_sample_rate_2():
     buf = input_data(blocksize * 10)
-    results = list(vamp.collect(buf, rate, plugin_key, "curve-fsr-timed"))
+    step, results = vamp.collect(buf, rate, plugin_key, "curve-fsr-timed")
+    assert abs(float(step) - 0.4) < eps
     assert len(results) == 10
     for i in range(len(results)):
         assert abs(results[i] - i * 0.1) < eps
         
 def test_collect_variable_sample_rate():
     buf = input_data(blocksize * 10)
-    results = list(vamp.collect(buf, rate, plugin_key, "curve-vsr"))
+    results = vamp.collect(buf, rate, plugin_key, "curve-vsr")
     assert len(results) == 10
     i = 0
     for r in results:
--- a/vamp/collect.py	Mon Feb 02 16:08:42 2015 +0000
+++ b/vamp/collect.py	Mon Feb 02 16:32:44 2015 +0000
@@ -7,6 +7,13 @@
 
 import numpy as np
 
+def get_feature_step_time(sample_rate, step_size, output_desc):
+    if output_desc["sample_type"] == vampyhost.ONE_SAMPLE_PER_STEP:
+        return vampyhost.frame_to_realtime(step_size, sample_rate)
+    elif output_desc["sample_type"] == vampyhost.FIXED_SAMPLE_RATE:
+        return vampyhost.RealTime('seconds', 1.0 / output_desc["sample_rate"])
+    else:
+        return 1
 
 def timestamp_features(sample_rate, step_size, output_desc, features):
     n = -1
@@ -29,7 +36,6 @@
         for f in features:
             yield f
 
-
 def fill_timestamps(results, sample_rate, step_size, output_desc):
 
     output = output_desc["identifier"]
@@ -41,7 +47,6 @@
     for s in stamped:
         yield s
 
-
 def deduce_shape(output_desc):
     if output_desc["has_duration"]:
         return "individual"
@@ -51,10 +56,9 @@
         return "individual"
     if output_desc["bin_count"] == 0:
         return "individual"
-    if output_desc["bin_count"] > 1:
-        return "matrix"
-    return "vector"
-
+    if output_desc["bin_count"] == 1:
+        return "vector"
+    return "matrix"
 
 def process_and_reshape(data, sample_rate, key, output, parameters = {}):
 
@@ -71,13 +75,16 @@
     results = process.process_frames_with_plugin(ff, sample_rate, step_size, plugin, [output])
 
     shape = deduce_shape(output_desc)
+    out_step = get_feature_step_time(sample_rate, step_size, output_desc)
 
     if shape == "vector":
-        rv = np.array([r[output]["values"][0] for r in results])
+        rv = ( out_step,
+               np.array([r[output]["values"][0] for r in results]) )
     elif shape == "matrix":
-        rv = np.array(
-            [[r[output]["values"][i] for r in results]
-             for i in range(0, output_desc["bin_count"]-1)])
+        rv = ( out_step,
+               np.array(
+                   [[r[output]["values"][i] for r in results]
+                    for i in range(0, output_desc["bin_count"])]) )
     else:
         rv = list(fill_timestamps(results, sample_rate, step_size, output_desc))