-
Notifications
You must be signed in to change notification settings - Fork 2
/
Z_functionComputeSE1_AP_uplink.m
181 lines (138 loc) · 6.79 KB
/
Z_functionComputeSE1_AP_uplink.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
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
function [SE_MR,SE_MMSE] = Z_functionComputeSE1_AP_uplink(Hhat,H,R,B,tau_c,tau_p,nbrOfRealizations,N,K,L,p)
%Compute uplink SE for Cell-free mMIMO for the four different receiver
%cooperation levels, using either MR or MMSE/L-MMSE combining
%
%This function was developed as a part of the paper:
%
%Emil Bjornson, Luca Sanguinetti, "Making Cell-Free Massive MIMO
%Competitive With MMSE Processing and Centralized Implementation,"
%Submitted for publication, https://arxiv.org/abs/1903.10611
%
%This is version 1.0 (Last edited: 2019-03-19)
%
%License: This code is licensed under the GPLv2 license. If you in any way
%use this code for research that results in publications, please cite our
%paper as described above.
%
%INPUT:
%Hhat = Matrix with dimension N*L x nbrOfRealizations x K
% where (:,n,k) is the estimated collective channel from
% all BSs to UE k at channel realization n.
%H = Matrix with dimension N*L x nbrOfRealizations x K
% where (:,n,k) is the true collective channel from all
% BSs to UE k at channel realization n.
%R = Matrix with dimension N x N x L x K where
% (:,:,l,k) is the spatial correlation matrix between BS
% l and UE k in setup n, normalized by the noise power
%B = Matrix with dimension N x N x L x K where
% (:,:,l,k) is the spatial correlation matrix of the
% estimate between BS l and UE k in setup n, normalized
% by the noise power
%tau_c = Length of coherence block
%tau_p = Length of pilot sequences and number of UEs per cell
%nbrOfRealizations = Number of channel realizations
%N = Number of antennas per AP
%K = Total number of UEs
%L = Number of APs
%p = Matrix K x 1 where element k is the uplink transmit
% power of UE k (If it is a scalar, the same value is
% used for all users)
%p1 = (Optional) Same as p but only for Level 1
%
%OUTPUT:
%SE_MR = K x 4 matrix where the (k,n):th element is the uplink SE of
% UE k achieved with MR combining at cooperation level n
%SE_MMMSE = Same as SE_MR but with MMSE or L-MMSE combining
%sumSE_SIC = Scalar with the sum SE achieved using MMSE-SIC combining
%If only one transmit power is provided, use the same for all the UEs
if length(p) == 1
p = p*ones(K,1);
end
%Store identity matrices of different sizes
eyeN = eye(N);
eyeLN = eye(L*N);
%Compute the prelog factor
prelogFactor = (1-tau_p/tau_c);
%Prepare to store simulation results
SE_MR = zeros(K,3);
SE_MMSE = zeros(K,3);
%Compute sum of all estimation error correlation matrices at every BS
C_tot = zeros(N,N,L);
for k = 1:K
C_tot = C_tot + (R(:,:,:,k)-B(:,:,:,k));
end
%Diagonal matrix with transmit powers and its square root
Dp = diag(p);
Dp12 = diag(sqrt(p));
SE_MR_level1 = zeros(K,L);
SE_MMSE_level1 = zeros(K,L);
signal_MR_level23 = zeros(L,K);
scaling_MR_level23 = zeros(L,K);
Gp_MR_level23 = zeros(L,L,K);
signal_MMSE_level23 = zeros(L,K);
scaling_MMSE_level23 = zeros(L,K);
G_MMSE_level23 = zeros(L,L,K);
%% Go through all channel realizations
for n = 1:nbrOfRealizations
%Levels 2-3
gp_MR_level23 = zeros(L,K,K);
gp_MMSE_level23 = zeros(L,K,K);
%Go through all APs
for l = 1:L
%Extract channel realizations from all UEs to AP l
Hallj = reshape(H(1+(l-1)*N:l*N,n,:),[N K]);
%Extract channel estimate realizations from all UEs to AP l
Hhatallj = reshape(Hhat(1+(l-1)*N:l*N,n,:),[N K]);
%Compute MR combining
V_MR = Hhatallj;
V_MMSE = ((Hhatallj*Dp*Hhatallj')+p(K)*C_tot(:,:,l)+eyeN)\(V_MR*Dp);
%Go through all UEs
for k = 1:K
%%MR combining
v = V_MR(:,k); %Extract combining vector
%Level 2 and Level 3
signal_MR_level23(l,k) = signal_MR_level23(l,k) + (v'*Hallj(:,k))/nbrOfRealizations;
gp_MR_level23(l,:,k) = gp_MR_level23(l,:,k) + (v'*Hallj)*Dp12;
scaling_MR_level23(l,k) = scaling_MR_level23(l,k) + norm(v).^2/nbrOfRealizations;
%level 1
%Compute numerator and denominator of instantaneous SINR
numerator = p(k)*abs(v'*Hhatallj(:,k))^2;
denominator = norm((v'*Hhatallj)*Dp12)^2 + v'*(p(K)*C_tot(:,:,l)+eyeN)*v - numerator;
%Compute instantaneous SE for one channel realization
SE_MR_level1(k,l) = SE_MR_level1(k,l) + prelogFactor*real(log2(1+numerator/denominator))/nbrOfRealizations;
%%MMSE combining
v = V_MMSE(:,k); %Extract combining vector
%Level 2 and Level 3
signal_MMSE_level23(l,k) = signal_MMSE_level23(l,k) + (v'*Hallj(:,k))/nbrOfRealizations;
gp_MMSE_level23(l,:,k) = gp_MMSE_level23(l,:,k) + (v'*Hallj)*Dp12;
scaling_MMSE_level23(l,k) = scaling_MMSE_level23(l,k) + norm(v).^2/nbrOfRealizations;
%Level 1
%Compute numerator and denominator of instantaneous SINR
numerator = p(k)*abs(v'*Hhatallj(:,k))^2;
denominator = norm((v'*Hhatallj)*Dp12)^2 + v'*(p(K)*C_tot(:,:,l)+eyeN)*v - numerator;
%Compute instantaneous SE for one channel realization
SE_MMSE_level1(k,l) = SE_MMSE_level1(k,l) + prelogFactor*real(log2(1+numerator/denominator))/nbrOfRealizations;
end
end
%Compute averaging of terms for Level 2 and Level 3
for k = 1:K
Gp_MR_level23(:,:,k) = Gp_MR_level23(:,:,k) + gp_MR_level23(:,:,k)*gp_MR_level23(:,:,k)'/nbrOfRealizations;
G_MMSE_level23(:,:,k) = G_MMSE_level23(:,:,k) + gp_MMSE_level23(:,:,k)*gp_MMSE_level23(:,:,k)'/nbrOfRealizations;
end
end
%Compute SE for Level 1
SE_MR(:,1) = max(SE_MR_level1,[],2);
SE_MMSE(:,1) = max(SE_MMSE_level1,[],2);
%Compute SE for Level 2 and Level 3
for k = 1:K
%With MR combining
b = signal_MR_level23(:,k);
A = Gp_MR_level23(:,:,k) + diag(scaling_MR_level23(:,k)) - p(k)*(b*b');
SE_MR(k,3) = prelogFactor*real(log2(1+p(k)*b'*(A\b)));
SE_MR(k,2) = prelogFactor*real(log2(1+p(k)*abs(mean(b)).^2 / mean(mean(A))));
%With L-MMSE combining
b = signal_MMSE_level23(:,k);
A = G_MMSE_level23(:,:,k) + diag(scaling_MMSE_level23(:,k)) - p(k)*(b*b');
SE_MMSE(k,3) = prelogFactor*real(log2(1+p(k)*b'*(A\b)));
SE_MMSE(k,2) = prelogFactor*real(log2(1+p(k)*abs(mean(b)).^2 / mean(mean(A))));
end