Chris@15: Chris@93: module yetilab.stream.syntheticstream; Chris@15: Chris@93: str = load yetilab.stream.stream; Chris@93: vec = load yetilab.block.fvector; Chris@93: block = load yetilab.block.block; Chris@15: Chris@19: generated rate generator seconds = Chris@19: str.monoStream { Chris@15: var position = 0, Chris@19: len = int(seconds * rate + 0.5), Chris@19: rate, Chris@19: read count = Chris@19: (rc = min count (len - position); Chris@15: result = vec.zeros rc; Chris@15: for [0..rc-1] do i: Chris@15: result[i] := generator ((position + i) / rate) Chris@15: done; Chris@15: position := position + rc; Chris@20: block.block result), Chris@20: close = \(), Chris@19: }; Chris@16: Chris@20: sinusoid rate freq seconds = Chris@20: generated rate (sin . (* (freq / (2*pi * rate)))) seconds; Chris@16: Chris@20: whiteNoise rate seconds = Chris@20: generated rate \((Math#random() * 2.0) - 1.0) seconds; Chris@16: Chris@16: precalculated rate data is number -> ~double[] -> 'a = Chris@20: (n = vec.length data; Chris@19: str.monoStream { Chris@16: var position = 0, Chris@19: len = n, Chris@19: rate, Chris@19: read count = Chris@19: (rc = min count (len - position); Chris@26: result = vec.rangeOf data position rc; Chris@16: position := position + rc; Chris@20: block.block result), Chris@20: close = \(), Chris@19: }); Chris@15: Chris@15: { Chris@19: generated, precalculated, sinusoid, whiteNoise, Chris@15: } Chris@15: