Mercurial > hg > may
changeset 367:9afd71c8aff5
Fixes to spaced, tests now pass
author | Chris Cannam |
---|---|
date | Fri, 12 Jul 2013 17:17:53 +0100 |
parents | bbc93e52dd5c |
children | b11897bf9e71 |
files | may/stream/filter.yeti |
diffstat | 1 files changed, 23 insertions(+), 23 deletions(-) [+] |
line wrap: on
line diff
--- a/may/stream/filter.yeti Fri Jul 12 17:00:21 2013 +0100 +++ b/may/stream/filter.yeti Fri Jul 12 17:17:53 2013 +0100 @@ -434,36 +434,36 @@ bf.multiply sw kw); spaced mult s = //!!! mult must be an integer [how to enforce this??] - //!!! very, very slow -//!!! test, then rewrite to be faster - (var pos = 0; + (spaceToNext pos = case (pos % mult) of 0: 0; n: (mult - n) esac; + readWithoutPadding n = + (toRead = int Math#ceil(n / mult); + source = s.read toRead; + targetWidth = min n (mult * mat.width source); + mat.newMatrix (ColumnMajor ()) + (map do i: + if i % mult == 0 then + mat.getColumn (int (i / mult)) source + else + vec.zeros s.channels + fi + done [0..targetWidth-1])); + var pos = 0; s with { get position () = pos, get available () = case s.available of - Known n: - (pending = case (pos % mult) of 0: 0; n: (mult - n) esac; - Known (pending + (n * mult))); + Known n: Known ((spaceToNext pos) + (n * mult)); other: other esac, read n = - (readOne () = - (offset = pos % mult; - sample = - if offset == 0 then - m = s.read 1; - if mat.width m == 1 then - mat.at m 0 0; - else - 0 - fi; - else - 0 - fi; - pos := pos + 1; - sample); - mat.newRowVector (vec.fromList (map \(readOne ()) [1..n]))), + (sp = spaceToNext pos; + result = mat.toRowMajor + (mat.concat (Horizontal ()) + [mat.zeroMatrix { rows = s.channels, columns = min sp n }, + readWithoutPadding (max (n - sp) 0)]); + pos := pos + mat.width result; + result), }); interpolated factor s = //!!! factor must be an integer [how to enforce this??] @@ -479,7 +479,7 @@ out with { get sampleRate () = s.sampleRate * factor }; fi; -picked frac s = +picked frac s = //!!! frac must be an integer [how to enforce this??] s with { get position () = int Math#ceil(s.position / frac),