1%% Blocking Matrix LMS Filter
  2
  3%% Function Declaration
  4function [z,bmw,mcAdapt, snrAll] = bmlms(x, b, mu, order, ...
  5    beta, phi, psi, bp, bw1, bmF, snrThresh, snrRate, snr1)
  6
  7%% Argument Error Checking
  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%% Adaptive Filtering
 55
 56%% inital values of BMLMS
 57[N, nmic] = size(x);  % length of tracks, number of mics
 58if nargin == 3,  bp = zeros(order, 1);  end 
 59% initial targbm
 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% initial AMC
 67snrAll = zeros(N, nmic);
 68mcAdapt = zeros(length(b),nmic); % Matrix of columns to adapt in MC
 69snr=zeros(1, nmic);
 70% amcInds=gt(snr,snrThresh);
 71if ~isempty(snrThresh)
 72    % Use snrInit if supplied; otherwise set to infinity so that we
 73    % always adapt over the first power window.
 74    if isempty(snr1)
 75        snr = Inf*ones(1, size(z,2)); 
 76    else
 77        snr = snr1; 
 78    end
 79    % Initial value of amcInds
 80    amcInds=gt(snr,snrThresh);
 81end
 82
 83
 84
 85% ord--one for each track of input x
 86for n = 1:length(b)     
 87% calculate targbm output and ready to opt
 88[bWin,z,w1]=targbm(bp,b,x,n,order,w,z);
 89
 90%check bmWF
 91if ~isempty(bmF), w= bmF(:,:,n); continue, end
 92
 93% If enough samples have passed and we're doing AMC
 94% thresholding, find the SNR for each track.
 95[snr,amcInds,mcAdapt]=AMC(b,z,n,snrThresh,snrRate,snr,amcInds,mcAdapt);
 96% save SNR values for debug output
 97snrAll(n,:) = snr;    
 98%Perform LMS tap update under threshold
 99%figure out if bmWForce supplied
100[w]=optwbm(bWin,n,w1,z,beta,mu,snrThresh,amcInds);
101% CCAF (Coefficient Constrained) Tap Constraints
102[w]=CCAF(phi,psi,order,w,snrThresh,amcInds);
103% Save the taps used on this iteration
104bmw(:,:,n)=w;
105
106end  % for n = 1:length(b)
107% bmw=w;
108end  % function bmlms