-
Notifications
You must be signed in to change notification settings - Fork 9
/
Copy pathoptimal_phase_shift.m
47 lines (47 loc) · 1.24 KB
/
optimal_phase_shift.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
function [v, R, history] = optimal_phase_shift(h_d, H_r, h_v, error_th,...
sigma_n_sqr, p_sig, iteration_count, L, early_stop,random_initilize)
Phi = H_r * diag(h_v);
A = Phi'*Phi;
b = Phi'*h_d;
discrete_levels = linspace(0, 2*pi, L);
N = size(H_r,2);
if random_initilize==0
I = ones(N,1);
else
I = randi([1 L],N,1);
end
for n=1:N
theta(n) = discrete_levels(I(n));
end
v = exp(1i * theta);
obj_value = achievable_rate(h_d + H_r*diag(v)*h_v, sigma_n_sqr,p_sig);
history = zeros(iteration_count+1,1);
history(1,1) = obj_value;
for iter = 1:iteration_count
for n=1:N
kappa_n = b(n);
for l=1:N
if l~=n
kappa_n = kappa_n + A(n,l)*v(l);
end
end
min_diff = 4*pi;
for ang=discrete_levels
diff = abs(angle(exp(1i*ang))-angle(kappa_n));
if diff < min_diff
min_diff = diff;
theta(n) = ang;
end
end
end
v = exp(1i * theta);
prev_obj_value = obj_value;
obj_value=achievable_rate(h_d + H_r*diag(v)*h_v, sigma_n_sqr,p_sig);
history(iter + 1,1) = obj_value;
if early_stop==1 && abs(obj_value - prev_obj_value) < error_th
break;
end
end
R = obj_value;
v = exp(1i * theta);
end