1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20function XSF = delaytracking(x, xPrev, fs, spos, mpos, c, iw)
21
22
23if nargin == 6
24 iw = 0;
25end
26if isempty(x)||~isreal(x)||~all(all(isfinite(x)))
27 error('x must be a real matrix')
28elseif isempty(xPrev)||~isreal(xPrev)||~all(all(isfinite(xPrev)))
29 error('xPrev must be a real matrix')
30elseif isempty(fs)||~isreal(fs)||~isscalar(fs)||~isfinite(fs)||fs <= 0
31 error('fs must be positive real scalar');
32elseif isempty(spos)||~isreal(spos)||~all(isfinite(spos))||size(spos,1)~= 3 ...
33 ||size(spos,2)~= 1||length(size(spos))~= 2
34 error('spos must be a real 3x1 vector');
35elseif ~isreal(mpos) || ~all(all(isfinite(mpos))) || size(mpos,1) ~= 3
36 error('mpos must be a real matrix with 3 rows')
37elseif isempty(c) || ~isreal(c) || ~isscalar(c) || ~isfinite(c) || ...
38 c <= 0
39 error('c must be positive real scalar');
40end
41
42
43
44N = size(x,1);
45M = size(x,2);
46xShift = zeros(N, M);
47
48
49
50
51
52
53
54
55
56
57
58
59
60dist = sqrt(sum((mpos-spos*ones(1,size(mpos,2))).^2, 1));
61
62if any(dist==0)
63 error('Cant have a source on top of a mic')
64end
65if iw == 1
66 wghts = arweights(dist);
67else
68 wghts = ones(size(dist));
69end
70
71
72
73
74
75t = (max(dist)-dist)/c;
76
77
78delays = round(t*fs);
79
80
81
82
83for k=1:size(x,2)
84 xShift(:,k) = wghts(k)*[xPrev(end-delays(k)+1:end, k);...
85 x(1:end-delays(k), k)];
86end
87
88
89XSF=xShift;
90
91end