-
Notifications
You must be signed in to change notification settings - Fork 0
/
iterateWMMSE.m
69 lines (68 loc) · 2.5 KB
/
iterateWMMSE.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
function V = iterateWMMSE(K, Q, M, I, N, mmse, P, H, W, U)
V = zeros(K * Q * M, K * I);
for k = 1 : K
offset = (k - 1) * Q * M;
MMatrix = mmse(offset + 1 : offset + Q * M, :);
power = 0;
tmp = zeros(Q * M);
for i = 1 : I
rowOffset = (k - 1) * I * N + (i - 1) * N;
colOffset = (k - 1) * Q * M;
h = H(rowOffset + 1 : rowOffset + N, colOffset + 1 : colOffset + Q * M);
offset = (k - 1) * I * N + (i - 1) * N;
u = U(offset + 1 : offset + N, :);
w = W((k - 1) * I + i);
v = MMatrix \ (h' * u * w);
rowOffset = (k - 1) * Q * M;
colOffset = (k - 1) * I + i;
V(rowOffset + 1 : rowOffset + Q * M, colOffset) = v;
power = power + norm(v, 2)^2;
tmp = tmp + h' * (u * u') * h * w * w;
end
if power <= P * Q
continue
end
[D, lambda] = eig(MMatrix);
phi = D' * tmp * D;
multiplier = 0;
miuLow = 0;
miuHigh = 1;
while mmseBisectionTarget(phi, lambda, miuHigh) > P * Q
miuHigh = miuHigh * 2;
end
targetValue = 0;
multiplier = (miuLow + miuHigh) / 2;
targetValue = mmseBisectionTarget(phi, lambda, multiplier);
while abs(targetValue - P * Q) / (P * Q) >= 1e-14
targetValue = mmseBisectionTarget(phi, lambda, multiplier);
if targetValue > P * Q
miuLow = multiplier;
elseif targetValue < P * Q
miuHigh = multiplier;
else
break;
end
multiplier = (miuLow + miuHigh) / 2;
end
offset = (k - 1) * Q * M;
MMatrix = mmse(offset + 1 : offset + Q * M, :);
for i = 1 : I
rowOffset = (k - 1) * I * N + (i - 1) * N;
colOffset = (k - 1) * Q * M;
h = H(rowOffset + 1 : rowOffset + N, colOffset + 1 : colOffset + Q * M);
offset = (k - 1) * I * N + (i - 1) * N;
u = U(offset + 1 : offset + N);
w = W((k - 1) * I + i);
v = (multiplier * eye(Q * M) + MMatrix) \ h' * u * w;
rowOffset = (k - 1) * Q * M;
colOffset = (k - 1) * I + i;
V(rowOffset + 1 : rowOffset + Q * M, colOffset) = v;
end
end
return
function p = mmseBisectionTarget(phi, lambda, multiplier)
p = 0;
for i = 1 : size(phi, 1)
p = p + real(phi(i, i)) / (real(lambda(i, i)) + multiplier)^2;
end
return