最近一直在学习一位学姐的知乎文章,文章链接放到下面了。
这里面涉及到了注水算法,为了学习的更明白,写这篇博客方便以后能快速记起,如果内容有问题的地方,欢迎在评论区讨论。
注水(water filling)算法是一种功率分配算法,旨在为信道条件更好的用户分配更多的功率。
一个基站对应多个用户
其中p_k表示第 k 个用户分配到的功率, |?_k|^2 表示第 k 个用户的信道增益。
并且所有用户的功率和不能 超过总的功率限制
( 为基站发射的总功率)
该优化问题可以通过拉格朗日乘子法得到最优解
这里推荐两个讲的比较好的博客
拉格朗日乘子法(Lagrange Multiplier Method)详解
原问题(1),可以转换为:
其中 \lambda∈R 是拉格朗日乘子。然后 L({\bf{p}},\lambda) 对 p_k的导函数为:
在这里为了表示方便,令,因此
由于 p_k≥0 这一约束条件的存在,于是有
?
由于,则
?
就是注水面。
?
用下图可以形象的表示注水算法
clc;
clear;
%% Simulation params
N = 1; % Number of transmit antennas
K = 4; % Number of users
P_max = -10:5:30; % maximum transmission power (dBm)
sigma_2 = 1; % noise power
ch_realization = 10; % channel realizations
%% Generate Channles - Normalized Rayleigh fading channel
H = sqrt(1/2)*(randn(N,K,ch_realization)+1i*randn(N,K,ch_realization));
rate_water = zeros(ch_realization, length(P_max));
n = 1;
while (n < ch_realization + 1)
n
h = H(:,:,n);
for j=1:length(P_max)
p_max = db2pow(P_max(j));
opt_p = zeros(K,1);
sum1 = 0;
for k=1:K
sum1 = sum1 + sigma_2/(h(:,k)*h(:,k)');
end
mu = (p_max+sum1)/K;
for k = 1:K
opt_p(k) = max(mu - sigma_2/(h(:,k)*h(:,k)'),0);
end
rate_water(n,j) = rate(opt_p,h,sigma_2,K);
end
n = n+1;
end
plot(P_max,mean(rate_water,1),'or-','LineWidth',2)
hold on
grid on
xlabel('P_{max}(dBm)')
ylabel('Rate (bit/s/Hz)')
legend('waterFilling Method','Location','northwest')
function r = rate(p,h,sigma_2,K)
sum = 0;
for k = 1:K
sum = sum + log2(1+p(k)*(h(:,k)*h(:,k)')/sigma_2);
end
r = sum;
end