1%% Multiple-Input Canceller LMS Filter
 2
 3%% Function Declaration
 4function [y, mcWall] = mclms(z, b, mu, order, beta, zp, mw1, ...
 5    mcf, mcAdapt, K)   
 6
 7%% Argument Error Checking
 8narginchk(10, 10);
 9if ~isreal(z) || length(size(z)) ~= 2 || ~all(all(isfinite(z)))
10    error('z must be a real matrix');
11elseif ~isvector(b) || ~isreal(b) || ~all(isfinite(b))
12    error('b must be a real vector');
13elseif isempty(mu) || ~isscalar(mu) || ~isreal(mu) || ~isfinite(mu)
14    error('mu must be a real scalar');
15elseif isempty(order) || ~isscalar(order) || ~isreal(order) || ...
16        ~isfinite(order) || order < 0 || ...
17    abs(mod(order,floor(order))) > 0
18    error('order must be a positive integer'); 
19elseif isempty(beta) || ~isscalar(beta) || ~isreal(beta) || ...
20        ~isfinite(beta) || beta < 0 || beta > 1
21    error('beta must be a real scalar in [0,1]');
22elseif length(size(zp)) ~= 2 || ~isreal(zp) || ...
23        ~all(all(isfinite(zp)))
24    error('zp must be a real matrix');
25elseif ~isempty(mw1) && ...
26    (length(size(mw1)) ~= 2 || ~isreal(mw1) || ...
27        ~all(all(isfinite(mw1))))
28    error('mw1 must be a real matrix');
29elseif ~isempty(mcf) && ...
30    (~isreal(mcf) || length(size(mcf)) ~= 3 || ...
31     size(mcf,1) ~= order || ...
32     size(mcf,2) ~= size(z,2) || ...
33     ~all(all(all(isfinite(mcf)))))
34    error('mcf must be a real cubic matrix');
35elseif ~isempty(mcAdapt) && ...
36    (~isreal(mcAdapt) || ~all(all(isfinite(mcAdapt))))
37    error('mcAdapt must be a real matrix');
38elseif ~isempty(K) && ...
39    (~isscalar(K) || ~isreal(K) ||  ~isfinite(K) || K < 0)
40    error('K must be a real positive scalar');
41end
42
43
44
45if isempty(zp),  zp = zeros(order, size(z,2));  end
46
47mcWall = zeros(order, size(z,2), length(b));
48
49% initial targmc
50y = zeros(size(b));
51if ~isempty(mw1)
52w = mw1; else w = zeros(order, size(z,2)); 
53end
54
55
56% ord--one for each track of BM
57for n = 1:length(b)   
58% calculate targmc output and ready to opt
59[zWin,y,w1]=targmc(zp,z,b,n,order,w,y);
60% check mcf
61 if ~isempty(mcf), w = mcf(:,:,n); continue, end
62 
63% Tap update. If mcAdapt specified, adapt only requested columns
64[w]=optwmc(zWin,n,w1,mcAdapt,mu,order,beta,z);
65% NCAF (Norm-Constrained Adaptive Filter)
66[w]=NCAF(K,w,order,n,mcAdapt);
67% Save the taps used on this iteration
68mcWall(:,:,n) = w;
69end  % function mclms