changeset 9:1c5b70c79859

Make mixedDown a bit less inefficient, add copy functions
author Chris Cannam
date Thu, 13 Dec 2012 10:35:23 +0000
parents dc72a1d15901
children 149d6911ca12
files audiofile.yeti floatrix.yeti
diffstat 2 files changed, 29 insertions(+), 11 deletions(-) [+]
line wrap: on
line diff
--- a/audiofile.yeti	Wed Dec 12 22:22:02 2012 +0000
+++ b/audiofile.yeti	Thu Dec 13 10:35:23 2012 +0000
@@ -82,7 +82,7 @@
 readMono { format is ~AudioFormat, stream is ~AudioInputStream } n =
    (doubles = readInterleaved { format, stream } n;
     channels = format#getChannels();
-    mat.mixedDown channels doubles;
+    mat.mixedDownFromInterleaved channels doubles;
    );
 
 //!!! need to read only remaining, not whole stream length
--- a/floatrix.yeti	Wed Dec 12 22:22:02 2012 +0000
+++ b/floatrix.yeti	Thu Dec 13 10:35:23 2012 +0000
@@ -1,5 +1,7 @@
 module floatrix;
 
+import java.util: Arrays;
+
 zeros n = new double[n];
 ones  n = (a = zeros n; for [0..n-1] do i: a[i] := 1.0 done; a);
 
@@ -16,8 +18,7 @@
    (m = zeroMatrix rows cols;
     for [0..rows-1] do row:
         for [0..cols-1] do col:
-            n = f row col;
-            m[row][col] := n;
+            m[row][col] := f row col;
         done;
     done;
     m);
@@ -40,6 +41,10 @@
 
 dimensions m = { cols = width m, rows = height m };
 
+copyOfVector v is ~double[] -> ~double[] = Arrays#copyOf(v, length(arrayWrap v));
+
+copyOfMatrix m = array (map copyOfVector m);
+
 transposed m is array<~double[]> -> array<~double[]> = 
     generateMatrix do row col: m[col][row] done (cols m) (rows m);
         
@@ -58,21 +63,34 @@
         v[rows * col + row]
     done rows (length (arrayWrap v) / rows);
 
-    //!!! too inefficient!
-mixedDown rows v is number -> ~double[] -> ~double[] =
+mixedDown m =
+   (if empty? m then zeros 0 else
+        { cols, rows } = dimensions m;
+        v = copyOfVector m[0];
+        for [1..rows-1] do row:
+            for [0..cols-1] do col:
+                v[col] := v[col] + m[row][col];
+            done;
+        done;
+        v;
+    fi);
+
+mixedDownFromInterleaved rows v is number -> ~double[] -> ~double[] =
    (cols = (length (arrayWrap v) / rows);
-    mv = new double[cols];
-    for [0..cols-1] do col:
-        val = sum (map do row: v[col * rows + row] done [0..rows-1]) / rows;
-        mv[col] := val;
+    v' = zeros cols;
+    for [0..rows-1] do row:
+        for [0..cols-1] do col:
+            v'[col] := v'[col] + v[col * rows + row];
+        done;
     done;
-    mv);
+    v');
 
 {
 zeros, ones, vector,
 generateMatrix, constMatrix, randomMatrix, zeroMatrix, identityMatrix,
 width, cols, height, rows, dimensions,
+copyOfVector, copyOfMatrix,
 transposed, interleaved, deinterleaved,
-mixedDown,
+mixedDown, mixedDownFromInterleaved,
 }