annotate framer.yeti @ 46:00b604d7faf9

Use complex class for output of FFT
author Chris Cannam
date Sat, 29 Dec 2012 14:36:13 +0000
parents 1f80673af4c7
children f24e0bf01dda
rev   line source
Chris@8 1
Chris@8 2 module framer;
Chris@8 3
Chris@25 4 /**
Chris@25 5 * Framer expresses a stream (or a file) as a lazy list of (possibly
Chris@25 6 * overlapping) frames of mono data.
Chris@25 7 */
Chris@25 8
Chris@11 9 vec = load fvector;
Chris@20 10 block = load block;
Chris@8 11 af = load audiofile;
Chris@8 12
Chris@32 13 blockList framesize stream =
Chris@14 14 if stream.finished? then
Chris@14 15 (stream.close (); [] );
Chris@13 16 else
Chris@32 17 block.resizedTo framesize (stream.readMono framesize)
Chris@32 18 :. \(blockList framesize stream);
Chris@13 19 fi;
Chris@13 20
Chris@32 21 overlappingBlockList size hop stream valid buffer
Chris@23 22 is number -> number -> 'a -> number -> ~double[] -> 'b =
Chris@29 23 (
Chris@29 24 b = stream.readMono hop;
Chris@24 25 obtained = block.length b;
Chris@23 26 samples = block.unblock b;
Chris@23 27
Chris@32 28 // Retain framesize - hop samples from old buffer, add hop samples
Chris@29 29 // (zero-padded if necessary) just read
Chris@29 30 buffer = vec.concat
Chris@35 31 [vec.rangeOf buffer hop (size-hop),
Chris@35 32 vec.resizedTo hop samples];
Chris@23 33
Chris@23 34 // Number of "valid" elements (not tail-end zero-padding) left in buffer
Chris@24 35 remaining = valid - (hop - obtained);
Chris@23 36
Chris@23 37 if remaining <= 0 then
Chris@23 38 stream.close ();
Chris@23 39 [];
Chris@12 40 else
Chris@29 41 v = block.block buffer;
Chris@32 42 v :. \(overlappingBlockList size hop stream remaining buffer);
Chris@23 43 fi);
Chris@14 44
Chris@32 45 frames { framesize, hop } stream =
Chris@32 46 if framesize == hop then
Chris@32 47 blockList framesize stream
Chris@30 48 else
Chris@32 49 overlappingBlockList framesize hop stream
Chris@32 50 framesize (vec.zeros framesize);
Chris@30 51 fi;
Chris@14 52
Chris@32 53 framesOfFile { framesize, hop } filename =
Chris@32 54 if framesize == hop then
Chris@32 55 blockList framesize (af.open filename)
Chris@30 56 else
Chris@32 57 overlappingBlockList framesize hop (af.open filename)
Chris@32 58 framesize (vec.zeros framesize);
Chris@30 59 fi;
Chris@23 60
Chris@11 61 {
Chris@30 62 frames,
Chris@30 63 framesOfFile,
Chris@11 64 }
Chris@8 65