annotate yetilab/signal/window.yeti @ 265:c7efd12c27c5

Window fixes and tests
author Chris Cannam
date Thu, 23 May 2013 13:21:05 +0100
parents 046a2e323716
children 46d2923a04ab
rev   line source
Chris@38 1
Chris@264 2 module yetilab.signal.window;
Chris@38 3
Chris@222 4 vec = load yetilab.vector.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@263 27 case sampling of
Chris@263 28 Symmetric (): cosineWindowSymmetric;
Chris@263 29 Periodic (): cosineWindowPeriodic;
Chris@263 30 esac a0 a1 a2 a3 n;
Chris@263 31
Chris@265 32 bartlettSymmetric n =
Chris@265 33 if n < 2 then vec.ones n
Chris@265 34 else
Chris@265 35 vec.fromList
Chris@265 36 (n1 = n - 1;
Chris@265 37 h = int (n1 / 2);
Chris@265 38 concat [
Chris@265 39 map do i:
Chris@265 40 2 * i / n1
Chris@265 41 done [0..h],
Chris@265 42 map do i:
Chris@265 43 2 - (2 * i / n1)
Chris@265 44 done [h+1..n1]
Chris@265 45 ]);
Chris@265 46 fi;
Chris@265 47
Chris@265 48 bartlettPeriodic n =
Chris@265 49 if n < 2 then vec.ones n
Chris@265 50 else
Chris@265 51 vec.slice (bartlettSymmetric (n+1)) 0 n;
Chris@265 52 fi;
Chris@265 53
Chris@265 54 bartlett sampling =
Chris@265 55 case sampling of
Chris@265 56 Symmetric (): bartlettSymmetric;
Chris@265 57 Periodic (): bartlettPeriodic;
Chris@265 58 esac;
Chris@265 59
Chris@263 60 hann = cosineWindow 0.5 0.5 0.0 0.0;
Chris@263 61 hamming = cosineWindow 0.54 0.46 0.0 0.0;
Chris@263 62 blackman = cosineWindow 0.42 0.50 0.08 0.0;
Chris@263 63 nuttall = cosineWindow 0.355768 0.487396 0.144232 0.012604;
Chris@263 64 blackmanNuttall = cosineWindow 0.3635819 0.4891775 0.1365995 0.0106411;
Chris@263 65 blackmanHarris = cosineWindow 0.35875 0.48829 0.14128 0.01168;
Chris@263 66
Chris@218 67 boxcar = vec.consts 0.5;
Chris@38 68
Chris@265 69 windowFunction type options =
Chris@263 70 (var sampling = Periodic ();
Chris@263 71 for options \case of
Chris@263 72 Symmetric s: if s then sampling := Symmetric () fi
Chris@263 73 esac;
Chris@263 74 case type of
Chris@263 75 Hann (): hann sampling;
Chris@263 76 Hamming (): hamming sampling;
Chris@263 77 Blackman (): blackman sampling;
Chris@263 78 Nuttall (): nuttall sampling;
Chris@263 79 BlackmanNuttall (): blackmanNuttall sampling;
Chris@263 80 BlackmanHarris (): blackmanHarris sampling;
Chris@263 81 Boxcar (): boxcar;
Chris@265 82 Bartlett (): bartlett sampling;
Chris@263 83 esac);
Chris@263 84
Chris@49 85 windowed windowFunc frames =
Chris@43 86 case frames of
Chris@43 87 []: frames;
Chris@43 88 _: (first = head frames;
Chris@218 89 window = windowFunc (vec.length first);
Chris@43 90 map (bf.multiply window) frames);
Chris@43 91 esac;
Chris@43 92
Chris@38 93 {
Chris@263 94 cosineWindow,
Chris@263 95 hann = hann (Periodic ()),
Chris@263 96 hamming = hamming (Periodic ()),
Chris@263 97 blackman = blackman (Periodic ()),
Chris@263 98 nuttall = nuttall (Periodic ()),
Chris@263 99 blackmanNuttall = blackmanNuttall (Periodic ()),
Chris@263 100 blackmanHarris = blackmanHarris (Periodic ()),
Chris@265 101 boxcar,
Chris@265 102 bartlett = bartlett (Periodic ()),
Chris@263 103 windowFunction,
Chris@263 104 windowed
Chris@38 105 };
Chris@38 106