changeset 360:900b2eb67023

Sketch interpolate/decimate tests (wrong for various reasons)
author Chris Cannam
date Tue, 02 Jul 2013 22:24:57 +0100
parents 52aaf0a09de6
children 6a8263b37ea1
files may/stream/test/test_filter.yeti
diffstat 1 files changed, 53 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/may/stream/test/test_filter.yeti	Tue Jun 25 10:08:30 2013 +0100
+++ b/may/stream/test/test_filter.yeti	Tue Jul 02 22:24:57 2013 +0100
@@ -2,10 +2,13 @@
 module may.stream.test.test_filter;
 
 vec = load may.vector;
+bf = load may.vector.blockfuncs;
 mat = load may.matrix;
 syn = load may.stream.syntheticstream;
 filt = load may.stream.filter;
 
+pl = load may.plot;//!!!
+
 { compare, compareUsing } = load may.test.test;
 
 compareClose = compareUsing 
@@ -616,6 +619,56 @@
         done convolutionOptions);
 ),
 
+"interpolated-\(name)": \(
+    // Interpolating a sinusoid should give us a sinusoid
+    sinusoid = syn.sinusoid 8 2; // 2Hz sine sampled at 8Hz: [ 0, 1, 0, -1 ] etc
+    input = maybeDuration 16 sinusoid;
+    output = filt.interpolated 2 input;
+    result = output.read 32;
+    reference = syn.sinusoid 16 2;
+    expected = reference.read 32;
+    compareOutputs a b = compareClose
+       (map vec.list (mat.asRows a)) (map vec.list (mat.asRows b));
+    if not compareOutputs result expected then
+        \() (pl.plot [Vector (mat.getRow 0 result), Vector (mat.getRow 0 expected)]);
+        false
+    else true fi;
+),
+
+"decimated-\(name)": \(
+    // Decimating a sinusoid should give us a sinusoid
+    sinusoid = syn.sinusoid 32 2; // 2Hz sine sampled at 16Hz
+    input = maybeDuration 64 sinusoid;
+    output = filt.decimated 2 input;
+    result = output.read 32;
+    reference = syn.sinusoid 16 2;
+    expected = reference.read 32;
+    compareOutputs a b = compareClose
+       (map vec.list (mat.asRows a)) (map vec.list (mat.asRows b));
+    if not compareOutputs result expected then
+        \() (pl.plot [Vector (mat.getRow 0 result), Vector (mat.getRow 0 expected)]);
+        false
+    else true fi;
+),
+
+"int-dec-\(name)": \(
+    // Interpolating any signal then decimating by the same factor
+    // should get us the original back again
+    data = vec.fromList [ 0, 0.1, -0.3, -0.4, -0.3, 0, 0.5, 0.2, 0.8, -0.1 ];
+    data = vec.concat [ data, bf.scaled (5/4) data, bf.scaled (3/4) data, data ];
+    data = vec.concat [ data, data ];
+    input = maybeDuration (vec.length data) (syn.precalculatedMono 4 data);
+    intermediate = filt.interpolated 2 input;
+    output = filt.decimated 2 intermediate;
+    result = output.read (vec.length data);
+    if not compareClose [vec.list (mat.getRow 0 result)] [vec.list data] then
+        \() (pl.plot [Vector (mat.getRow 0 result), Vector data]);
+        up = (filt.interpolated 2 (syn.precalculatedMono 4 data)).read 80;
+        \() (pl.plot [Vector (mat.getRow 0 up)]);
+        false
+    else true fi;
+),
+
 //!!! still no tests for filters with multi-channel inputs
 
 ]);