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
|