-
Notifications
You must be signed in to change notification settings - Fork 6
/
functionComputeSERIS.m
124 lines (76 loc) · 2.96 KB
/
functionComputeSERIS.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
120
121
122
123
124
function [SE_MR, SE_RZF, SE_AMMSE, SE_MR_maxmin, SE_RZF_maxmin, SE_AMMSE_maxmin] = ...
functionComputeSERIS(bb,bHat,Ctilde,K,M,nbrOfRealizations,poww,etaa)
SE_MR = zeros(K,1);
SE_RZF = zeros(K,1);
SE_AMMSE = zeros(K,1);
Cp = zeros(M,M,K);
for k = 1:K
Cp(:,:,k) = poww(k)*Ctilde(:,:,k);
end
Numerr_MR = zeros(K,1);
Denomm_MR = zeros(K,K);
Numerr_RZF = zeros(K,1);
Denomm_RZF = zeros(K,K);
Numerr_AMMSE = zeros(K,1);
Denomm_AMMSE = zeros(K,K);
for tt = 1:nbrOfRealizations
V_MR = bHat(:,:,tt);
V_RZF = (V_MR*diag(poww)*V_MR'+eye(M))\V_MR;
V_AMMSE = (V_MR*diag(poww)*V_MR'+sum(Cp,3)+eye(M))\V_MR;
V_MR = V_MR./vecnorm(V_MR);
V_RZF = V_RZF./vecnorm(V_RZF);
V_AMMSE = V_AMMSE./vecnorm(V_AMMSE);
TemporMR = V_MR'*bb(:,:,tt);
Numerr_MR = Numerr_MR + diag(TemporMR)/nbrOfRealizations;
Denomm_MR = Denomm_MR + abs(TemporMR).^2/nbrOfRealizations;
TemporRZF = V_RZF'*bb(:,:,tt);
Numerr_RZF = Numerr_RZF + diag(TemporRZF)/nbrOfRealizations;
Denomm_RZF = Denomm_RZF + abs(TemporRZF).^2/nbrOfRealizations;
TemporAMMSE = V_AMMSE'*bb(:,:,tt);
Numerr_AMMSE = Numerr_AMMSE + diag(TemporAMMSE)/nbrOfRealizations;
Denomm_AMMSE = Denomm_AMMSE + abs(TemporAMMSE).^2/nbrOfRealizations;
end
for k = 1:K
SE_MR(k) = log2(1+poww(k)*abs(Numerr_MR(k))^2/...
(Denomm_MR(k,:)*poww-poww(k)*abs(Numerr_MR(k))^2+1));
SE_RZF(k) = log2(1+poww(k)*abs(Numerr_RZF(k))^2/...
(Denomm_RZF(k,:)*poww-poww(k)*abs(Numerr_RZF(k))^2+1));
SE_AMMSE(k) = log2(1+poww(k)*abs(Numerr_AMMSE(k))^2/...
(Denomm_AMMSE(k,:)*poww-poww(k)*abs(Numerr_AMMSE(k))^2+1));
end
iter = 0;
etap = etaa*ones(K,1);
denominator = Denomm_MR*etap-etap.*abs(Numerr_MR).^2+1;
SINR = etap.*abs(Numerr_MR).^2./denominator;
while max(SINR)-min(SINR)>0.01
iter = iter+1;
etap = denominator./(abs(Numerr_MR).^2);
etap = etap*etaa/max(etap);
denominator = Denomm_MR*etap-etap.*(abs(Numerr_MR).^2)+1;
SINR = etap.*abs(Numerr_MR).^2./denominator;
end
SE_MR_maxmin = log2(1+SINR);
iter = 0;
etap = etaa*ones(K,1);
denominator = Denomm_RZF*etap-etap.*abs(Numerr_RZF).^2+1;
SINR = etap.*abs(Numerr_RZF).^2./denominator;
while max(SINR)-min(SINR)>0.01
iter = iter+1;
etap = denominator./(abs(Numerr_RZF).^2);
etap = etap*etaa/max(etap);
denominator = Denomm_RZF*etap-etap.*(abs(Numerr_RZF).^2)+1;
SINR = etap.*abs(Numerr_RZF).^2./denominator;
end
SE_RZF_maxmin = log2(1+SINR);
iter = 0;
etap = etaa*ones(K,1);
denominator = Denomm_AMMSE*etap-etap.*abs(Numerr_AMMSE).^2+1;
SINR = etap.*abs(Numerr_AMMSE).^2./denominator;
while max(SINR)-min(SINR)>0.01
iter = iter+1;
etap = denominator./(abs(Numerr_AMMSE).^2);
etap = etap*etaa/max(etap);
denominator = Denomm_AMMSE*etap-etap.*(abs(Numerr_AMMSE).^2)+1;
SINR = etap.*abs(Numerr_AMMSE).^2./denominator;
end
SE_AMMSE_maxmin = log2(1+SINR);