spectrogram/
spectrogram.rs

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];