如何在MATLAB中实现这些乘法更新?

时间:2015-06-28 17:09:51

标签: matlab for-loop optimization updates

我正在对[本文] http://paris.cs.illinois.edu/pubs/nasser-icassp2015.pdf中给出的h和x进行两次更新(你不必阅读论文,只需查看等式4,10和14来​​更新h和x给出在第2页和第3页)。

这是我到目前为止尝试过的代码段。你能告诉我它是否正确吗?另外,有没有办法优化这些循环?

在某些情况下(t-tau),术语是否定的,MATLAB给出了错误。所以,我提出了一个只实现if(t-tau)> 0的条件。这样做是正确的还是有其他方法来处理负面指数?

%updates
Lh=10;
lambda = 0.1*(sum(reverberatedspeechspec(:))/(size(Y,1)*size(Y,2)));
S=reverberatedspeechspec;
W=basis_mel_act; W=gather(W); W = double(W); %W is the dictionary
%---initialization for H(RIR)----
H=rand(size(Y,1),Lh);
nmfIter = 50;

%---initialization for X(Activations)-----
W_trans=W';
X=W_trans*S; X=double(X);

Y = zeros(size(S,1));
for idx = 1 : size(Y,1)
    Y(idx,:) = filter(S(idx,:),1,H(idx,:));
end

Stilde = zeros(size(S));
Ytilde = zeros(size(S));

for iter=1:nmfIter
    % update for H
    Stilde = W*X;
    Ytilde = zeros(size(S));
    for j=1:size(Stilde,1)
        Ytilde (j,:) =  filter(Stilde(j,:),1,H(j,:));
    end
    ratio = Y./Ytilde;
    numerator = zeros(size(H));
    denominator = numerator;
    for k = 1 :size(Y,1)
        for tau = 1:Lh
            for t= 1:size(Y,2)
                if gt (t-tau , 0)
                    numerator (k,tau) = numerator(k,tau) + ratio(k,t) * Stilde(k,t-tau);
                    denominator(k,tau) = denominator (k,tau) + Stilde (k,t-tau);
                end
            end
        end
    end
    H = H .* numerator ./denominator ;

    %updating Ytilde after getting a new value for H
    for j=1:size(Stilde,1)
        Ytilde (j,:) =  filter(Stilde(j,:),1,H(j,:));
    end

    %update for X
    ratio = Y./Ytilde;
    ratio = [ratio zeros(size(Y,1),Lh)]; %zero padding Y and Ytilde for (t+tau) term in update of X.
    Product = H.' * W; % Product of H_transpose and W in th update which is equivalent to the term ∑H(k,tau)W(k,r)
    numerator = zeros(size(H));
    denominator = numerator;
    for r = 1:size(W,2)
        for t = 1:size(Y,2)
            for k = 1:size(Y,1)
                for tau = 1:Lh
                    numerator(r,t) = numerator(r,t) + ratio(k,t+tau) * Product(tau,r);
                    denominator(r,t) = denominator(r,t) + Product(tau,r) + lambda;
                end
            end
        end
    end
    X = X .* numerator ./denominator;
end

0 个答案:

没有答案