-
Notifications
You must be signed in to change notification settings - Fork 35
/
Copy pathProcess_OverIVA.m
119 lines (119 loc) · 3.27 KB
/
Process_OverIVA.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
function [Y,W,SetupStruc] = Process_OverIVA(s,Transfer,SetupStruc)
K = SetupStruc.OverIVA.K;
hop = SetupStruc.OverIVA.hop;
win = hanning(K,'periodic');
win = win/sqrt(sum(win(1:hop:K).^2));
SetupStruc.OverIVA.win = win; % Preserve 'win' in 'SetupStruc'
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
N = size(s,2);
for i = 1:N
X(:,:,i) = fft(enframe(s(:,i),win,hop)');
end
frame_N = size(X,2);
K_m = K/2+1;
Num = size(Transfer,3);
Y = zeros((frame_N-1)*hop+K,Num);
Y_f = zeros(Num,frame_N,K);
%%%%%%%%%%%%%%%%%%%%%%%%%% Obtain processing matrix 'W'
W_IVA = zeros(Num,N,K_m);
W_Over = zeros(N,N,K_m);
theta = 10^-6;
X = permute(X,[3 2 1]);
E1 = [eye(Num) zeros(Num,N-Num)];
E2 = [zeros(N-Num,Num) eye(N-Num)];
for i = 1:K_m
X_f = X(:,:,i);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%% Initialization
% W_o = [eye(Num) zeros(Num,N-Num)];
[E,D] = PCA(X_f,1,Num);
W = sqrt(D)\E';
y_f = W*X_f;
W_IVA(:,:,i) = W;
Cf = X_f*X_f'/frame_N;
Jf = E1*Cf*W';
if rcond(Jf)<theta
Jf = Jf+eye(Num)*max(eig(Jf))*theta;
end
Jf = E2*Cf*W'/Jf;
W_ = [W;[Jf -eye(N-Num)]];
W_Over(:,:,i) = W_;
% W_Over(:,:,i) = [W_o;[zeros(N-Num,Num) -eye(N-Num)]];
Y_f(:,:,i) = y_f;
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%% IVA iterations
max_iteration = 200;
Y_k = zeros(Num,frame_N);
epsi = 1e-6;
pObj = inf;
A = zeros(1001,2)-1; %%%% Show the decrease of non-linear correlation, IVA max iterations 1000
for iteration = 1:max_iteration
for i = 1:Num
y_temp = permute(Y_f(i,:,:),[3 2 1]);
Y_k(i,:) = mean(abs(y_temp(1:K_m,:)).^2)+epsi;
end
dlw = 0;
for i = 1:K_m
W = W_IVA(:,:,i);
W_ = W_Over(:,:,i);
X_f = X(:,:,i);
Cf = X_f*X_f'/frame_N;
dlw = dlw +log(abs(det(W_))+epsi);
for i_n = 1:Num
G_ = Y_k(i_n,:).^-1;
G_ = repmat(G_,N,1);
Vk = (G_.*X_f)*X_f'/frame_N;
if rcond(Vk)<theta
% coe = sort(eig(Vk),'descend');
Vk = Vk+eye(N)*max(eig(Vk))*theta;
end
wk = inv(W_*Vk);
wk = wk(:,i_n);
wk = wk/(sqrt(wk'*Vk*wk)+epsi);
W(i_n,:) = wk';
Jf = E1*Cf*W';
if rcond(Jf)<theta
Jf = Jf+eye(Num)*max(eig(Jf))*theta;
end
Jf = E2*Cf*W'/Jf;
W_ = [W;[Jf -eye(N-Num)]];
end
W_IVA(:,:,i) = W;
W_Over(:,:,i) = W_;
Y_f(:,:,i) = W*X_f;
end
Obj = (sum(sum(Y_k))/frame_N-dlw)/(Num*K_m);
dObj = pObj-Obj;
pObj = Obj;
A(iteration,:) = [Obj,abs(dObj)/abs(Obj)];
if(abs(dObj)/abs(Obj)<epsi)
break;
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%% Post processing
% W = zeros(Num,N,K_m);
Y_f(:,:,1) = zeros(Num,frame_N);
for i = 2:K_m
W_inv = pinv(W_IVA(:,:,i));
for ii = 1:Num
Y_f(ii,:,i) = Y_f(ii,:,i)*W_inv(1,ii);
W_IVA(ii,:,i) = W_IVA(ii,:,i)*W_inv(1,ii);
end
% W(:,:,i) = W_IVA(:,:,i);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
if(i~=K_m)
Y_f(:,:,K+2-i) = conj(Y_f(:,:,i));
end
end
W = W_IVA;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Recover signals
if(K/hop==2)
win = ones(K,1);
end
for i = 1:Num
y_temp = permute(Y_f(i,:,:),[3 2 1]);
Y(:,i) = overlapadd(real(ifft(y_temp))',win,hop);
end
return;