annotate yetilab/stream/channels.yeti @ 178:032c4986b6b0

Implement and test matrix concat
author Chris Cannam
date Thu, 02 May 2013 21:58:58 +0100
parents 6ffdf5d4dfcf
children 0c81455270dc
rev   line source
Chris@15 1
Chris@93 2 module yetilab.stream.channels;
Chris@15 3
Chris@93 4 vec = load yetilab.block.fvector;
Chris@93 5 block = load yetilab.block.block;
Chris@158 6 mat = load yetilab.matrix.matrix;
Chris@15 7
Chris@15 8 interleaved m =
Chris@158 9 ({ columns, rows } = m.size;
Chris@165 10 if rows == 1 then
Chris@165 11 m.getRow 0
Chris@165 12 else
Chris@165 13 v = vec.zeros (columns * rows);
Chris@165 14 for [0..rows-1] do row:
Chris@165 15 for [0..columns-1] do col:
Chris@165 16 v[col * rows + row] := m.getAt row col;
Chris@165 17 done;
Chris@15 18 done;
Chris@165 19 block.block v;
Chris@165 20 fi);
Chris@15 21
Chris@163 22 deinterleaved channels b =
Chris@163 23 if channels == 1 then
Chris@163 24 mat.newRowVector b
Chris@163 25 else
Chris@163 26 rows = (block.length b) / channels;
Chris@163 27 vv = array (map \(vec.zeros rows) [0..channels-1]);
Chris@163 28 v = block.data b;
Chris@163 29 for [0..rows-1] do row:
Chris@163 30 for [0..channels-1] do col:
Chris@163 31 vv[col][row] := v[channels * row + col];
Chris@163 32 done
Chris@163 33 done;
Chris@163 34 mat.newMatrix (RowMajor ()) (map block.block vv);
Chris@163 35 fi;
Chris@15 36
Chris@15 37 mixedDown m =
Chris@158 38 ({ columns, rows } = m.size;
Chris@158 39 v = vec.zeros columns;
Chris@158 40 for [0..rows-1] do row:
Chris@158 41 for [0..columns-1] do col:
Chris@158 42 v[col] := v[col] + m.getAt row col;
Chris@15 43 done;
Chris@158 44 done;
Chris@158 45 block.block v);
Chris@15 46
Chris@158 47 mixedDownFromInterleaved channels b =
Chris@165 48 if channels == 1 then
Chris@165 49 b;
Chris@165 50 else
Chris@165 51 v = block.data b;
Chris@165 52 columns = ((vec.length v) / channels);
Chris@165 53 v' = vec.zeros columns;
Chris@165 54 for [0..channels-1] do row:
Chris@165 55 for [0..columns-1] do col:
Chris@165 56 v'[col] := v'[col] + v[col * channels + row];
Chris@165 57 done;
Chris@15 58 done;
Chris@165 59 block.block v';
Chris@165 60 fi;
Chris@15 61
Chris@158 62 mixedFromInterleavedTo targetChannels channels b =
Chris@158 63 if targetChannels == channels then
Chris@20 64 b;
Chris@158 65 elif targetChannels == 1 then
Chris@158 66 mixedDownFromInterleaved channels b;
Chris@15 67 else
Chris@47 68 v = block.data b;
Chris@158 69 columns = ((vec.length v) / channels);
Chris@158 70 v' = vec.zeros (columns * targetChannels);
Chris@158 71 for [0..targetChannels-1] do target:
Chris@158 72 for [0..columns-1] do col:
Chris@158 73 if target < channels then
Chris@158 74 v'[col * targetChannels + target] := v[col * channels + target];
Chris@166 75 elif channels == 1 and target == 1 then
Chris@158 76 v'[col * targetChannels + target] := v[col * channels];
Chris@15 77 fi
Chris@15 78 done
Chris@15 79 done;
Chris@20 80 block.block v';
Chris@15 81 fi;
Chris@15 82
Chris@158 83 mixedAndInterleavedTo targetChannels m =
Chris@158 84 if targetChannels == 1 then
Chris@158 85 mixedDown m
Chris@158 86 else
Chris@166 87 (interleaved .
Chris@166 88 mat.resizedTo { rows = targetChannels, columns = m.size.columns })
Chris@166 89 if m.size.rows == 1 then
Chris@166 90 (mat.newMatrix (RowMajor ()) [ m.getRow 0, m.getRow 0 ])
Chris@166 91 else
Chris@166 92 m
Chris@166 93 fi;
Chris@158 94 fi;
Chris@158 95
Chris@15 96 {
Chris@15 97 interleaved, deinterleaved,
Chris@158 98 mixedDown, mixedDownFromInterleaved, mixedFromInterleavedTo, mixedAndInterleavedTo
Chris@15 99 }
Chris@15 100