From a57a8cae6ffe3bdc0102e322003ef1a6afed3890 Mon Sep 17 00:00:00 2001
From: Fredrik Bagge Carlson <fredrikb@control.lth.se>
Date: Fri, 25 Sep 2015 10:19:44 +0200
Subject: [PATCH] Preparations for particle filtering

---
 g_density.m      |  8 ++++++++
 pf.m             | 13 +++----------
 track_audio_pf.m | 13 +++++--------
 3 files changed, 16 insertions(+), 18 deletions(-)
 create mode 100644 g_density.m

diff --git a/g_density.m b/g_density.m
new file mode 100644
index 0000000..def884e
--- /dev/null
+++ b/g_density.m
@@ -0,0 +1,8 @@
+function r = g_density(y,xp,xr)
+sigma_v = 1;
+N = length(xp);
+v = xp - repmat(xr,1,N);
+az = atan2d(v(2,:),v(1,:));
+
+r = -0.5/sigma_v * (y-az).^2; %% This assumes gaussian noise, try to change to Laplacian noise for robustness
+end
\ No newline at end of file
diff --git a/pf.m b/pf.m
index 7850828..be40b21 100644
--- a/pf.m
+++ b/pf.m
@@ -1,27 +1,20 @@
-function [xp, w, expw] = pf( y, xp, w, expw, g_density, f)
+function [xp, w, expw] = pf(xr, y, xp, w, expw, g_density, f)
 % Particle filter for sound source tracking
 
 N = length(xp);
 
 % Resample
 if(1/sum(expw.^2) < N/2)
-    resampleInstants(t) = 1;
-    %         [~, j] = histc(rand(N,1), [0 cumsum(exp(w(:,t-1))')]);
     bins = [0 cumsum(expw')];
-    
     bins = bins./(bins(end));
     [~, j] = histc((rand(1)/N+0):1/N:1, bins);
-    
-    
-    xp = xp(j);
+    xp = xp(:,j);
     w = log(1/N)*ones(N,1);
-else
-    
 end
 
 % Time update
 xp = f(xp);
-w = w + g_density(y,xp);
+w = w + g_density(y,xp,xr);
 
 offset = max(w);
 normConstant = log(sum(exp(w-offset)))+offset;
diff --git a/track_audio_pf.m b/track_audio_pf.m
index 3fa60b5..3d11615 100644
--- a/track_audio_pf.m
+++ b/track_audio_pf.m
@@ -45,18 +45,15 @@ mObj  = manager(dObj,'localization',par_sub);
 %% Particle filter parameters
 sigma_w = 1; % State noise std
 sigma_v = 1; % Measurement noise std
+sigma_w0 = 10;
 fs = 24414;
 chunks = 2048;
 dt = chunks/fs;
 
-Q = [1/4*dt^4, 1/2*dt^3; 1/2*dt^3, dt^2]*sigma_w;                       % Process noise covariance
-R = 1;                                  % Measurement noise covariance
-x = [0; 0];                             % Initial state
-
-A = [1, dt; 0, 1];
-Npart = 100;
-f = @(x) A*x + sigma_w*diag(Q)*randn(1,size(x,2));
-g_density = @(y,x) -0.5/sigma_v * (y-x(1,:)).^2; %% This assumes gaussian noise, try to change to Laplacian noise for robustness
+Npart = 500;
+xp = sigma_w0*randn(2,Npart);
+f = @(x) x + sigma_w*randn(size(x));
+% g_density = @(y,x) -0.5/sigma_v * (y-x(1,:)).^2; %% This assumes gaussian noise, try to change to Laplacian noise for robustness
 
 %% Initialization
 
-- 
GitLab