m基于matlab的软件无线电注水功率分配算法性能仿真,对比C-PF,C-CUBP,C-DUBP等

1.算法描述

       注水算法是根据某种准则,并根据信道状况对发送功率进行自适 应分配,通常是信道状 况好的时刻,多分配功率,信道差的时候, 少分配功率,从而最大化传输速率。注水算法是根据某种准则,并根据信道状况对发送功率进行自适应分配,通常是信道状况好的时刻,多分配功率,信道差的时候,少分配功率,从而最大化传输速率。实现功率的注水分配,发送端必须知道CSI。当接收端完全知道信道而发送端不知道信号时,发送天线阵列中的功率平均分配是合理的。当发送端知道信道,可以增加信道容量。

 

        信道功率的注水分配 [1] 是一种形象的说法——假设要为几个信噪比(γ)各不相同的子信道分配功率。曲线1/γ 代表碗底;而功率被注入这只碗,直到恒定的水面线1/γ0(γ0是参考信噪比)为止。对于某个给定信噪比为γ的子信道,注入的功率量是1/γ01/γ,即碗底(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

 

  

 

posted @ 2023-02-01 23:06  我爱C编程  阅读(49)  评论(0编辑  收藏  举报