1use std::fs::File;
2use std::io::{BufWriter, Result, Write};
3
4use microspectrogram::{Spectrogram, Window};
5
6fn main() -> Result<()> {
7 let spec = Spectrogram::<16>::new(1, Window::Hann);
8 let mut transformed = [0.0; 354];
9 SPECTRUM.iter().enumerate().for_each(|(i, x)| {
10 transformed[i] = 1.0 / x.exp();
11 });
12 let mut out = spec.compute(&transformed);
13
14 let mut min = f32::MAX;
15 let mut max = f32::MIN;
16 for row in out.iter_mut() {
17 for v in row.iter_mut() {
18 let new_v = v.ln();
19 if new_v < min {
20 min = new_v;
21 };
22 if new_v > max {
23 max = new_v;
24 };
25 *v = new_v;
26 }
27 }
28 let height = out.len();
29 let width = out[0].len();
30
31 let mut f = BufWriter::new(File::create("microspectrogram.ppm")?);
32 writeln!(f, "P3")?;
33 writeln!(f, "{} {}", width, height)?;
34 writeln!(f, "255")?;
35 for row in out.iter().rev() {
36 for v in row.iter() {
37 let idx = (49.0 * (v - min) / (max - min)) as usize;
38 let col = VIRIDIS[idx];
39 write!(f, "{} {} {} ", col[0], col[1], col[2])?;
40 }
41 writeln!(f)?;
42 }
43 Ok(())
44}
45
46#[allow(clippy::excessive_precision)]
47const SPECTRUM: [f32; 354] = [
48 6.56001728e-01,
49 6.39518880e-01,
50 6.23481755e-01,
51 6.07988413e-01,
52 5.90667605e-01,
53 5.75688330e-01,
54 5.60634769e-01,
55 5.45569321e-01,
56 5.30432557e-01,
57 5.13245466e-01,
58 4.98453395e-01,
59 4.84112991e-01,
60 4.68610734e-01,
61 4.55687729e-01,
62 4.42830098e-01,
63 4.28299518e-01,
64 4.15655833e-01,
65 4.02875460e-01,
66 3.88309222e-01,
67 3.75540735e-01,
68 3.62296810e-01,
69 3.46134883e-01,
70 3.28020687e-01,
71 3.09680659e-01,
72 2.87932333e-01,
73 2.58523509e-01,
74 2.23614459e-01,
75 1.83249756e-01,
76 1.44596631e-01,
77 1.04214099e-01,
78 5.87503213e-02,
79 1.74852572e-02,
80 -1.60063923e-02,
81 -3.87115377e-02,
82 -4.91682066e-02,
83 -4.95485571e-02,
84 -4.36768954e-02,
85 -3.36570354e-02,
86 -2.51258912e-02,
87 -2.35658596e-02,
88 -3.17225962e-02,
89 -4.64760378e-02,
90 -6.01419145e-02,
91 -6.42960557e-02,
92 -5.38304724e-02,
93 -2.91374010e-02,
94 4.89803095e-03,
95 4.20980984e-02,
96 7.81927721e-02,
97 1.12049915e-01,
98 1.44453999e-01,
99 1.76332131e-01,
100 2.07898255e-01,
101 2.39089973e-01,
102 2.73785075e-01,
103 3.07446099e-01,
104 3.35098774e-01,
105 3.58971714e-01,
106 3.77112653e-01,
107 3.87711953e-01,
108 3.89908478e-01,
109 3.84101594e-01,
110 3.74179793e-01,
111 3.61984804e-01,
112 3.48764650e-01,
113 3.33547656e-01,
114 3.18277176e-01,
115 3.04718273e-01,
116 2.89353299e-01,
117 2.73883134e-01,
118 2.60342060e-01,
119 2.47318025e-01,
120 2.32963951e-01,
121 2.18363839e-01,
122 2.03460634e-01,
123 1.88491462e-01,
124 1.75618973e-01,
125 1.61220327e-01,
126 1.46058603e-01,
127 1.30297827e-01,
128 1.13681262e-01,
129 9.54886194e-02,
130 7.65346814e-02,
131 5.91782157e-02,
132 3.92704297e-02,
133 1.93127228e-02,
134 -6.44984137e-04,
135 -2.30523864e-02,
136 -4.31509419e-02,
137 -6.29535371e-02,
138 -8.27133429e-02,
139 -1.02269899e-01,
140 -1.23493460e-01,
141 -1.42823589e-01,
142 -1.62339138e-01,
143 -1.81735233e-01,
144 -2.01641237e-01,
145 -2.24369560e-01,
146 -2.46883935e-01,
147 -2.66556379e-01,
148 -2.85209009e-01,
149 -3.05091834e-01,
150 -3.22494655e-01,
151 -3.39416095e-01,
152 -3.57901132e-01,
153 -3.76685695e-01,
154 -3.95741258e-01,
155 -4.14076532e-01,
156 -4.29236473e-01,
157 -4.44321533e-01,
158 -4.61266150e-01,
159 -4.77554663e-01,
160 -4.92994518e-01,
161 -5.07885243e-01,
162 -5.22269625e-01,
163 -5.36768113e-01,
164 -5.51765811e-01,
165 -5.66613746e-01,
166 -5.80670076e-01,
167 -5.93421329e-01,
168 -6.05766082e-01,
169 -6.18167887e-01,
170 -6.30305824e-01,
171 -6.42693366e-01,
172 -6.55865382e-01,
173 -6.69265607e-01,
174 -6.83036675e-01,
175 -6.98509811e-01,
176 -7.13281676e-01,
177 -7.26760349e-01,
178 -7.40060732e-01,
179 -7.52512458e-01,
180 -7.65974491e-01,
181 -7.80054593e-01,
182 -7.93162424e-01,
183 -8.07771452e-01,
184 -8.21774295e-01,
185 -8.33391627e-01,
186 -8.45586617e-01,
187 -8.57617581e-01,
188 -8.68678650e-01,
189 -8.80341149e-01,
190 -8.91349921e-01,
191 -9.03114639e-01,
192 -9.14784270e-01,
193 -9.26149620e-01,
194 -9.36906409e-01,
195 -9.46914383e-01,
196 -9.56853419e-01,
197 -9.67387940e-01,
198 -9.78019927e-01,
199 -9.88016015e-01,
200 -9.96939990e-01,
201 -1.00564883e+00,
202 -1.01524080e+00,
203 -1.02326976e+00,
204 -1.02991401e+00,
205 -1.03665334e+00,
206 -1.04517557e+00,
207 -1.05404249e+00,
208 -1.06444271e+00,
209 -1.07627517e+00,
210 -1.08589685e+00,
211 -1.09271939e+00,
212 -1.09677488e+00,
213 -1.10051658e+00,
214 -1.10632287e+00,
215 -1.11329398e+00,
216 -1.12081779e+00,
217 -1.12928059e+00,
218 -1.13766019e+00,
219 -1.14562378e+00,
220 -1.15227397e+00,
221 -1.15729579e+00,
222 -1.16048122e+00,
223 -1.16172330e+00,
224 -1.16234137e+00,
225 -1.16307236e+00,
226 -1.16232524e+00,
227 -1.15975024e+00,
228 -1.15537026e+00,
229 -1.14972443e+00,
230 -1.14540983e+00,
231 -1.14408370e+00,
232 -1.14552275e+00,
233 -1.14664597e+00,
234 -1.14645240e+00,
235 -1.14302670e+00,
236 -1.13752350e+00,
237 -1.13073747e+00,
238 -1.12381305e+00,
239 -1.11727408e+00,
240 -1.11358519e+00,
241 -1.11275911e+00,
242 -1.11383055e+00,
243 -1.11642848e+00,
244 -1.11905867e+00,
245 -1.12217449e+00,
246 -1.12515022e+00,
247 -1.12857762e+00,
248 -1.13421666e+00,
249 -1.14057225e+00,
250 -1.14832698e+00,
251 -1.16091421e+00,
252 -1.17661386e+00,
253 -1.19074286e+00,
254 -1.20580746e+00,
255 -1.22706974e+00,
256 -1.25804114e+00,
257 -1.29459045e+00,
258 -1.32349370e+00,
259 -1.34450127e+00,
260 -1.36700139e+00,
261 -1.39980662e+00,
262 -1.43988606e+00,
263 -1.46135210e+00,
264 -1.44977348e+00,
265 -1.42665190e+00,
266 -1.40722346e+00,
267 -1.38645530e+00,
268 -1.36301789e+00,
269 -1.33227190e+00,
270 -1.31765090e+00,
271 -1.34799065e+00,
272 -1.36495361e+00,
273 -1.26456653e+00,
274 -1.06616617e+00,
275 -8.75579975e-01,
276 -6.88228460e-01,
277 -4.77123712e-01,
278 -2.14553841e-01,
279 7.43862950e-02,
280 3.76845219e-01,
281 7.04257007e-01,
282 1.03222786e+00,
283 1.32115017e+00,
284 1.51039473e+00,
285 1.63272413e+00,
286 1.71992544e+00,
287 1.76785407e+00,
288 1.77145106e+00,
289 1.73881074e+00,
290 1.68161106e+00,
291 1.61670929e+00,
292 1.54394051e+00,
293 1.45851763e+00,
294 1.36534363e+00,
295 1.27270896e+00,
296 1.18273079e+00,
297 1.09254314e+00,
298 1.00374168e+00,
299 9.15403780e-01,
300 8.28175728e-01,
301 7.42458678e-01,
302 6.53394742e-01,
303 5.66901638e-01,
304 4.89457213e-01,
305 4.11959301e-01,
306 3.40153276e-01,
307 2.79049067e-01,
308 2.21609695e-01,
309 1.70100919e-01,
310 1.24885756e-01,
311 8.66213999e-02,
312 5.37879351e-02,
313 2.56934996e-02,
314 7.56345634e-03,
315 -6.03407611e-03,
316 -1.83400015e-02,
317 -2.89185013e-02,
318 -3.88809126e-02,
319 -5.04954715e-02,
320 -6.49329448e-02,
321 -8.07174930e-02,
322 -9.54719250e-02,
323 -1.08035379e-01,
324 -1.18962534e-01,
325 -1.25701870e-01,
326 -1.27460992e-01,
327 -1.24128962e-01,
328 -1.18205399e-01,
329 -1.11870581e-01,
330 -1.09239823e-01,
331 -1.10667326e-01,
332 -1.15408633e-01,
333 -1.23938787e-01,
334 -1.32568387e-01,
335 -1.34473705e-01,
336 -1.29066784e-01,
337 -1.17964114e-01,
338 -1.07746947e-01,
339 -1.05486238e-01,
340 -1.03316655e-01,
341 -9.31700118e-02,
342 -6.95038869e-02,
343 -3.64633093e-02,
344 -5.61925628e-03,
345 2.44902448e-02,
346 6.08969247e-02,
347 1.00252510e-01,
348 1.33852916e-01,
349 1.55739714e-01,
350 1.66094758e-01,
351 1.52509111e-01,
352 1.16951088e-01,
353 8.85878501e-02,
354 8.49695493e-02,
355 1.02367994e-01,
356 1.39401280e-01,
357 1.97237364e-01,
358 2.70718499e-01,
359 3.44355231e-01,
360 4.05013149e-01,
361 4.60421581e-01,
362 5.16219656e-01,
363 5.79758730e-01,
364 6.49893536e-01,
365 7.29145734e-01,
366 8.21781625e-01,
367 9.34535035e-01,
368 1.04037406e+00,
369 1.12590431e+00,
370 1.18668584e+00,
371 1.20499994e+00,
372 1.22049490e+00,
373 1.25609982e+00,
374 1.30005408e+00,
375 1.35125229e+00,
376 1.41058752e+00,
377 1.45186582e+00,
378 1.45545997e+00,
379 1.45960520e+00,
380 1.48264504e+00,
381 1.52707285e+00,
382 1.59648386e+00,
383 1.67557300e+00,
384 1.74437782e+00,
385 1.80493676e+00,
386 1.87128713e+00,
387 1.95064965e+00,
388 2.04829872e+00,
389 2.16489994e+00,
390 2.29402598e+00,
391 2.41544695e+00,
392 2.55541116e+00,
393 2.70791276e+00,
394 2.85826712e+00,
395 3.02412282e+00,
396 3.16961971e+00,
397 3.29862255e+00,
398 3.43391946e+00,
399 3.53807608e+00,
400 3.61787838e+00,
401 3.66924922e+00,
402];
403
404const VIRIDIS: [[u8; 3]; 50] = [
405 [68, 1, 84],
406 [69, 8, 91],
407 [71, 15, 98],
408 [71, 22, 105],
409 [72, 29, 111],
410 [71, 37, 117],
411 [71, 43, 122],
412 [70, 49, 126],
413 [68, 55, 129],
414 [66, 62, 133],
415 [64, 68, 135],
416 [61, 74, 137],
417 [59, 80, 138],
418 [57, 85, 139],
419 [54, 91, 140],
420 [51, 96, 141],
421 [49, 101, 141],
422 [47, 106, 141],
423 [44, 112, 142],
424 [42, 117, 142],
425 [40, 122, 142],
426 [39, 126, 142],
427 [37, 131, 141],
428 [35, 137, 141],
429 [33, 141, 140],
430 [31, 146, 140],
431 [30, 151, 138],
432 [30, 156, 137],
433 [31, 161, 135],
434 [33, 166, 133],
435 [36, 170, 130],
436 [41, 175, 127],
437 [48, 180, 122],
438 [56, 185, 118],
439 [64, 189, 114],
440 [73, 193, 109],
441 [85, 198, 102],
442 [96, 201, 96],
443 [107, 205, 89],
444 [119, 208, 82],
445 [131, 211, 75],
446 [146, 215, 65],
447 [159, 217, 56],
448 [173, 220, 48],
449 [186, 222, 39],
450 [202, 224, 30],
451 [215, 226, 25],
452 [228, 227, 24],
453 [241, 229, 28],
454 [253, 231, 36],
455];