annotate src/scheme/genfilter.scm @ 8:5e3cbbf173aa tip

Reorganise some more
author samer
date Fri, 05 Apr 2019 22:41:58 +0100
parents bf79fb79ee13
children
rev   line source
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