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
|