You are on page 1of 5

29/04/2014 17:32 E:\MIMO-DA CHUYEN NGANH\Mu...\Greedy_scheduler_perfectCSI.

m 1 of 5
function [total_rate_frame] = Greedy_scheduler_perfectCSI(Power,No,CFR_Rx,N_fft,N_tx,
N_rx,N_user,N_sym_slot,N_slot);
% Just for reference on matrix sizes: TI_CFR_Rx(1:N_fft,tx_anten,user)
total_rate_frame = 0;
for OFDM_sym = 1:N_sym_slot*N_slot
for kk = 1:N_fft % perform (per-subcarrier) scheduling for each subcarrier
user_set = [1:N_user]; % set of available users in the considered LTE system
loop = 1; % just a variable refering to the number of selected users. As a
result, noted that the number of selected users = loop-1 <<
C_max(1) = 0; %since the initial Matlab index of C_max must be = 1 therefore
we need to initialize loop = 1;
CFR_BS_chosen_users = [];
selected_user_set = [];
keep_searching = 1; % a variable to control the completion of the greedy user
selection process
while (keep_searching) && (sum(N_rx(selected_user_set)) < N_tx) && ((loop-1)
< N_user) % maximum number of Rx antennas to be served is N_tx.
for uu = 1:N_user-(loop-1) % just consider the first "N_user-loop"
elements in user_set since the last "loop" elements (users) were selected.
temp_user_set = [selected_user_set user_set(uu)];
CFR_BS_temp_users = [CFR_BS_chosen_users;CFR_Rx(1:N_rx(user_set
(uu)),1:N_tx,kk,user_set(uu),OFDM_sym)];
if sum( N_rx(temp_user_set) ) > N_tx % not sastify the constraint of
numbers of Tx/Rx antennas
if loop ==1
temp_sum_rate(uu) = log2( det( eye(N_rx(user_set(uu)))+
(Power/N_tx)*...

CFR_BS_temp_users*CFR_BS_temp_users'/No(temp_user_set) ) );
else
temp_sum_rate(uu) = 0;
end
else
if loop == 1 % corresponding to the 1st round of Greedy user
selection
%no SVD required since there is only one user in the
currently considered scenario
temp_sum_rate(uu) = log2( det( eye(N_rx(user_set(uu))) +
(Power/N_tx)*...

CFR_BS_temp_users*CFR_BS_temp_users'/No(temp_user_set) ) );
else % with Greedy user scheduling, selecting too-close users
will reduce the sum-rate of the system.
U_v = zeros(max(N_rx),max(N_rx),length(temp_user_set));
G_ma = zeros(max(N_rx),max(N_rx),length(temp_user_set));
Lamda_vec = zeros(max(N_rx),length(temp_user_set));
Lamda_seq = [];
for user_index = 1:length(temp_user_set)
H_temp = CFR_BS_temp_users;
H_temp( sign(user_index-1)*sum( N_rx( temp_user_set(1:max
(user_index-1,1)) ) ) +...
[1:
N_rx(temp_user_set(user_index))],:) = [];
[U_ma,S_ma,V_ma] = svd(H_temp);
V_precoding = V_ma(1:N_tx,N_tx-N_rx(temp_user_set
N_user = [4 10 20 30];
N_tx :number of transmit antennas at BS; N_rx: number of Rx antennas
N_fft % FFT size used
No; % Noise variance
He soC
N_sym_slot ; % number of OFDM symbols in a time slot in a LTE frame
N_slot = 20; %Number of time slots (each with a length of 0.5ms) in a LTE frame
29/04/2014 17:32 E:\MIMO-DA CHUYEN NGANH\Mu...\Greedy_scheduler_perfectCSI.m 2 of 5
(user_index))+1 : N_tx); % if rank(H_temp) = length(H_temp(:,1));

G_ma(1:N_rx(temp_user_set(user_index)),1:N_rx
(temp_user_set(user_index)),user_index) =...
CFR_Rx(1:N_rx(temp_user_set(user_index)),1:N_tx,
kk,temp_user_set(user_index),OFDM_sym)*V_precoding;
%Consider different No at each user
<<<<<<<<<<<<<<<<<<<<<<<<<<<
[U_v(1:N_rx(temp_user_set(user_index)),1:N_rx
(temp_user_set(user_index)),user_index),Lamda_ma] =...
eig( G_ma(1:N_rx(temp_user_set(user_index)),1:
N_rx(temp_user_set(user_index)),user_index)'*...
G_ma(1:N_rx(temp_user_set(user_index)),1:
N_rx(temp_user_set(user_index)),user_index)/...
No(temp_user_set(user_index)) );

Lamda_vec(1:N_rx(temp_user_set(user_index)),user_index) =
diag(Lamda_ma);
Lamda_seq = [Lamda_seq Lamda_vec(1:N_rx(temp_user_set
(user_index)),user_index).'];
end
lamda_seq_sorted = sort( 1./Lamda_seq,'ascend'); % ascend-
sorting for sequence of inverse lamda values
% Should be carefull at Es_total for case of more than 1
user; Use the samme Es_total, this is verify by hand-writing at page (*)
used_length = length(lamda_seq_sorted); % number of currently
considered users for scheduling
check = 1;
while (check)
water_level = lamda_seq_sorted(used_length); % water
level = 1/mu;
if sum( max(water_level - lamda_seq_sorted, 0) ) > Power
used_length = used_length - 1;
else
check = 0;
end;
end;
%Calculate optimal water level
water_level = ( Power +sum( lamda_seq_sorted(1:used_length) )
)/used_length;
temp_sum_rate(uu) = 0;
for user_index = 1:length(temp_user_set)
S_k = U_v(1:N_rx(temp_user_set(user_index)),1:N_rx
(temp_user_set(user_index)),user_index)*...
diag( max(water_level - 1./Lamda_vec(1:N_rx
(temp_user_set(user_index)),user_index),0) )*...
U_v(1:N_rx(temp_user_set(user_index)),1:N_rx
(temp_user_set(user_index)),user_index)';
temp_sum_rate(uu) = temp_sum_rate(uu) + log2( det( eye
(N_rx(temp_user_set(user_index))) +...
G_ma(1:N_rx(temp_user_set
(user_index)),1:N_rx(temp_user_set(user_index)),user_index)*...

S_k*...
G_ma(1:N_rx(temp_user_set
29/04/2014 17:32 E:\MIMO-DA CHUYEN NGANH\Mu...\Greedy_scheduler_perfectCSI.m 3 of 5
(user_index)),1:N_rx(temp_user_set(user_index)),user_index)'/...
No(temp_user_set
(user_index)) ) );
end
end % of "if loop ==1"
end % checking to see if adding one more user will sastify sum(N_rx
(temp_user_set)) <= N_tx
end % end of " uu = 1:N_user -(loop-1)
[C_max(loop+1),index_max] = max(real( temp_sum_rate( 1:N_user-(loop-1) )
) );% Note that the number of selected users = loop-1 <<<<<<<<<<<<<<<<<<<
if C_max(loop+1) < C_max(loop)%check to stop Greedy user search if an
increase in the number of users reduces the total rate of the system.
keep_searching = 0; % Stop Greedy user selection due to a decrease in
the system sum-rate.
else
selected_user_set = [selected_user_set user_set(index_max)];
% selected_users(loop) = user_set(index_max);
CFR_BS_chosen_users = [CFR_BS_chosen_users;CFR_Rx(1:N_rx(user_set
(index_max)),1:N_tx,kk,user_set(index_max),OFDM_sym)];
user_set(index_max) = 0; % just a way to ignore the currently
selected user in later consideration/user selection.
user_set = sort(user_set,'descend');% a way to ignore the currently
selected user in later greedy user selection.
loop = loop+1; % number of selected users (add ONE new selected user)
= loop-1
end
end % end of the entire schdeduling process.
% Compute the achievable system sum-rate with the above set of selected users
% Repeat the BD precoding for the above set of selected users
if length(selected_user_set) == 1 % corresponding to the 1st round of Greedy
user selection
%no SVD required since there is only one user in the currently considered
scenario
actual_sum_rate=log2( det( eye(N_rx(selected_user_set(1))) + (Power/N_tx)
*...
CFR_Rx(1:N_rx(selected_user_set(1)),1:N_tx,kk,
selected_user_set(1),OFDM_sym)*...
CFR_Rx(1:N_rx(selected_user_set(1)),1:N_tx,kk,
selected_user_set(1),OFDM_sym)'/...
No(selected_user_set(1)) ) );
else % with Greedy user scheduling, selecting too-close users will reduce the
sum-rate of the system.
U_v = zeros(max(N_rx),max(N_rx),length(selected_user_set));
G_ma = zeros(max(N_rx),max(N_rx),length(selected_user_set));
Lamda_vec = zeros(max(N_rx),length(selected_user_set));
Lamda_seq = [];
V_precoding = zeros(N_tx,max(N_rx),length(selected_user_set));
for user_index = 1:length(selected_user_set)
H_temp = CFR_BS_chosen_users;
H_temp( sign(user_index-1)*sum( N_rx( selected_user_set(1:max
(user_index-1,1)) ) ) +...
[1:N_rx
(selected_user_set(user_index))],:) = [];
[U_ma,S_ma,V_ma] = svd(H_temp);
V_precoding(1:N_tx,1:N_rx(selected_user_set(user_index)),user_index)
29/04/2014 17:32 E:\MIMO-DA CHUYEN NGANH\Mu...\Greedy_scheduler_perfectCSI.m 4 of 5
=...
V_ma(1:N_tx,N_tx - N_rx
(selected_user_set(user_index))+ 1 : N_tx); % if rank(H_temp) = length(H_temp(:,1));
G_ma(1:N_rx(selected_user_set(user_index)),1:N_rx(selected_user_set
(user_index)),user_index) =...
CFR_Rx(1:N_rx(selected_user_set(user_index)),1:N_tx,kk,
selected_user_set(user_index),OFDM_sym)*...
V_precoding(1:N_tx,1:N_rx(selected_user_set(user_index)),
user_index);
%Consider different No at each user
<<<<<<<<<<<<<<<<<<<<<<<<<<<
[U_v(1:N_rx(selected_user_set(user_index)),1:N_rx(selected_user_set
(user_index)),user_index),Lamda_ma] =...
eig(G_ma(1:N_rx(selected_user_set(user_index)),1:N_rx
(selected_user_set(user_index)),user_index)'*...
G_ma(1:N_rx(selected_user_set(user_index)),1:N_rx
(selected_user_set(user_index)),user_index)/...
No(selected_user_set(user_index)));

Lamda_vec(1:N_rx(selected_user_set(user_index)),user_index) = diag
(Lamda_ma);
Lamda_seq = [Lamda_seq Lamda_vec(1:N_rx(selected_user_set
(user_index)),user_index).'];
end
lamda_seq_sorted = sort( 1./Lamda_seq,'ascend'); % ascend-sorting for
sequence of inverse lamda values
% Should be carefull at Es_total for case of more than 1 user; Use the
samme Es_total, this is verify by hand-writing at page (*)
used_length = length(lamda_seq_sorted); % number of currently considered
users for scheduling
check = 1;
while (check)
water_level = lamda_seq_sorted(used_length); % water level = 1/mu;
if sum( max(water_level - lamda_seq_sorted, 0) ) > Power
used_length = used_length - 1;
else
check = 0;
end;
end;
%Calculate optimal water level
water_level = ( Power +sum( lamda_seq_sorted(1:used_length) ) )
/used_length;
Cov_I_Sig = zeros(N_tx,N_tx); % Covariance matrix of interference +
signal of interest
S_k = zeros(max(N_rx),max(N_rx),length(selected_user_set));
for user_index = 1:length(selected_user_set)
S_k(1:N_rx(selected_user_set(user_index)),1:N_rx(selected_user_set
(user_index)),user_index) =...
U_v(1:N_rx(selected_user_set(user_index)),1:N_rx
(selected_user_set(user_index)),user_index)*...
diag( max(water_level - 1./Lamda_vec(1:N_rx
(selected_user_set(user_index)),user_index),0) )*...
U_v(1:N_rx(selected_user_set(user_index)),1:N_rx
(selected_user_set(user_index)),user_index)';

29/04/2014 17:32 E:\MIMO-DA CHUYEN NGANH\Mu...\Greedy_scheduler_perfectCSI.m 5 of 5
Cov_I_Sig = Cov_I_Sig + V_precoding(1:N_tx,1:N_rx
(selected_user_set(user_index)),user_index)*...
S_k(1:N_rx(selected_user_set(user_index)),
1:N_rx(selected_user_set(user_index)),user_index)*...
V_precoding(1:N_tx,1:N_rx
(selected_user_set(user_index)),user_index)';
end
actual_sum_rate = 0;
for user_index = 1:length(selected_user_set)
actual_sum_rate = actual_sum_rate +...
log2( det( No(selected_user_set(user_index))*eye
(N_rx(selected_user_set(user_index))) +...
CFR_Rx(1:N_rx(selected_user_set
(user_index)),1:N_tx,kk,selected_user_set(user_index),OFDM_sym)*...
Cov_I_Sig*...
CFR_Rx(1:N_rx(selected_user_set
(user_index)),1:N_tx,kk,selected_user_set(user_index),OFDM_sym)' )/...
det( No(selected_user_set(user_index))*eye
(N_rx(selected_user_set(user_index))) +...
CFR_Rx(1:N_rx(selected_user_set
(user_index)),1:N_tx,kk,selected_user_set(user_index),OFDM_sym)*...
( Cov_I_Sig -...
V_precoding(1:N_tx,1:N_rx
(selected_user_set(user_index)),user_index)*...
S_k(1:N_rx(selected_user_set
(user_index)),1:N_rx(selected_user_set(user_index)),user_index)*...
V_precoding(1:N_tx,1:N_rx
(selected_user_set(user_index)),user_index)' )*...
CFR_Rx(1:N_rx(selected_user_set
(user_index)),1:N_tx,kk,selected_user_set(user_index),OFDM_sym)' ) );
end
end
total_rate_frame = total_rate_frame + actual_sum_rate;
end
end

You might also like