view yetilab/stream/channels.yeti @ 101:2bc6534248fe

Tidier comments
author Chris Cannam
date Thu, 21 Mar 2013 21:53:13 +0000
parents d0abc9afe608
children b6db07468ed1
line wrap: on
line source

module yetilab.stream.channels;

vec = load yetilab.block.fvector;
block = load yetilab.block.block;
mat = load yetilab.block.fmatrix;
        
interleaved m = 
   ({ cols, rows } = mat.dimensions m;
    v = vec.zeros (cols * rows);
    for [0..rows-1] do row:
        for [0..cols-1] do col:
            v[col * rows + row] := m[row][col];
        done;
    done;
    block.block v);

deinterleaved rows b =
   (v = block.data b;
    mat.generate do row col:
        v[rows * col + row]
    done rows ((vec.length v) / rows));

mixedDown m =
   (if empty? m then block.zeros 0 else
        { cols, rows } = mat.dimensions m;
        v = vec.copyOf m[0];
        for [1..rows-1] do row:
            for [0..cols-1] do col:
                v[col] := v[col] + m[row][col];
            done;
        done;
        block.block v;
    fi);

mixedDownFromInterleaved rows b =
   (v = block.data b;
    cols = ((vec.length v) / rows);
    v' = vec.zeros cols;
    for [0..rows-1] do row:
        for [0..cols-1] do col:
            v'[col] := v'[col] + v[col * rows + row];
        done;
    done;
    block.block v');

mixedFromInterleavedTo targetRows rows b = 
    if targetRows == rows then
        b;
    elif targetRows == 1 then
        mixedDownFromInterleaved rows b;
    else
        v = block.data b;
        cols = ((vec.length v) / rows);
        v' = vec.zeros (cols * targetRows);
        for [0..targetRows-1] do target:
            for [0..cols-1] do col:
                if target < rows then
                    v'[col * targetRows + target] := v[col * rows + target];
                elif rows == 1 then
                    v'[col * targetRows + target] := v[col * rows];
                fi
            done
        done;
        block.block v';
    fi;

{
    interleaved, deinterleaved,
    mixedDown, mixedDownFromInterleaved, mixedFromInterleavedTo,
}