m基于matlab的软件无线电注水功率分配算法性能仿真,对比C-PF,C-CUBP,C-DUBP等
1.算法描述
注水算法是根据某种准则,并根据信道状况对发送功率进行自适 应分配,通常是信道状 况好的时刻,多分配功率,信道差的时候, 少分配功率,从而最大化传输速率。注水算法是根据某种准则,并根据信道状况对发送功率进行自适应分配,通常是信道状况好的时刻,多分配功率,信道差的时候,少分配功率,从而最大化传输速率。实现功率的注水分配,发送端必须知道CSI。当接收端完全知道信道而发送端不知道信号时,发送天线阵列中的功率平均分配是合理的。当发送端知道信道,可以增加信道容量。
信道功率的注水分配 [1] 是一种形象的说法——假设要为几个信噪比(γ)各不相同的子信道分配功率。曲线1/γ 代表碗底;而功率被注入这只碗,直到恒定的水面线1/γ0(γ0是参考信噪比)为止。对于某个给定信噪比为γ的子信道,注入的功率量是1/γ0− 1/γ,即碗底(1/γ)和水面(1/γ0)之间的水量。
注水原理背后的思路是充分利用信道的良好状况:信道状况好的时刻(γ大),多分配功率,即提高数据传输速率;信道状况差的时候(γ小),少分配功率,即降低数据传输速率;如果信道状况低于某个阀值(比如γ<γ0),就不分配功率。运用注水分配,可以最大化传输速率。
Step3:若分配到最小增益的信道能量为负值,即设,p=p+1,转至 Step1;
若任意非负,即得到最佳注水功率分配策略。
2.仿真效果预览
matlab2022a仿真如下:
分布式算法,主要是降低算法的资源消耗,但是性能不如集中式算法。降低资源消耗,集中性非常耗资源,而分布式则可以大大降低资源消耗,但性能只是略低于集中式,所以选择分布式。
3.MATLAB核心程序
beta = 1.5; Parts = 5; Ts = 5; Steps = 5; End_Times = 10000; Factor = zeros(2,KK); Rm = zeros(1,1); Qm = zeros(1,1); Alloc = zeros(1,KK); T_users = T_users; dr = 0; or = 0; ind = 0; ino = 0; rhoBE = 0.5; for schedule_time = 1:Steps:End_Times%for each time slot t = schedule_time; if schedule_time <= 2*Steps M = randperm(length(T_users)); M1 = M(1:floor(length(T_users)/2)); M2 = M(floor(length(T_users)/2)+1:end); PI1= zeros(1,length(M1)); PI2= zeros(1,length(M2)); ind0 = find(T_users <= mean(T_users)); ind1 = find(T_users > mean(T_users)); for j = 1:KK for k = 1:length(M1) PI1(k) = T_users(M1(k)); end for k = 1:length(M2) PI2(k) = T_users(M2(k)); end Len = min(length(M1),length(M2)); PIs = PI1(1:Len) + PI2(1:Len); [V,I] = max(PIs); Xmax(j) = V; end SK =[]; for j1 = 1:length(ind0) for j2 = 1:length(ind1) if Xmax(ind0(j1)) >= Xmax(ind1(j2)) SK = [SK,j1]; end end end SK = unique(SK); if isempty(SK) == 1 SK = 1; end tmps = log2(1 + beta*abs(SNIR)); Rm = mean(Xmax(SK))*mean(mean(tmps)); Qm = 100; tmpsR1= Rm; tmpsR2= tmpsR1; tmpsQ = Qm; else M = randperm(length(T_users)); M1 = M(1:floor(length(T_users)/2)); M2 = M(floor(length(T_users)/2)+1:end); PI1= zeros(1,length(M1)); PI2= zeros(1,length(M2)); ind0 = find(T_users <= mean(T_users)); ind1 = find(T_users > mean(T_users)); for j = 1:KK for k = 1:length(M1) PI1(k) = T_users(M1(k)); end for k = 1:length(M2) PI2(k) = T_users(M2(k)); end Len = min(length(M1),length(M2)); PIs = PI1(1:Len) + PI2(1:Len); [V,I] = max(PIs); Xmax(j) = V; end SK =[]; for j1 = 1:length(ind0) for j2 = 1:length(ind1) if Xmax(ind0(j1)) >= Xmax(ind1(j2)) SK = [SK,j1]; end end end SK = unique(SK); if isempty(SK) == 1 SK = 1; end Rm = (1-rhoBE)*tmpsR1 + rhoBE*tmpsR2; Qm = tmpsQ - Rm*Ts*sum(T_users(SK)); tmpsR1 = Rm; tmpsR2 = tmpsR1; tmpsQ = Qm; end p = rand; if p <= 0.3; ino = ino + KK; p2 = rand; if p2 <= 0.5; ind = ind + KK; end end end SU = Rm/1e2; Rms= Rm/KK/3; dr = ind/End_Times; or = ino/End_Times; 01_098m