Pre-ci test passed git-svn-id: http://svn.eurecom.fr/openair4G/trunk@4000 818b1a75-f10b-46b9-bf7c-635c3b92a50f
74 lines
2.1 KiB
Matlab
Executable File
74 lines
2.1 KiB
Matlab
Executable File
%Sum Power Iterative Waterfilling Algorithm
|
|
%Authors: Nihar Jindal, Wonjong Rhee, Sriram Vishwanath, Syed Jafar, Andrea
|
|
%Goldsmith
|
|
%Date: 6/20/05
|
|
|
|
function [capacity, Covariances] = iterative_waterfill(H, P, iterations);
|
|
|
|
%Function Inputs
|
|
%H: triply indexed UPLINK channel
|
|
% H(:,:,k) refers to the UPLINK channel of the kth receiver
|
|
% H(:,:,k) is an (M x N) matrix
|
|
%P: power in linear units
|
|
%iterations: # of iterations performed
|
|
|
|
%Function Outputs
|
|
%capacity: Sum rate capacity in bps/Hz
|
|
%Covariances: triply indexed matrices containing the capacity achieving
|
|
% UPLINK covariance matrices
|
|
% Covariances(:,:,k) is the (N x N) covariance of user k
|
|
|
|
%Other Variables
|
|
%M: # of transmit antennas in downlink channel
|
|
%N: # of receive antennas in downlink channel
|
|
%K: # of receivers
|
|
|
|
%Determine # of antennas, users
|
|
[M,N,K] = size(H);
|
|
|
|
%Initialize covariances to zero
|
|
Covariances = zeros(N,N,K);
|
|
|
|
for wf_iterations = 1:iterations
|
|
|
|
sum_int = eye(M);
|
|
for k = 1:K
|
|
sum_int = sum_int + H(:,:,k) * Covariances(:,:,k) * H(:,:,k)';
|
|
end;
|
|
|
|
%Generate effective channels of each user (using covariances from the
|
|
%previous step)
|
|
for k = 1:K
|
|
H_eff(:,:,k) = (sum_int - H(:,:,k) * Covariances(:,:,k) * H(:,:,k)')^(-0.5) * H(:,:,k);
|
|
end;
|
|
|
|
%Perform waterfilling across effective channels
|
|
[temp, Ex] = waterfill_block(H_eff, P);
|
|
|
|
%Update covariances of all users
|
|
%Use original algorithm for first 5 iterations to speed up convergence
|
|
if (wf_iterations <= 5)
|
|
%Updated covariances set equal to new covariances
|
|
for k = 1:K
|
|
Covariances(:,:,k) = Ex(:,:,k);
|
|
end;
|
|
else
|
|
%Update covariances with mixture of old and new covariances
|
|
for k = 1:K
|
|
Covariances(:,:,k) = ((K-1)/K)*Covariances(:,:,k) + (1/K) * Ex(:,:,k);
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
%Compute final sum rate
|
|
sum_int = eye(M);
|
|
for k = 1:K
|
|
sum_int = sum_int + H(:,:,k) * Covariances(:,:,k) * H(:,:,k)';
|
|
end;
|
|
capacity = real(log2(det(sum_int)));
|
|
|
|
|
|
|
|
|
|
|