1
2
3
4function [z,bmw,mcAdapt, snrAll] = bmlms(x, b, mu, order, ...
5 beta, phi, psi, bp, bw1, bmF, snrThresh, snrRate, snr1)
6
7
8narginchk(13, 13);
9if ~isreal(x) || length(size(x)) ~= 2 || ~all(all(isfinite(x)))
10 error('x must be a real matrix');
11elseif ~isvector(b) || ~isreal(b) || ~all(isfinite(b))
12 error('b must be a real vector');
13elseif ~isvector(bp) || ~isreal(bp) || ...
14 ~all(all(isfinite(bp)))
15 error('bp must be a real vector');
16elseif isempty(mu) || ~isscalar(mu) || ~isreal(mu) || ~isfinite(mu)
17 error('mu must be a real scalar');
18elseif isempty(order) || ~isscalar(order) || ~isreal(order) || ...
19 ~isfinite(order) || order < 0 || ...
20 abs(mod(order,floor(order))) > 0
21 error('order must be a positive integer');
22elseif isempty(beta) || ~isscalar(beta) || ~isreal(beta) || ...
23 ~isfinite(beta) || beta < 0 || beta > 1
24 error('beta must be a real scalar in [0,1]');
25elseif ~isempty(bw1) && (length(size(bw1)) ~= 2 || ...
26 ~isreal(bw1) || ~all(all(isfinite(bw1))))
27 error('bw1 must be a real matrix');
28elseif ~isempty(bmF) && ...
29 (~isreal(bmF) || length(size(bmF)) ~= 3 || ...
30 size(bmF,1) ~= order || size(bmF,2) ~= size(x,2) || ...
31 ~all(all(all(isfinite(bmF)))))
32 error('bmF must be a real cubic matrix');
33elseif ~isempty(snrThresh) && (~isscalar(snrThresh) || ...
34 ~isreal(snrThresh) || ~isfinite(snrThresh))
35 error('snrThresh must be a real scalar')
36elseif ~isempty(snrRate) && ...
37 (~isscalar(snrRate) || ~isreal(snrRate) || ...
38 ~isfinite(snrRate) || snrRate < 0 || ...
39 abs(mod(snrRate,floor(snrRate))) > 0)
40 error('snrRate must be a positive integer')
41elseif xor(isempty(snrThresh), isempty(snrRate))
42 error(['snrThresh and snrRate must both be specified or' ...
43 ' both empty'])
44elseif ~isempty(snr1) && (~isvector(snr1) || ~isreal(snr1))
45 error('snr1 must be a real vector');
46elseif ~isempty(phi) && (length(size(phi))~=2 || ~isreal(phi) || ...
47 ~all(all(isfinite(phi))))
48 error('phi must be a real matrix')
49elseif ~isempty(psi) && (length(size(psi))~=2 || ~isreal(psi) || ...
50 ~all(all(isfinite(psi))))
51 error('psi must be a real matrix')
52end
53
54
55
56
57[N, nmic] = size(x);
58if nargin == 3, bp = zeros(order, 1); end
59
60bmw = zeros(order, nmic, length(b));
61if ~isempty(bw1)
62 w=bw1; else w= zeros(order, nmic);
63end
64z=zeros(length(b), nmic);
65
66
67snrAll = zeros(N, nmic);
68mcAdapt = zeros(length(b),nmic);
69snr=zeros(1, nmic);
70
71if ~isempty(snrThresh)
72
73
74 if isempty(snr1)
75 snr = Inf*ones(1, size(z,2));
76 else
77 snr = snr1;
78 end
79
80 amcInds=gt(snr,snrThresh);
81end
82
83
84
85
86for n = 1:length(b)
87
88[bWin,z,w1]=targbm(bp,b,x,n,order,w,z);
89
90
91if ~isempty(bmF), w= bmF(:,:,n); continue, end
92
93
94
95[snr,amcInds,mcAdapt]=AMC(b,z,n,snrThresh,snrRate,snr,amcInds,mcAdapt);
96
97snrAll(n,:) = snr;
98
99
100[w]=optwbm(bWin,n,w1,z,beta,mu,snrThresh,amcInds);
101
102[w]=CCAF(phi,psi,order,w,snrThresh,amcInds);
103
104bmw(:,:,n)=w;
105
106end
107
108end