Chris@12
|
1
|
Chris@12
|
2 program silvet;
|
Chris@12
|
3
|
Chris@12
|
4 { prepareTimeFrequency } = load timefreq;
|
Chris@13
|
5 { loadTemplates, extractRanges } = load templates;
|
Chris@14
|
6
|
Chris@14
|
7 em = load em;
|
Chris@12
|
8
|
Chris@12
|
9 mat = load may.matrix;
|
Chris@12
|
10 vec = load may.vector;
|
Chris@14
|
11 plot = load may.plot;
|
Chris@12
|
12
|
Chris@12
|
13 templates = loadTemplates ();
|
Chris@12
|
14
|
Chris@13
|
15 ranges = extractRanges templates;
|
Chris@13
|
16
|
Chris@13
|
17 eprintln "\nWe have \(length (keys templates)) instruments:";
|
Chris@13
|
18 for (sort (keys templates)) do k:
|
Chris@14
|
19 eprintln " * \(k) \(mat.size templates[k]) range \(ranges[k].lowest) -> \(ranges[k].highest)";
|
Chris@13
|
20 done;
|
Chris@12
|
21 eprintln "";
|
Chris@12
|
22
|
Chris@12
|
23 columns = prepareTimeFrequency "test.wav";
|
Chris@12
|
24
|
Chris@12
|
25 height = if empty? columns then 0 else vec.length (head columns) fi;
|
Chris@12
|
26
|
Chris@13
|
27 chunkSize = { rows = height, columns = 100 };
|
Chris@13
|
28
|
Chris@14
|
29 emdata = em.initialise ranges templates 88 chunkSize;
|
Chris@13
|
30
|
Chris@14
|
31 eprintln "initialised EM data: overall pitch range \(emdata.lowest) -> \(emdata.highest)";
|
Chris@13
|
32
|
Chris@12
|
33 chunkify cols =
|
Chris@12
|
34 if empty? cols then []
|
Chris@12
|
35 else
|
Chris@13
|
36 (mat.resizedTo chunkSize
|
Chris@13
|
37 (mat.fromColumns (take chunkSize.columns cols)))
|
Chris@13
|
38 :. \(chunkify (drop chunkSize.columns cols));
|
Chris@12
|
39 fi;
|
Chris@12
|
40
|
Chris@12
|
41 chunks = chunkify columns;
|
Chris@12
|
42
|
Chris@12
|
43 eprintln "we have \(length chunks) chunks of size \(mat.size (head chunks))";
|
Chris@12
|
44
|
Chris@26
|
45 oneIteration emdata chunk n =
|
Chris@28
|
46 (eprintln "E";
|
Chris@28
|
47 { estimate, q } = em.performExpectation emdata chunk;
|
Chris@28
|
48 eprintln "M";
|
Chris@26
|
49 newdata = em.performMaximisation emdata chunk q;
|
Chris@26
|
50 if (n % 6 == 0) then
|
Chris@26
|
51 \() (plot.plot [ Grid chunk ]);
|
Chris@26
|
52 \() (plot.plot [ Grid estimate ]);
|
Chris@26
|
53 fi;
|
Chris@26
|
54 newdata);
|
Chris@13
|
55
|
Chris@26
|
56 iterations = 6;
|
Chris@14
|
57
|
Chris@26
|
58 var d = emdata;
|
Chris@26
|
59 for [1..iterations] do i:
|
Chris@26
|
60 eprintln "iteration \(i)...";
|
Chris@26
|
61 d := oneIteration d (head chunks) i;
|
Chris@26
|
62 done;
|
Chris@14
|
63
|
Chris@28
|
64 eprintln "done, plotting pitch activation matrix";
|
Chris@28
|
65
|
Chris@28
|
66 \() (plot.plot [Grid d.pitches]);
|
Chris@28
|
67 \() (plot.plot [Contour d.pitches]);
|
Chris@14
|
68
|
Chris@14
|
69
|
Chris@14
|
70 ();
|
Chris@14
|
71
|
Chris@14
|
72
|