close all
clc
nt_V = [1 2 3 2 4]
nr_V = [1 2 2 3 4]
N0 = 1e-4
B = 1
Iteration = 1e2% must be grater than 1e2
SNR_V_db = [-10:3:20]
SNR_V= 10.^(SNR_V_db/10)
color = ['b''r''g''k''m']
notation = ['-o''->''<-''-^''-s']
for(k = 1 : 5)
nt = nt_V(k)
nr = nr_V(k)
for(i = 1 : length(SNR_V))
Pt = N0 * SNR_V(i)
for(j = 1 : Iteration)
H = random('rayleigh',1,nr,nt)
[S V D] = svd(H)
landas(:,j) = diag(V)
[Capacity(i,j) PowerAllo] = WaterFilling_alg(Pt,landas(:,j),B,N0)
end
end
f1 = figure(1)
hold on
plot(SNR_V_db,mean(Capacity'),notation(k,:),'color',color(k,:))
clear landas
end
f1 = figure(1)
legend_str = []
for( i = 1 : length(nt_V))
legend_str =[ legend_str ...
{['nt = ',num2str(nt_V(i)),' , nr = ',num2str(nr_V(i))]}]
end
legend(legend_str)
grid on
set(f1,'color',[1 1 1])
xlabel('SNR in dB')
ylabel('Capacity bits/s/Hz')
function [Capacity PowerAllo] = WaterFilling_alg(PtotA,ChA,B,N0)
%
% WaterFilling in Optimising the Capacity
%===============
% Initialization
%===============
ChA = ChA + eps
NA = length(ChA)% the number of subchannels allocated to
H = ChA.^2/(B*N0) % the parameter relate to SNR in subchannels
% assign the power to subchannel
PowerAllo = (PtotA + sum(1./H))/NA - 1./H
while(length(find(PowerAllo <0 ))>0)
IndexN = find(PowerAllo <= 0 )
IndexP = find(PowerAllo >0)
MP = length(IndexP)
PowerAllo(IndexN) = 0
ChAT = ChA(IndexP)
HT = ChAT.^2/(B*N0)
PowerAlloT = (PtotA + sum(1./HT))/MP - 1./HT
PowerAllo(IndexP) = PowerAlloT
end
PowerAllo = PowerAllo.'
Capacity = sum(log2(1+ PowerAllo.' .* H))
来自专栏专业知识1 传统注水(water filling)算法
注水(water filling)算法是一种功率分配算法,为信道条件更好的用户分配更多的功率。
优化目标:
分配 每个 用户的功率 使得总的信道容量最大
其中 代表噪声, 代表第i个用户的信道增益,信道条件越好,增益越大
限制条件:
所有用户的功率和不能 超过总的功率限制
( 为基站的总功率)
求解方法:
这是 一个等式约束问题,可以用拉格朗日乘子法求解
结果:
因为功率不能为负数,所有每个用户的功率为
就是注水面,通过代入功率的限制条件可以得到 μ的表达式
总结:
如图所示, 就是注水面,用户2的“水面高度”是 ,分配给用户2 的功率就是 ,同理,分配给用户3的功率就是阴影部分的高度。(红色的 是水面高度差,下一部分用到)
2 几何注水算法(geometric water- fifilling (GWF))
传统的注水算法先要得到注水面 μ,然后通过 得到每个用户的功率
几何注水法不需要知道注水面
这里就不详细推导了
总结下来就是:
1:得到最差用户的功率(图中的 )
2:用最差用户的功率加上水面高度差就能得到各个用户的功率
例如用加上用户3与用户2之间的水面高度差就能得到用户2 的功率( )
其中,水面高度差:
同理
具体如何找到最差的用户以及如何得到最差用户的功率,有兴趣的话可以 看看下面的文章。
P. He, L. Zhao, S. Zhou and Z. Niu, "Water-Filling: A Geometric Approach and its Application to Solve Generalized Radio Resource Allocation Problems," in IEEE Transactions on Wireless Communications, vol. 12, no. 7, pp. 3637-3647, July 2013, doi: 10.1109/TWC.2013.061713.130278
基本原理:
1、信噪比(即信号功率谱与噪声功率谱之和)为常数时,系统才能达到总信道容量最大的要求;
2、当SNR很大时,Pi等功率分配,注水算法功效消失;
3、在功率分配的问题中,只有满足注水定理时,才能达到信道容量最大化;
4、也就是说信噪比大的信道分得的功率多,信噪比小的信道分得的功率少;
5、使用拉格朗日乘子分配信道功率Pi使得信道容量最大。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)