annotate mirex2012-matlab/cplcaMT.m @ 372:af71cbdab621 tip

Update bqvec code
author Chris Cannam
date Tue, 19 Nov 2019 10:13:32 +0000
parents 8017dd4a650d
children
rev   line source
Chris@2 1 function [w,h,z,u,xa] = cplcaMT( x, K, T, R, w, h, z, u, iter, sw, sh, sz, su, lw, lh, lz, lu, pa)
Chris@2 2 % function [w,h,xa2] = cplcaMT( x, K, T, R, w, h, z, u, iter, sw, sh, sz, su, lw, lh, lz, lu)
Chris@2 3 %
Chris@2 4 % Perform multiple-source, multiple-template SIPLCA for transcription
Chris@2 5 %
Chris@2 6 % Inputs:
Chris@2 7 % x input distribution
Chris@2 8 % K number of components
Chris@2 9 % T size of components
Chris@2 10 % R size of sources
Chris@2 11 % w initial value of p(w) [default = random]
Chris@2 12 % h initial value of p(h) [default = random]
Chris@2 13 % z initial value of p(z) [default = random]
Chris@2 14 % iter number of EM iterations [default = 10]
Chris@2 15 % sw sparsity parameter for w [default = 1]
Chris@2 16 % sh sparsity parameter for h [default = 1]
Chris@2 17 % sz sparsity parameter for z [default = 1]
Chris@2 18 % lw flag to update w [default = 1]
Chris@2 19 % lh flag to update h [default = 1]
Chris@2 20 % lh flag to update h [default = 1]
Chris@2 21 % pa source-component activity range [Rx2]
Chris@2 22 %
Chris@2 23 % Outputs:
Chris@2 24 % w p(w) - spectral bases
Chris@2 25 % h p(h) - pitch impulse
Chris@2 26 % z p(z) - mixing matrix for p(h)
Chris@2 27 % xa approximation of input
Chris@2 28
Chris@2 29 % Emmanouil Benetos 2011, based on cplca code by Paris Smaragdis
Chris@2 30
Chris@2 31
Chris@2 32 % Sort out the sizes
Chris@2 33 wc = 2*size(x)-T;
Chris@2 34 hc = size(x)+T-1;
Chris@2 35
Chris@2 36 % Default training iterations
Chris@2 37 if ~exist( 'iter')
Chris@2 38 iter = 10;
Chris@2 39 end
Chris@2 40
Chris@2 41
Chris@2 42 % Initialize
Chris@2 43 sumx = sum(x);
Chris@2 44
Chris@2 45 if ~exist( 'w') || isempty( w)
Chris@2 46 w = cell(R, K);
Chris@2 47 for k = 1:K
Chris@2 48 for r=1:R
Chris@2 49 w{r,k} = rand( T);
Chris@2 50 w{r,k} = w{r,k} / sum( w{r,k}(:));
Chris@2 51 end
Chris@2 52 end
Chris@2 53 end
Chris@2 54 if ~exist( 'h') || isempty( h)
Chris@2 55 h = cell(1, K);
Chris@2 56 for k = 1:K
Chris@2 57 h{k} = rand( size(x)-T+1);
Chris@2 58 h{k} = h{k};
Chris@2 59 end
Chris@2 60 end
Chris@2 61 if ~exist( 'z') || isempty( z)
Chris@2 62 z = cell(1, K);
Chris@2 63 for k = 1:K
Chris@2 64 z{k} = rand( size(x,2),1);
Chris@2 65 z{k} = z{k};
Chris@2 66 end
Chris@2 67 end
Chris@2 68 if ~exist( 'u') || isempty( u)
Chris@2 69 u = cell(R, K);
Chris@2 70 for k = 1:K
Chris@2 71 for r=1:R
Chris@2 72 if( (pa(r,1) <= k && k <= pa(r,2)) )
Chris@2 73 u{r,k} = ones( size(x,2),1);
Chris@2 74 else
Chris@2 75 u{r,k} = zeros( size(x,2),1);
Chris@2 76 end
Chris@2 77 end;
Chris@2 78 end
Chris@2 79 end
Chris@2 80
Chris@2 81 fh = cell(1, K);
Chris@2 82 fw = cell(R, K);
Chris@2 83 for k = 1:K
Chris@2 84 fh{k} = ones(wc) + 1i*ones(wc);
Chris@2 85 for r=1:R
Chris@2 86 fw{r,k} = ones(wc) + 1i*ones(wc);
Chris@2 87 end;
Chris@2 88 end;
Chris@2 89
Chris@2 90
Chris@2 91
Chris@2 92 % Make commands for subsequent multidim operations and initialize fw
Chris@2 93 fnh = 'c(hc(1)-(T(1)+(1:size(h{k},1))-2),hc(2)-(T(2)+(1:size(h{k},2))-2))';
Chris@2 94 xai = 'xa(1:size(x,1),1:size(x,2))';
Chris@2 95 flz = 'xbar(end:-1:1,end:-1:1)';
Chris@2 96
Chris@2 97 for k = 1:K
Chris@2 98 for r=1:R
Chris@2 99 if( (pa(r,1) <= k && k <= pa(r,2)) )
Chris@2 100 fw{r,k} = fftn( w{r,k}, wc);
Chris@2 101 end;
Chris@2 102 end;
Chris@2 103 end;
Chris@2 104
Chris@2 105 % Iterate
Chris@2 106 for it = 1:iter
Chris@2 107
Chris@2 108 %disp(['Iteration: ' num2str(it)]);
Chris@2 109
Chris@2 110 % E-step
Chris@2 111 xa = eps;
Chris@2 112 for k = 16:73
Chris@2 113 fh{k} = fftn( h{k}, wc);
Chris@2 114 for r=1:R
Chris@2 115 if( (pa(r,1) <= k && k <= pa(r,2)) )
Chris@2 116 xa1 = abs( real( ifftn( fw{r,k} .* fh{k})));
Chris@2 117 xa = xa + xa1(1:size(x,1),1:size(x,2)) .*repmat(z{k},1,size(x,1))'.*repmat(u{r,k},1,size(x,1))';
Chris@2 118 clear xa1;
Chris@2 119 end
Chris@2 120 end
Chris@2 121 end
Chris@2 122
Chris@2 123 xbar = x ./ xa;
Chris@2 124 xbar = eval( flz);
Chris@2 125 fx = fftn( xbar, wc);
Chris@2 126
Chris@2 127
Chris@2 128 % M-step
Chris@2 129 for k = 16:73
Chris@2 130
Chris@2 131
Chris@2 132 % Update h, z, u
Chris@2 133 nh=eps;
Chris@2 134 for r=1:R
Chris@2 135 if( (pa(r,1) <= k && k <= pa(r,2)) )
Chris@2 136 c = abs( real( ifftn( fx .* fw{r,k} )));
Chris@2 137 nh1 = eval( fnh);
Chris@2 138 nh1 = nh1 .*repmat(u{r,k},1,size(h{k},1))';
Chris@2 139 nh = nh + nh1;
Chris@2 140
Chris@2 141 nhu = eval( fnh);
Chris@2 142 nhu = nhu .* h{k};
Chris@2 143 nu = sum(nhu)';
Chris@2 144 nu = u{r,k} .* nu + eps;
Chris@2 145 if lu
Chris@2 146 u{r,k} = nu;
Chris@2 147 end;
Chris@2 148
Chris@2 149 end;
Chris@2 150 end
Chris@2 151 nh = h{k} .* (nh.^sh);
Chris@2 152 nz = sum(nh)';
Chris@2 153 nz = z{k} .* nz + eps;
Chris@2 154
Chris@2 155
Chris@2 156 % Assign and normalize
Chris@2 157 if lh
Chris@2 158 h{k} = nh;
Chris@2 159 end
Chris@2 160 if lz
Chris@2 161 z{k} = nz;
Chris@2 162 end
Chris@2 163
Chris@2 164
Chris@2 165 end
Chris@2 166
Chris@2 167 % Normalize z over t
Chris@2 168 if lz
Chris@2 169 Z=[]; for i=1:K Z=[Z z{i}]; end;
Chris@2 170 Z = Z.^sz;
Chris@2 171 Z(1:end,1:15)=0;
Chris@2 172 Z(1:end,74:88)=0;
Chris@2 173 Z = Z./repmat(sum(Z,2),1,K); z = num2cell(Z,1); %figure; imagesc(imrotate(Z,90));
Chris@2 174 end
Chris@2 175
Chris@2 176 % Normalize u over z,t
Chris@2 177 if lu
Chris@2 178 U=[]; for r=1:R U(r,:,:) = cell2mat(u(r,:)); end;
Chris@2 179 for i=1:size(U,2) for j=1:size(U,3) U(:,i,j) = U(:,i,j).^su; U(:,i,j) = U(:,i,j) ./ sum(U(:,i,j)); end; end;
Chris@2 180 U0 = permute(U,[2 1 3]); u = squeeze(num2cell(U0,1));
Chris@2 181 end
Chris@2 182
Chris@2 183 % Normalize h over z,t
Chris@2 184 H=[]; for k=1:K H(k,:,:) = cell2mat(h(k)); end; H0 = permute(H,[2 1 3]);
Chris@2 185 for i=1:size(H0,2) for j=1:size(H0,3) H0(:,i,j) = sumx(j)* (H0(:,i,j) ./ sum(H0(:,i,j))); end; end;
Chris@2 186 h = squeeze(num2cell(squeeze(H0),[1 3])); for k=1:K h{k} = squeeze(h{k}); end;
Chris@2 187
Chris@2 188 %figure; imagesc(imrotate(xa',90));
Chris@2 189
Chris@2 190 end
Chris@2 191
Chris@2 192 %figure; imagesc(imrotate(xa',90));