annotate yetilab/signal/window.yeti @ 296:ec6a36d88f57

Move complex tests to complex package
author Chris Cannam
date Fri, 31 May 2013 22:02:03 +0100
parents 240eb77ee2e8
children f8089ccb686d
rev   line source
Chris@38 1
Chris@264 2 module yetilab.signal.window;
Chris@38 3
Chris@273 4 vec = load yetilab.vector;
Chris@222 5 bf = load yetilab.vector.blockfuncs;
Chris@38 6
Chris@263 7 cosineWindowSymmetric a0 a1 a2 a3 n =
Chris@263 8 (n1 = n - 1;
Chris@218 9 vec.fromList
Chris@38 10 (map do i:
Chris@38 11 a0
Chris@263 12 - a1 * cos(2 * pi * i / n1)
Chris@263 13 + a2 * cos(4 * pi * i / n1)
Chris@263 14 - a3 * cos(6 * pi * i / n1)
Chris@263 15 done [0..n1]));
Chris@263 16
Chris@263 17 cosineWindowPeriodic a0 a1 a2 a3 n =
Chris@263 18 (vec.fromList
Chris@263 19 (map do i:
Chris@263 20 a0
Chris@38 21 - a1 * cos(2 * pi * i / n)
Chris@38 22 + a2 * cos(4 * pi * i / n)
Chris@262 23 - a3 * cos(6 * pi * i / n)
Chris@263 24 done [0..n-1]));
Chris@38 25
Chris@263 26 cosineWindow a0 a1 a2 a3 sampling n =
Chris@266 27 if n < 2 then vec.ones n
Chris@266 28 else
Chris@266 29 case sampling of
Chris@266 30 Symmetric (): cosineWindowSymmetric;
Chris@266 31 Periodic (): cosineWindowPeriodic;
Chris@266 32 esac a0 a1 a2 a3 n;
Chris@266 33 fi;
Chris@263 34
Chris@265 35 bartlettSymmetric n =
Chris@265 36 if n < 2 then vec.ones n
Chris@265 37 else
Chris@265 38 vec.fromList
Chris@265 39 (n1 = n - 1;
Chris@265 40 h = int (n1 / 2);
Chris@265 41 concat [
Chris@265 42 map do i:
Chris@265 43 2 * i / n1
Chris@265 44 done [0..h],
Chris@265 45 map do i:
Chris@265 46 2 - (2 * i / n1)
Chris@265 47 done [h+1..n1]
Chris@265 48 ]);
Chris@265 49 fi;
Chris@265 50
Chris@265 51 bartlettPeriodic n =
Chris@265 52 if n < 2 then vec.ones n
Chris@265 53 else
Chris@265 54 vec.slice (bartlettSymmetric (n+1)) 0 n;
Chris@265 55 fi;
Chris@265 56
Chris@265 57 bartlett sampling =
Chris@265 58 case sampling of
Chris@265 59 Symmetric (): bartlettSymmetric;
Chris@265 60 Periodic (): bartlettPeriodic;
Chris@265 61 esac;
Chris@265 62
Chris@263 63 hann = cosineWindow 0.5 0.5 0.0 0.0;
Chris@263 64 hamming = cosineWindow 0.54 0.46 0.0 0.0;
Chris@263 65 blackman = cosineWindow 0.42 0.50 0.08 0.0;
Chris@263 66 nuttall = cosineWindow 0.355768 0.487396 0.144232 0.012604;
Chris@263 67 blackmanNuttall = cosineWindow 0.3635819 0.4891775 0.1365995 0.0106411;
Chris@263 68 blackmanHarris = cosineWindow 0.35875 0.48829 0.14128 0.01168;
Chris@263 69
Chris@292 70 boxcar n = vec.ones n;
Chris@38 71
Chris@265 72 windowFunction type options =
Chris@263 73 (var sampling = Periodic ();
Chris@263 74 for options \case of
Chris@263 75 Symmetric s: if s then sampling := Symmetric () fi
Chris@263 76 esac;
Chris@263 77 case type of
Chris@263 78 Hann (): hann sampling;
Chris@263 79 Hamming (): hamming sampling;
Chris@263 80 Blackman (): blackman sampling;
Chris@263 81 Nuttall (): nuttall sampling;
Chris@263 82 BlackmanNuttall (): blackmanNuttall sampling;
Chris@263 83 BlackmanHarris (): blackmanHarris sampling;
Chris@263 84 Boxcar (): boxcar;
Chris@265 85 Bartlett (): bartlett sampling;
Chris@263 86 esac);
Chris@263 87
Chris@284 88 //!!! should use vector. but does anyone use this function anyway? would we use it in framer if it used vector?
Chris@49 89 windowed windowFunc frames =
Chris@43 90 case frames of
Chris@43 91 []: frames;
Chris@43 92 _: (first = head frames;
Chris@218 93 window = windowFunc (vec.length first);
Chris@43 94 map (bf.multiply window) frames);
Chris@43 95 esac;
Chris@43 96
Chris@38 97 {
Chris@263 98 cosineWindow,
Chris@263 99 hann = hann (Periodic ()),
Chris@263 100 hamming = hamming (Periodic ()),
Chris@263 101 blackman = blackman (Periodic ()),
Chris@263 102 nuttall = nuttall (Periodic ()),
Chris@263 103 blackmanNuttall = blackmanNuttall (Periodic ()),
Chris@263 104 blackmanHarris = blackmanHarris (Periodic ()),
Chris@265 105 boxcar,
Chris@265 106 bartlett = bartlett (Periodic ()),
Chris@263 107 windowFunction,
Chris@263 108 windowed
Chris@38 109 };
Chris@38 110