annotate yetilab/transform/window.yeti @ 262:9b07a28aefad

Fix window functions. We need tests for these.
author Chris Cannam
date Wed, 22 May 2013 22:19:48 +0100
parents 77c6a81c577f
children 772484665c5d
rev   line source
Chris@38 1
Chris@93 2 module yetilab.transform.window;
Chris@38 3
Chris@222 4 vec = load yetilab.vector.vector;
Chris@222 5 bf = load yetilab.vector.blockfuncs;
Chris@38 6
Chris@262 7 cosinewin a0 a1 a2 a3 n1 =
Chris@262 8 (n = n1 - 1;
Chris@218 9 vec.fromList
Chris@38 10 (map do i:
Chris@38 11 a0
Chris@38 12 - a1 * cos(2 * pi * i / n)
Chris@38 13 + a2 * cos(4 * pi * i / n)
Chris@262 14 - a3 * cos(6 * pi * i / n)
Chris@262 15 done [0..n]));
Chris@38 16
Chris@38 17 hann = cosinewin 0.5 0.5 0.0 0.0;
Chris@38 18 hamming = cosinewin 0.54 0.46 0.0 0.0;
Chris@38 19 blackman = cosinewin 0.42 0.50 0.08 0.0;
Chris@262 20 nuttall = cosinewin 0.355768 0.487396 0.144232 0.012604;
Chris@262 21 blackmanNuttall = cosinewin 0.3635819 0.4891775 0.1365995 0.0106411;
Chris@38 22 blackmanHarris = cosinewin 0.35875 0.48829 0.14128 0.01168;
Chris@218 23 boxcar = vec.consts 0.5;
Chris@38 24
Chris@38 25 bartlett n =
Chris@218 26 vec.fromList
Chris@38 27 (m = n/2;
Chris@38 28 concat [
Chris@38 29 map do i:
Chris@38 30 i / m
Chris@38 31 done [0..m-1],
Chris@38 32 map do i:
Chris@38 33 1.0 - (i / m)
Chris@38 34 done [0..m-1]
Chris@38 35 ]);
Chris@38 36
Chris@49 37 windowed windowFunc frames =
Chris@43 38 case frames of
Chris@43 39 []: frames;
Chris@43 40 _: (first = head frames;
Chris@218 41 window = windowFunc (vec.length first);
Chris@43 42 map (bf.multiply window) frames);
Chris@43 43 esac;
Chris@43 44
Chris@38 45 {
Chris@262 46 cosinewin, hann, hamming, blackman, nuttall, blackmanNuttall, blackmanHarris,
Chris@262 47 boxcar, bartlett, windowed
Chris@38 48 };
Chris@38 49