-
Notifications
You must be signed in to change notification settings - Fork 2
/
interference_cancellation_reuse.m
72 lines (65 loc) · 2.15 KB
/
interference_cancellation_reuse.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
clear;
L = 2;
M = 40;
K = 30;
SNRdB = 2;
numCases = 100000;
T = 1;
thllr = 0.7;
SNR = 10^(SNRdB / 10);
N0 = 1 / SNR;
BSs = zeros(L, 1);
r = 2;
if L == 1
BSs = 0;
F = 0;
ratio = 1;
elseif L == 2
BSs = [0, r * 1j];
F = [1, 2] - 1;
ratio = 2;
elseif L == 3
BSs = [0, r * 1j, r * cos(pi / 6) + r * sin(pi / 6) * 1j];
F = [1, 2, 3] - 1;
ratio = 3;
elseif L == 4
BSs = [0, ...
r * 1j, ...
r * cos(pi / 6) + r * sin(pi / 6) * 1j, ...
-r * cos(pi / 6) + r * sin(pi / 6) * 1j];
F = [1, 2, 3, 4] - 1;
ratio = 4;
elseif L == 7
BSs = [0, ...
r * 1j, ...
r * cos(pi / 6) + r * sin(pi / 6) * 1j, ...
-r * cos(pi / 6) + r * sin(pi / 6) * 1j, ...
r * cos(pi / 6) + r * (sin(pi / 6) - 1) * 1j, ...
-r * 1j, ...
-r * cos(pi / 6) + r * (sin(pi / 6) - 1) * 1j];
%F = [1, 2, 3, 3, 2, 3, 2] - 1;
F = [1 : 7] - 1;
ratio = 7;
elseif L == 19
BSs = [0, r * 1j, r * cos(pi / 6) + r * sin(pi / 6) * 1j, -r * cos(pi / 6) + r * sin(pi / 6) * 1j, r * cos(pi / 6) + r * (sin(pi / 6) - 1) * 1j, ...
-r * 1j, -r * cos(pi / 6) + r * (sin(pi / 6) - 1) * 1j];
end
err = 0;
for ci = 1 : numCases
UEs = brownian(L, K, BSs, r / sqrt(3));
[R, P] = generateReceiveCorrelation(L, M, K, BSs, UEs);
H = generateMIMOChannel(L, M, BSs, K, UEs, R);
xr = (randi([0, 1], L * K, 1) * 2 - 1) / sqrt(2);
xi = (randi([0, 1], L * K, 1) * 2 - 1) / sqrt(2);
x = xr + xi * 1j;
y = H * x + (randn(L * M, 1) + randn(L * M, 1) * 1j) / sqrt(2) * sqrt(N0);
%xhat = pinv(H) * y;
%xhat = H' / (H * H' + N0 * eye(M)) * y;
%xhat = iterative_cancellation(L, M, K, H, y, N0, 0);
A = pilot_assignment_reuse(L, M, K, R, N0, F, ratio);
[Hhat, C] = channel_estimate_reuse(L, M, K, H, R, A, N0, ratio);
%Hhat = H; C = zeros(size(C));
xhat = iterative_cancellation_imperfect_quantize(L, M, K, Hhat, C, y, N0, T, thllr);
err = err + sum(real(x) .* real(xhat) < 0) + sum(imag(x) .* imag(xhat) < 0);
end
fprintf(2, 'BER is %e, with %d errors\n', err / numCases / L / K / 2, err);