Water Filling Algorithm and Matlab Simulation

Water Filling Algorithm and Matlab Simulation

注水算法是根据某种准则,并根据信道状况对发送功率进行自适应分配,通常是信道状况好的时刻,多分配功率,信道差的时候,少分配功率,从而最大化传输速率。

当接收端完全已知CSI(信道状态信息)而发送端未知CSI时,发送天线阵列中的功率平均分配是合理的。

实现功率的“注水”分配,发送端必须知道CSI。

直观而言,就如下图所示:

water filling

图1 注水原理示意图(白色平台越高代表信道条件越差,注入的水就越少)

注水原理可以建模为下述优化问题:

其中${C}_{sum}$表示系统总信道容量,$N$为信道数,${P}_{n}$为第$n$个信道的功率,${h}_{n}$为第$n$个信道的信道增益,${N}_{0}$为噪声功率谱密度,${P}_{sum}$为传输总功率,也就是总水量。

该优化问题为凸优化问题,可以用拉格朗日乘数法求得全局最优解。

令$\frac{\partial \mathcal{L} }{\partial P_n}=\frac{\partial \mathcal{L} }{\partial \lambda }=0$,解得最优功率分配方案为:

其中${(\centerdot )}^{+}$表示取值非负。

MATLAB实现

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
clear all;
channel_n=10; %channel number
M=[5,10,20,50]; %transmitted power
N0=0.5;
h_1= random('rayleigh',1,1,channel_n); %Rayleigh fading
h_2=h_1.^2; %|h|.^2
h_2_sorted=sort(h_2); %sort the channel gain
h=h_2_sorted/N0;
syms lamda
for m=1:length(M)
fprintf('transmitted power is %d watt',M(m));
for k=1:channel_n
p=zeros(1,channel_n);
sum=0;
for i=k:channel_n
sum=sum+(1/lamda-1/h(i));
end
f=sum-M(m);
x=solve(f,lamda); %find lamda
if k==1
if vpa(x)>0 && vpa(x)<h(k)
for i=k:channel_n
p(i)=1/x-1/h(i); %allocate power
capacity=capacity+log2(1+p(i)*h(i));%compute the capacity
end
p(i)=vpa(p(i),3)
capacity=vpa(capacity,3)
end
else
if vpa(x)>h(k-1) && vpa(x)<h(k)
capacity=0;
for i=k:channel_n
p(i)=1/x-1/h(i); %allocate power
capacity=capacity+log2(1+p(i)*h(i)); %compute the capacity
end
p(i)=vpa(p(i),3)
capacity=vpa(capacity,3)
end
end
end
end
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×