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
|