1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75function [y, bmw, mcWall, snrAll, b, z,mcAdapt] = ...
76 gjbf(x, fs, spos, mpos, c, p, q, mu, order, beta, phi, psi, K, ...
77 xPrev, bp, zp, bw1, mw1, snrThresh, ...
78 snrRate, snr1, bmF, mcWForce,iw)
79
80
81if nargin == 23
82 iw = 0;
83end
84if isempty(x) || ~isreal(x) || ~all(all(isfinite(x)))
85 error('x must be a real matrix')
86elseif isempty(fs) || ~isreal(fs) || ~isscalar(fs) || ~isfinite(fs) ...
87 || fs <= 0
88 error('fs must be positive real scalar');
89elseif ~isreal(spos) || ~all(isfinite(spos)) || size(spos,1) ~= 3 || ...
90 size(spos,2) ~= 1 || length(size(spos)) ~= 2
91 error('spos must be a real 3x1 vector');
92elseif ~isreal(mpos) || ~all(all(isfinite(mpos))) || size(mpos,1) ~= 3
93 error('mpos must be real with 3 rows')
94elseif ~isreal(c) || ~isscalar(c) || ~isfinite(c) || c <= 0
95 error('c must be positive real scalar');
96elseif isempty(p) || ~isscalar(p) || ~isreal(p) || ...
97 ~isfinite(p) || p < 0 || abs(mod(p,floor(p))) > 0
98 error('p must be a positive integer');
99elseif isempty(q) || ~isscalar(q) || ~isreal(q) || ...
100 ~isfinite(q) || q < 0 || abs(mod(q,floor(q))) > 0
101 error('q must be a positive integer');
102elseif isempty(mu) || ~isscalar(mu) || ~isreal(mu) || ...
103 ~isfinite(mu)
104 error('mu must be a real scalar');
105elseif isempty(order) || ~isscalar(order) || ~isreal(order) || ...
106 ~isfinite(order) || order < 0 || ...
107 abs(mod(order,floor(order))) > 0
108 error('order must be a positive integer');
109elseif isempty(beta) || ~isscalar(beta) || ~isreal(beta) || ...
110 ~isfinite(beta) || beta < 0 || beta > 1
111 error('beta must be a real scalar in [0,1]');
112elseif ~isempty(phi) && (length(size(phi))~=2 || ...
113 ~isreal(phi) || ~all(all(isfinite(phi))))
114 error('phi must be a real matrix')
115elseif ~isempty(psi) && (length(size(psi))~=2 || ...
116 ~isreal(psi) || ~all(all(isfinite(psi))))
117 error('psi must be a real matrix')
118elseif xor(isempty(phi), isempty(psi))
119 error('phi and psi must both be specified or both empty')
120elseif ~isempty(K) && ...
121 (~isscalar(K) || ~isreal(K) || ~isfinite(K) || K < 0)
122 error('K must be a real positive scalar');
123elseif isempty(xPrev) || ~isreal(xPrev) || ~all(all(isfinite(xPrev)))
124 error('xPrev must be a real matrix')
125elseif ~isvector(bp) || ~isreal(bp) || ~all(isfinite(bp))
126 error('bp must be a real vector');
127elseif isempty(zp) || ~isreal(zp) || ~all(all(isfinite(zp)))
128 error('zp must be a real matrix')
129elseif ~isempty(bw1) && ...
130 (~isreal(bw1) || ~all(all(isfinite(bw1))))
131 error('bw1 must be a real matrix')
132elseif ~isempty(mw1) && ...
133 (~isreal(mw1) || ~all(all(isfinite(mw1))))
134 error('mw1 must be a real matrix')
135elseif ~isempty(snrThresh) && ...
136 (~isreal(snrThresh) || ...
137 ~isscalar(snrThresh) || ~isfinite(snrThresh))
138 error('snrThresh must be a positive real scalar')
139elseif ~isempty(snrRate) && ...
140 (~isreal(snrRate) || ...
141 ~isscalar(snrRate) || ~isfinite(snrRate) || snrRate <= 0)
142 error('snrRate must be a positive integer')
143elseif xor(isempty(snrThresh), isempty(snrRate))
144 error(['snrThresh and snrRate must both be specified or' ...
145 ' both empty'])
146end
147
148
149[N, M] = size(x);
150
151if isempty(snrRate)
152 snrAll = [];
153else
154 snrAll = zeros(N, M);
155end
156
157
158
159[xShift,wghts] = delaytracking(x, xPrev, fs, spos, mpos, c, iw);
160b = sum(xShift, 2);
161
162
163if isempty(phi)&& isempty(psi)
164 z = diff(xShift, [], 2);
165 mcAdapt = [];
166 bmw=[];
167else
168
169
170 for k=1:size(x,2)
171 xShift(:,k) = wghts(k)*[xPrev(end-p+1:end, k); ...
172 x(1:end-p, k)];
173 end
174
175 [z,bmw, mcAdapt, snrAll] = ...
176 bmlms(xShift, b, mu, order, beta, phi, psi, bp, ...
177 bw1, bmF, snrThresh, snrRate, snr1);
178end
179
180
181
182
183b = [bp(end-q+1:end); b(1:end-q)];
184
185[y, mcWall] = mclms(z, b, mu, order, beta, zp, mw1, ...
186 mcWForce, mcAdapt, K);
187
188end