samer@0
|
1 ;;; Preamble
|
samer@0
|
2 (load "audio.scm")
|
samer@0
|
3 (load "lineout.scm")
|
samer@0
|
4 (load "functions.scm")
|
samer@0
|
5
|
samer@0
|
6 (import "samer.mds.*")
|
samer@0
|
7
|
samer@0
|
8 ;;; transfer filter fn to vector of values
|
samer@0
|
9 (define (set-filter F fn)
|
samer@0
|
10 (define f (.mat F))
|
samer@0
|
11 (for-each
|
samer@0
|
12 (lambda (i) (.set f 0 i (fn i)))
|
samer@0
|
13 (range 0 N))
|
samer@0
|
14 (.changed F)
|
samer@0
|
15 )
|
samer@0
|
16
|
samer@0
|
17 ;; convert vector of values into a filter fn
|
samer@0
|
18 (define (filter-fn F)
|
samer@0
|
19 (let ((mat (.mat F)))
|
samer@0
|
20 (lambda (i) (.get mat 0 i))))
|
samer@0
|
21
|
samer@0
|
22 ;; returns fn f(i) that returns 1 if d'th coordinate of P(i) <op> th
|
samer@0
|
23 ;; eg (coor-test P 2 > 0.5) is function which returns P(i,2) > 0.5
|
samer@0
|
24 (define (coor-test P d op th)
|
samer@0
|
25 (lambda (i) (if (op (.get P i d) th) 1.0 0.0)))
|
samer@0
|
26
|
samer@0
|
27
|
samer@0
|
28 ;;; set up tasks for ICA domain filtering using f as a function
|
samer@0
|
29 ;;; which returns (f i) as the scaling factor for the ith ICA component
|
samer@0
|
30 ;;; source is an AudioSource.
|
samer@0
|
31 (define (direct-recon source N hop f sink)
|
samer@0
|
32 (define x (linein source N hop))
|
samer@0
|
33 (define W (Matrix. "W" N N)) ; ICA matrix
|
samer@0
|
34 (define K (Matrix. "K" N N)) ; total filtering matrix
|
samer@0
|
35 (define z (VVector. "z" N)) ; reconstruction
|
samer@0
|
36 (addtask (Ops.times z K x) (Ops.update z))
|
samer@0
|
37 (overlap-and-add sink z hop)
|
samer@0
|
38 (on-change W (.assign K (total-matrix W f)))
|
samer@0
|
39 (matexec W "load")
|
samer@0
|
40 )
|
samer@0
|
41
|
samer@0
|
42 (define (ica-recon s A sink hop)
|
samer@0
|
43 (define N (.size s))
|
samer@0
|
44 (define F (VVector. "F" N)) ; the source domain filter
|
samer@0
|
45 (define z (VVector. "z" N))
|
samer@0
|
46 (addtasks (Ops.timesEquals s F) (Ops.times z A s))
|
samer@0
|
47 (overlap-and-add sink z hop))
|
samer@0
|
48
|
samer@0
|
49
|
samer@0
|
50 (define (recon source N hop sink)
|
samer@0
|
51 (define x (norm (linein source N hop)))
|
samer@0
|
52 (define ica (mk-ica x laplace-spec))
|
samer@0
|
53 (define s (.output ica))
|
samer@0
|
54 (define F (VVector. "F" N)) ; the source domain filter
|
samer@0
|
55 (define W (.getWeightMatrix ica))
|
samer@0
|
56 (define A (.getBasisMatrix ica))
|
samer@0
|
57 (define z (VVector. "z" N))
|
samer@0
|
58 (define order (Matrix. "order" 5 512))
|
samer@0
|
59
|
samer@0
|
60 (addtasks (Ops.timesEquals s F) (Ops.times z A s))
|
samer@0
|
61 (overlap-and-add sink z hop)
|
samer@0
|
62
|
samer@0
|
63 (on-change W (exec ica "basis"))
|
samer@0
|
64 (matexec W "load")
|
samer@0
|
65 )
|
samer@0
|
66
|
samer@0
|
67 ;; returns total transformation matrix formed by filtering
|
samer@0
|
68 ;; in the ICA domain. f is a function which returns the scaling
|
samer@0
|
69 ;; factor for the i'th component, ie (f i) is a scalar.
|
samer@0
|
70 (define (total-matrix W f)
|
samer@0
|
71 (define D (Jama.Matrix. N N 0.0))
|
samer@0
|
72 (for-each
|
samer@0
|
73 (lambda (i) (.set D i i (f i)))
|
samer@0
|
74 (range 0 N))
|
samer@0
|
75 (.times (.inverse W) (.times D W))
|
samer@0
|
76 )
|
samer@0
|
77
|
samer@0
|
78 ; eg (total-matrix W (coor-test P 1 > 0.0))
|
samer@0
|
79 ; filters out all components whos MDS y-coor <= 0
|
samer@0
|
80
|
samer@0
|
81 ;; transfer values from G to F reordered by order
|
samer@0
|
82 (define-method (rank-filter F order G)
|
samer@0
|
83 (rank-filter F order G 0 (.size G)))
|
samer@0
|
84
|
samer@0
|
85 (define-method (rank-filter F order G start end)
|
samer@0
|
86 (Mathx.set F (Zero.))
|
samer@0
|
87 (let ((f (.mat F)) (g (.mat G)) (I (.mat order)))
|
samer@0
|
88 (for-each
|
samer@0
|
89 (lambda (i) (.set f 0 (.get I 0 i) (.get g 0 i)))
|
samer@0
|
90 (range start end)))
|
samer@0
|
91 (.changed F)
|
samer@0
|
92 )
|
samer@0
|
93
|
samer@0
|
94 ;;; filter is a certain spherically symmetric kernel centred on
|
samer@0
|
95 ;;; a particular component. Geometry directly from correlation
|
samer@0
|
96 ;;; matrix (not from MDS configuation)
|
samer@0
|
97 (define (proximity-filter R F fn)
|
samer@0
|
98 (ProximityFilter. R F (VFunction. "proximity kernel" fn)) f)
|
samer@0
|
99
|
samer@0
|
100 (define (geometric-filter P f)
|
samer@0
|
101 (define n (.getRowDimension P))
|
samer@0
|
102 (define E (.getColumnDimension P))
|
samer@0
|
103 (define off (VDouble. "offset" 0.0))
|
samer@0
|
104 (define norm (VVector. "normal" E))
|
samer@0
|
105 (define hp (LogisticHyperplane. (.array norm) (.value$ off)))
|
samer@0
|
106 (define gf (GeometricFilter. P f hp))
|
samer@0
|
107 (define obs (observer (.setOffset hp (.value$ off)) (.run gf) (.changed f)))
|
samer@0
|
108 (.addObserver P obs)
|
samer@0
|
109 (.addObserver off obs)
|
samer@0
|
110 (.addObserver norm obs)
|
samer@0
|
111 f)
|
samer@0
|
112
|
samer@0
|
113
|