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

2,329 阅读2分钟

1.算法描述

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

 

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

 

       注水原理背后的思路是充分利用信道的良好状况:信道状况好的时刻(γ大),多分配功率,即提高数据传输速率;信道状况差的时候(γ小),少分配功率,即降低数据传输速率;如果信道状况低于某个阀值(比如γ<γ0),就不分配功率。运用注水分配,可以最大化传输速率。

1.png

2.png

3.png

4.png

Step3:若分配到最小增益的信道能量为负值,即设,p=p+1,转至 Step1;

 

若任意非负,即得到最佳注水功率分配策略。

 

2.仿真效果预览

matlab2022a仿真如下:

5.png

6.png

7.png

8.png

       分布式算法,主要是降低算法的资源消耗,但是性能不如集中式算法。降低资源消耗,集中性非常耗资源,而分布式则可以大大降低资源消耗,但性能只是略低于集中式,所以选择分布式。

 

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 + rhoBEtmpsR2;

        Qm     =  tmpsQ - RmTssum(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`