Chris@265
|
1
|
Chris@265
|
2 module yetilab.signal.test.test_window;
|
Chris@265
|
3
|
Chris@265
|
4 win = load yetilab.signal.window;
|
Chris@265
|
5 vec = load yetilab.vector.vector;
|
Chris@265
|
6
|
Chris@265
|
7 { compare, compareUsing } = load yetilab.test.test;
|
Chris@265
|
8
|
Chris@265
|
9 functions = [
|
Chris@265
|
10 Hann () : win.hann,
|
Chris@265
|
11 Hamming () : win.hamming,
|
Chris@265
|
12 Blackman () : win.blackman,
|
Chris@265
|
13 Nuttall () : win.nuttall,
|
Chris@265
|
14 BlackmanNuttall () : win.blackmanNuttall,
|
Chris@265
|
15 BlackmanHarris () : win.blackmanHarris,
|
Chris@265
|
16 Boxcar () : win.boxcar,
|
Chris@265
|
17 Bartlett () : win.bartlett,
|
Chris@265
|
18 ];
|
Chris@265
|
19
|
Chris@266
|
20 close aa bb = all id (map2 do a b: (abs (a - b) < 0.0001) done aa bb);
|
Chris@265
|
21
|
Chris@265
|
22 isSymmetric a =
|
Chris@265
|
23 (len = (vec.length a);
|
Chris@265
|
24 b = if len % 2 == 0 then
|
Chris@265
|
25 half = vec.slice a 0 (len/2);
|
Chris@265
|
26 vec.concat [half, vec.reversed half];
|
Chris@265
|
27 else
|
Chris@265
|
28 half = vec.slice a 0 (int (len/2));
|
Chris@265
|
29 mid = vec.slice a (int (len/2)) (int (len/2) + 1);
|
Chris@265
|
30 vec.concat [half, mid, vec.reversed half];
|
Chris@265
|
31 fi;
|
Chris@265
|
32 compareUsing close (vec.list a) (vec.list b));
|
Chris@265
|
33
|
Chris@265
|
34 [
|
Chris@265
|
35
|
Chris@265
|
36 "windowFunction": \(
|
Chris@265
|
37 all id (map do type:
|
Chris@265
|
38 f = functions[type];
|
Chris@265
|
39 a = f 10;
|
Chris@265
|
40 b = win.windowFunction type [ Symmetric false ] 10;
|
Chris@265
|
41 compareUsing close (vec.list a) (vec.list b)
|
Chris@265
|
42 or (eprintln "** failed window type: \(type)"; false)
|
Chris@265
|
43 done (keys functions));
|
Chris@265
|
44 ),
|
Chris@265
|
45
|
Chris@265
|
46 "symmetric-even": \(
|
Chris@265
|
47 len = 10;
|
Chris@265
|
48 all id (map do type:
|
Chris@265
|
49 f = win.windowFunction type [ Symmetric true ];
|
Chris@265
|
50 v = f len;
|
Chris@265
|
51 (compare (vec.length v) len and isSymmetric v) or
|
Chris@265
|
52 (eprintln "** failed window type: \(type)"; false);
|
Chris@265
|
53 done (keys functions));
|
Chris@265
|
54 ),
|
Chris@265
|
55
|
Chris@265
|
56 "symmetric-odd": \(
|
Chris@265
|
57 len = 11;
|
Chris@265
|
58 all id (map do type:
|
Chris@265
|
59 f = win.windowFunction type [ Symmetric true ];
|
Chris@265
|
60 v = f len;
|
Chris@265
|
61 (compare (vec.length v) len and isSymmetric v) or
|
Chris@265
|
62 (eprintln "** failed window type: \(type)"; false);
|
Chris@265
|
63 done (keys functions));
|
Chris@265
|
64 ),
|
Chris@265
|
65
|
Chris@265
|
66 "periodic-even": \(
|
Chris@265
|
67 // We can't actually test whether a function is periodic, given
|
Chris@265
|
68 // only one cycle of it! But we can make sure that all but the
|
Chris@265
|
69 // first sample is symmetric, which is what a symmetric window
|
Chris@265
|
70 // becomes when generated in periodic mode
|
Chris@265
|
71 len = 10;
|
Chris@265
|
72 all id (map do type:
|
Chris@265
|
73 f = win.windowFunction type [ Symmetric false ];
|
Chris@265
|
74 v = f len;
|
Chris@265
|
75 (compare (vec.length v) len and isSymmetric (vec.slice v 1 len)) or
|
Chris@265
|
76 (eprintln "** failed window type: \(type)"; false);
|
Chris@265
|
77 done (keys functions));
|
Chris@265
|
78 ),
|
Chris@265
|
79
|
Chris@265
|
80 "periodic-odd": \(
|
Chris@265
|
81 len = 11;
|
Chris@265
|
82 all id (map do type:
|
Chris@265
|
83 f = win.windowFunction type [ Symmetric false ];
|
Chris@265
|
84 v = f len;
|
Chris@265
|
85 (compare (vec.length v) len and isSymmetric (vec.slice v 1 len)) or
|
Chris@265
|
86 (eprintln "** failed window type: \(type)"; false);
|
Chris@265
|
87 done (keys functions));
|
Chris@265
|
88 ),
|
Chris@265
|
89
|
Chris@265
|
90 "bartlett-periodic": \(
|
Chris@265
|
91 compare (vec.list (win.bartlett 1)) [1] and
|
Chris@265
|
92 compare (vec.list (win.bartlett 2)) [0,1] and
|
Chris@265
|
93 compare (vec.list (win.bartlett 3)) [0,2/3,2/3] and
|
Chris@265
|
94 compare (vec.list (win.bartlett 4)) [0,1/2,1,1/2]
|
Chris@265
|
95 ),
|
Chris@265
|
96
|
Chris@265
|
97 "bartlett-symmetric": \(
|
Chris@265
|
98 b = win.windowFunction (Bartlett ()) [ Symmetric true ];
|
Chris@265
|
99 compare (vec.list (b 1)) [1] and
|
Chris@265
|
100 compare (vec.list (b 2)) [0,0] and
|
Chris@265
|
101 compare (vec.list (b 3)) [0,1,0] and
|
Chris@265
|
102 compare (vec.list (b 4)) [0,2/3,2/3,0] and
|
Chris@265
|
103 compare (vec.list (b 5)) [0,1/2,1,1/2,0]
|
Chris@265
|
104 ),
|
Chris@265
|
105
|
Chris@266
|
106 "hann": \(
|
Chris@266
|
107 compareUsing close (vec.list (win.hann 10)) [
|
Chris@266
|
108 0, 0.0955, 0.3455, 0.6545, 0.9045,
|
Chris@266
|
109 1.0000, 0.9045, 0.6545, 0.3455, 0.0955,
|
Chris@266
|
110 ] and
|
Chris@266
|
111 compareUsing close
|
Chris@266
|
112 (vec.list (win.windowFunction (Hann ()) [ Symmetric true ] 10)) [
|
Chris@266
|
113 0, 0.1170, 0.4132, 0.7500, 0.9698,
|
Chris@266
|
114 0.9698, 0.7500, 0.4132, 0.1170, 0,
|
Chris@266
|
115 ]
|
Chris@266
|
116 ),
|
Chris@266
|
117
|
Chris@266
|
118 "hamming": \(
|
Chris@266
|
119 compareUsing close (vec.list (win.hamming 10)) [
|
Chris@266
|
120 0.0800, 0.1679, 0.3979, 0.6821, 0.9121,
|
Chris@266
|
121 1.0000, 0.9121, 0.6821, 0.3979, 0.1679,
|
Chris@266
|
122 ] and
|
Chris@266
|
123 compareUsing close
|
Chris@266
|
124 (vec.list (win.windowFunction (Hamming ()) [ Symmetric true ] 10)) [
|
Chris@266
|
125 0.0800, 0.1876, 0.4601, 0.7700, 0.9723,
|
Chris@266
|
126 0.9723, 0.7700, 0.4601, 0.1876, 0.0800,
|
Chris@266
|
127 ]
|
Chris@266
|
128 ),
|
Chris@266
|
129
|
Chris@266
|
130 "blackman": \(
|
Chris@266
|
131 compareUsing close (vec.list (win.blackman 10)) [
|
Chris@266
|
132 0, 0.0402, 0.2008, 0.5098, 0.8492,
|
Chris@266
|
133 1.0000, 0.8492, 0.5098, 0.2008, 0.0402,
|
Chris@266
|
134 ] and
|
Chris@266
|
135 compareUsing close
|
Chris@266
|
136 (vec.list (win.windowFunction (Blackman ()) [ Symmetric true ] 10)) [
|
Chris@266
|
137 0, 0.0509, 0.2580, 0.6300, 0.9511,
|
Chris@266
|
138 0.9511, 0.6300, 0.2580, 0.0509, 0,
|
Chris@266
|
139 ]
|
Chris@266
|
140 ),
|
Chris@266
|
141
|
Chris@266
|
142 "blackmanHarris": \(
|
Chris@266
|
143 compareUsing close (vec.list (win.blackmanHarris 10)) [
|
Chris@266
|
144 0.0001, 0.0110, 0.1030, 0.3859, 0.7938,
|
Chris@266
|
145 1.0000, 0.7938, 0.3859, 0.1030, 0.0110,
|
Chris@266
|
146 ] and
|
Chris@266
|
147 compareUsing close
|
Chris@266
|
148 (vec.list (win.windowFunction (BlackmanHarris ()) [ Symmetric true ] 10)) [
|
Chris@266
|
149 0.0001, 0.0151, 0.1470, 0.5206, 0.9317,
|
Chris@266
|
150 0.9317, 0.5206, 0.1470, 0.0151, 0.0001,
|
Chris@266
|
151 ]
|
Chris@266
|
152 ),
|
Chris@266
|
153
|
Chris@266
|
154 "degenerate": \(
|
Chris@266
|
155 all id (map do type:
|
Chris@266
|
156 f = functions[type];
|
Chris@266
|
157 periodic = f;
|
Chris@266
|
158 symmetric = win.windowFunction type [ Symmetric true ];
|
Chris@266
|
159 (compare (vec.list (periodic 0)) [] and
|
Chris@266
|
160 compare (vec.list (periodic 1)) [1] and
|
Chris@266
|
161 compare (vec.list (symmetric 0)) [] and
|
Chris@266
|
162 compare (vec.list (symmetric 1)) [1])
|
Chris@266
|
163 or (eprintln "** failed window type: \(type)"; false)
|
Chris@266
|
164 done (keys functions));
|
Chris@266
|
165 ),
|
Chris@266
|
166
|
Chris@265
|
167 ] is hash<string, () -> boolean>;
|
Chris@265
|
168
|