diff src/scheme/old/genfilter.scm @ 0:bf79fb79ee13

Initial Mercurial check in.
author samer
date Tue, 17 Jan 2012 17:50:20 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/scheme/old/genfilter.scm	Tue Jan 17 17:50:20 2012 +0000
@@ -0,0 +1,112 @@
+;;; Preamble
+(load "audio.scm")
+(load "lineout.scm")
+(load "functions.scm")
+
+(import "samer.mds.*")
+
+;;; transfer filter fn to vector of values
+(define (set-filter F fn)
+	(define f (.mat F))
+	(for-each
+		(lambda (i) (.set f 0 i (fn i)))
+		(range 0 N))
+	(.changed F)
+)
+
+;; convert vector of values into a filter fn
+(define (filter-fn F)
+	(let ((mat (.mat F)))
+		(lambda (i) (.get mat 0 i))))
+
+;; returns fn f(i) that returns 1 if d'th coordinate of P(i) <op> th
+;; eg (coor-test P 2 > 0.5) is function which returns P(i,2) > 0.5
+(define (coor-test P d op th)
+	(lambda (i) (if (op (.get P i d) th) 1.0 0.0)))
+
+
+;;; set up tasks for ICA domain filtering using f as a function
+;;; which returns (f i) as the scaling factor for the ith ICA component
+;;; source is an AudioSource.
+(define (direct-recon source N hop f)
+	(define x (linein source N hop))
+	(define W (Matrix. "W" N N))		; ICA matrix
+	(define K (Matrix. "K" N N))			; total filtering matrix
+	(define z (VVector. "z" N))				; reconstruction
+	(addtask (Ops.times z K x) (Ops.update z))
+	(overlap-and-add z hop)
+	(on-change W (.assign K (total-matrix W f)))
+	(matexec W "load")
+)
+
+(define (ica-recon s A sink hop)
+	(define F (VVector. "F" N))			; the source domain filter
+	(define z (VVector. "z" N))
+	(addtasks (Ops.timesEquals s F) (Ops.times z A s))
+	(overlap-and-add sink z hop))
+
+
+(define (recon source N hop sink)
+	(define x (norm (linein source N hop)))
+	(define ica (mk-ica x laplace-spec))
+	(define s (.output ica))
+	(define F (VVector. "F" N))			; the source domain filter
+	(define W (.getWeightMatrix ica))
+	(define A (.getBasisMatrix ica))
+	(define z (VVector. "z" N))
+	(define order (Matrix. "order" 5 512))
+
+	(addtasks (Ops.timesEquals s F) (Ops.times z A s))
+	(overlap-and-add sink z hop)
+
+	(on-change W (exec ica "basis"))
+	(matexec W "load")
+)
+
+;; returns total transformation matrix  formed by filtering
+;; in the ICA domain. f is a function which returns the scaling
+;; factor for the i'th component, ie (f i) is a scalar.
+(define (total-matrix W f)
+	(define D (Jama.Matrix. N N 0.0))
+	(for-each
+		(lambda (i) (.set D i i (f i)))
+      (range 0 N))
+	(.times (.inverse W) (.times D W))
+)
+
+; eg (total-matrix W (coor-test P 1 > 0.0))
+; filters out all components whos MDS y-coor <= 0
+
+;; transfer values from G to F reordered by order
+(define-method (rank-filter F order G)
+	(rank-filter F order G 0 (.size G)))
+
+(define-method (rank-filter F order G start end)
+	(Mathx.set F (Zero.))
+	(let ((f (.mat F)) (g (.mat G)) (I (.mat order)))
+		(for-each
+			(lambda (i) (.set f 0  (.get I 0 i)  (.get g 0 i)))
+			(range start end)))
+	(.changed F)
+)
+
+;;; filter is a certain spherically symmetric kernel centred on
+;;; a particular component. Geometry directly from correlation
+;;; matrix (not from MDS configuation)
+(define (proximity-filter R F fn)
+	(ProximityFilter. R F (VFunction. "proximity kernel" fn)) f)
+
+(define (geometric-filter P f)
+	(define n (.getRowDimension P))
+	(define E (.getColumnDimension P))
+	(define off (VDouble. "offset" 0.0))
+	(define norm	(VVector. "normal" E))
+	(define hp	(LogisticHyperplane. (.array norm) (.value$ off)))
+	(define gf		(GeometricFilter. P f hp))
+	(define obs (observer (.setOffset hp (.value$ off)) (.run gf) (.changed f)))
+	(.addObserver P obs)
+	(.addObserver off obs)
+	(.addObserver norm obs)
+	f)
+
+