changeset 47:f24e0bf01dda

Replace tagged-type block with an opaque type implementation
author Chris Cannam
date Sat, 29 Dec 2012 15:36:05 +0000
parents 00b604d7faf9
children f97abcda094f
files block.yeti channels.yeti fft.yeti framer.yeti
diffstat 4 files changed, 43 insertions(+), 53 deletions(-) [+]
line wrap: on
line diff
--- a/block.yeti	Sat Dec 29 14:36:13 2012 +0000
+++ b/block.yeti	Sat Dec 29 15:36:05 2012 +0000
@@ -1,47 +1,41 @@
+
 module block;
 
 vec = load fvector;
 
-zeros = Block . vec.zeros;
-consts m  = Block . (vec.consts m);
-ones = Block . vec.ones;
-
-block v is ~double[] -> (Block ~double[]) = 
-    Block v;
-
-unblock b is (Block ~double[]) -> ~double[] =
-    case b of Block a: a esac;
-
-fromList l =
-    block (vec.vector l);
-
-list' b = vec.list (unblock b);
-length' b = vec.length (unblock b);
-
-equal b1 b2 =
-    list' b1 == list' b2;
-
-copyOf b =
-    Block (vec.copyOf (unblock b));
-
-rangeOf b start len =
-    Block (vec.rangeOf (unblock b) start len);
-
-resizedTo n b =
-    Block (vec.resizedTo n (unblock b));
-
-concat blocks =
-    Block (vec.concat (map unblock blocks));
+typedef opaque block = ~double[];
 
 {
-zeros, consts, ones,
-block, unblock,
-fromList,
-length = length',
-list = list',
-equal,
-copyOf, rangeOf, resizedTo,
-concat,
+zeros = vec.zeros,
+consts = vec.consts,
+ones = vec.ones,
+block v = v,
+data b = b,
+vector b = vec.copyOf b,
+fromList l = vec.vector l,
+list = vec.list,
+length = vec.length,
+equal = vec.equal,
+copyOf = vec.copyOf,
+rangeOf = vec.rangeOf,
+resizedTo = vec.resizedTo,
+concat = vec.concat,
+} as {
+zeros is number -> block,
+consts is number -> number -> block,
+ones is number -> block,
+block is ~double[] -> block,
+data is block -> ~double[],
+vector is block -> ~double[],
+fromList is list?<number> -> block,
+list is block -> list<number>,
+length is block -> number,
+equal is block -> block -> boolean,
+copyOf is block -> block,
+rangeOf is block -> number -> number -> block,
+resizedTo is number -> block -> block,
+concat is list?<block> -> block,
 }
 
 
+
--- a/channels.yeti	Sat Dec 29 14:36:13 2012 +0000
+++ b/channels.yeti	Sat Dec 29 15:36:05 2012 +0000
@@ -16,7 +16,7 @@
     block.block v);
 
 deinterleaved rows b =
-   (v = block.unblock b;
+   (v = block.data b;
     mat.generate do row col:
         v[rows * col + row]
     done rows ((vec.length v) / rows));
@@ -34,7 +34,7 @@
     fi);
 
 mixedDownFromInterleaved rows b =
-   (v = block.unblock b;
+   (v = block.data b;
     cols = ((vec.length v) / rows);
     v' = vec.zeros cols;
     for [0..rows-1] do row:
@@ -50,7 +50,7 @@
     elif targetRows == 1 then
         mixedDownFromInterleaved rows b;
     else
-        v = block.unblock b;
+        v = block.data b;
         cols = ((vec.length v) / rows);
         v' = vec.zeros (cols * targetRows);
         for [0..targetRows-1] do target:
--- a/fft.yeti	Sat Dec 29 14:36:13 2012 +0000
+++ b/fft.yeti	Sat Dec 29 15:36:05 2012 +0000
@@ -19,7 +19,7 @@
 fft n = 
    (d = new DoubleFFT_1D(n);
     do bl:
-        v = b.unblock (b.copyOf bl);
+        v = b.vector bl;
         d#realForward(v);
         unpack v;
     done);
--- a/framer.yeti	Sat Dec 29 14:36:13 2012 +0000
+++ b/framer.yeti	Sat Dec 29 15:36:05 2012 +0000
@@ -6,7 +6,6 @@
  * overlapping) frames of mono data.
  */
 
-vec = load fvector;
 block = load block;
 af = load audiofile;
 
@@ -18,18 +17,16 @@
             :. \(blockList framesize stream);
     fi;
 
-overlappingBlockList size hop stream valid buffer
-    is number -> number -> 'a -> number -> ~double[] -> 'b =
+overlappingBlockList size hop stream valid buffer =
    (
     b = stream.readMono hop;
     obtained = block.length b;
-    samples = block.unblock b;
 
     // Retain framesize - hop samples from old buffer, add hop samples
     // (zero-padded if necessary) just read
-    buffer = vec.concat
-       [vec.rangeOf buffer hop (size-hop),
-        vec.resizedTo hop samples];
+    buffer = block.concat
+       [block.rangeOf buffer hop (size-hop),
+        block.resizedTo hop b];
 
     // Number of "valid" elements (not tail-end zero-padding) left in buffer
     remaining = valid - (hop - obtained);
@@ -38,8 +35,7 @@
         stream.close ();
         [];
     else
-        v = block.block buffer;
-        v :. \(overlappingBlockList size hop stream remaining buffer);
+        buffer :. \(overlappingBlockList size hop stream remaining buffer);
     fi);
 
 frames { framesize, hop } stream =
@@ -47,7 +43,7 @@
         blockList framesize stream
     else
         overlappingBlockList framesize hop stream 
-            framesize (vec.zeros framesize);
+            framesize (block.zeros framesize);
     fi;
 
 framesOfFile { framesize, hop } filename =
@@ -55,7 +51,7 @@
         blockList framesize (af.open filename)
     else
         overlappingBlockList framesize hop (af.open filename)
-            framesize (vec.zeros framesize);
+            framesize (block.zeros framesize);
     fi;
 
 {