zl程序教程

您现在的位置是:首页 >  其它

当前栏目

【分集/不分集OFDM】分集/不分集多跳OFDM信道容量,分别考虑功率分配带子载波配对,功率分配不带子载波配对等

分配 考虑 分别 功率 OFDM 配对 载波
2023-09-11 14:15:33 时间

1.软件版本

matlab2017b

2.本算法理论知识

[1] Ying W ,  Qu X C ,  Tong W , et al. Power Allocation and Subcarrier Pairing Algorithm for Regenerative OFDM Relay System[C]// IEEE Vehicular Technology Conference-vtc-spring. IEEE, 2007.

3.部分源码

clc;
clear;
close all;
warning off;

%参数初始化
d0               = 10;
Distance         = 1000;
Path_loss_factor = [4;4;4];
SP               = 5;
Fre_carrier      = 2e9;
SB               = 1.92e6;
Num_sc           = 128;
SCB              = 15e3;
Delay            = [0,0.2,0.8,1.2,2.3,3.7];
Gain             = [0,-0.9,-4.9,-8,-7.8,-23.9];
Dist_Tx_Rn       = [300:40:660];
SNR              = 0.8;
Simu_Times       = 20;%循环次数越多,最后得到的曲线越光滑
N_hop            = 2;
gammar           = 0.152;
Time_Slot        = 1;

PA_W_P           = zeros(length(Dist_Tx_Rn),1);
PA_Wo_P          = zeros(length(Dist_Tx_Rn),1);
uPA_W_P          = zeros(length(Dist_Tx_Rn),1);
uPA_Wo_P         = zeros(length(Dist_Tx_Rn),1);
dirl             = zeros(length(Dist_Tx_Rn),1);

%%
%不分集OFDM的功率分配带子载波配对算法下的信道容量;
%PA with pairing without diversity
C1  = 0;
C1s = 0;
for Ss = 1:length(Dist_Tx_Rn)
    Ss
    %利用蒙特卡洛算法思想,进行多次的循环,再计算平均
    for q=1:Simu_Times
        for Ts = 1:Time_Slot
            Cha      = 0.5e-1*random('rayleigh',1,N_hop/Time_Slot,Num_sc);
            Sub      = zeros(N_hop/Time_Slot,Num_sc);%每跳的子载波分布向量
            Capacity = zeros(1,N_hop/Time_Slot);     %定义容量向量
            for i=1:N_hop/Time_Slot
                %每一跳噪声设定
                n0        = randn(1,10000)*sqrt(SCB*0.5e-10);      
                N0        = std(n0,1,2)^2/SCB;
                %选择其中的min值
                [a,ind]   = min(Cha(:,Time_Slot));   
                %将选中的载波的信道因子赋值给该跳的子载波分布向量
                Sub(i,ind)= a;                      
                %进行注水功率分配
                [Capacity1(i),Powers1] = pwrallo(SP,Sub(i,:),SCB,N0,gammar); 
                %载波被某一跳占用,将所有跳上的该载波信道因子设为0
                Cha(:,ind)             = 0;     
            end
            while max(Cha(:))> 0               %判断是否有未分配的载波,有的话继续分配
                [b,indexmin] = min(Capacity1);  %找出速率最小的跳
                i            = indexmin;
                [c,indexmax] = max(Cha(i,:)); %给最小的跳分配载波
                k            = indexmax;
                Sub(i,k)     = c;
                [Capacity1(i),Powers1] = pwrallo(SP,Sub(i,:),SCB,N0,gammar);
                Cha(:,k)     = 0;
            end     
        end
        %通过注水法得到的每个Powers1,然后进行sub_carrier pairing
        %通过注水法得到的每个Powers1,然后进行sub_carrier pairing
        Num_sc1 = randperm(Num_sc);
        Num_sc2 = randperm(Num_sc);
        for kk = 1:length(Num_sc2)
            h1k(kk)= func_h1(Delay,Gain,Num_sc,SB,Dist_Tx_Rn(Ss),Path_loss_factor(2),Num_sc1(kk));
            h2k(kk)= func_h2(Delay,Gain,Num_sc,SB,Dist_Tx_Rn(Ss),Path_loss_factor(3),Num_sc2(kk));
            hk(kk) = h1k(kk)*h2k(kk)/(h1k(kk) + h2k(kk));
            delta  = (SNR)^2/2;
            a1k(kk)= (abs(h1k(kk)))^2/delta;
            a2k(kk)= (abs(h2k(kk)))^2/delta;
        end
        %中继功率分配
        [Capacity1,Powers1s] = pwrallo(SP,abs(hk),SCB,N0,gammar); 
        %排序
        A1k = sort(a1k);
        A2k = sort(a2k);
        for kk = 1:length(Powers1)
            Pk     = Powers1s(kk)+1/((A1k(kk)*A2k(kk))/(A1k(kk)+A2k(kk)));
            C1(kk) = log2(1 + (A1k(kk)*A2k(kk))/(A1k(kk)+A2k(kk))*Pk); 
        end
        C1s(q) = SB/(2*Num_sc)*sum(C1); 
    end
    PA_W_P(Ss) = mean(C1s)/1e6;
end
%**************************************************************************
%**************************************************************************
%**************************************************************************
%**************************************************************************



%%
%不分集OFDM的功率分配不带子载波配对算法下的信道容量;
%PA without pairing without diversity
C1  = 0;
C1s = 0;
for Ss = 1:length(Dist_Tx_Rn)
    Ss
    %利用蒙特卡洛算法思想,进行多次的循环,再计算平均
    for q=1:Simu_Times
        for Ts = 1:Time_Slot
            Cha      = 0.5e-1*random('rayleigh',1,N_hop/Time_Slot,Num_sc);
            Sub      = zeros(N_hop/Time_Slot,Num_sc);%每跳的子载波分布向量
            Capacity = zeros(1,N_hop/Time_Slot);     %定义容量向量
            for i=1:N_hop/Time_Slot
                %每一跳噪声设定
                n0        = randn(1,10000)*sqrt(SCB*0.5e-10);      
                N0        = std(n0,1,2)^2/SCB;
                %选择其中的min值
                [a,ind]   = min(Cha(:,Time_Slot));   
                %将选中的载波的信道因子赋值给该跳的子载波分布向量
                Sub(i,ind)= a;                      
                %进行注水功率分配
                [Capacity1(i),Powers1] = pwrallo(SP,Sub(i,:),SCB,N0,gammar); 
                %载波被某一跳占用,将所有跳上的该载波信道因子设为0
                Cha(:,ind)             = 0;     
            end
            while max(Cha(:))> 0               %判断是否有未分配的载波,有的话继续分配
                [b,indexmin] = min(Capacity1);  %找出速率最小的跳
                i            = indexmin;
                [c,indexmax] = max(Cha(i,:)); %给最小的跳分配载波
                k            = indexmax;
                Sub(i,k)     = c;
                [Capacity1(i),Powers1] = pwrallo(SP,Sub(i,:),SCB,N0,gammar);
                Cha(:,k)     = 0;
            end     
        end
        for kk = 1:length(Powers1)
            h1k    = func_h1(Delay,Gain,Num_sc,SB,Dist_Tx_Rn(Ss),Path_loss_factor(2),kk);
            h2k    = func_h2(Delay,Gain,Num_sc,SB,Dist_Tx_Rn(Ss),Path_loss_factor(3),kk);
            delta  = (SNR)^2/2;
            a1k    = (abs(h1k))^2/delta;
            a2k    = (abs(h2k))^2/delta;
            Pk     = Powers1(kk)+1/((a1k*a2k)/(a1k+a2k));
            C1(kk) = log2(1 + (a1k*a2k)/(a1k+a2k)*Pk); 
        end
        C1s(q) = SB/(2*Num_sc)*sum(C1); 
    end
    PA_Wo_P(Ss) = mean(C1s)/1e6;
end
%**************************************************************************
%**************************************************************************
%**************************************************************************
%************************************************************************** 



%%
%不分集OFDM的均匀功率分配带子载波配对算法下的信道容量;
%uniform PA without pairing without diversity
for Ss = 1:length(Dist_Tx_Rn)
    Ss
    %利用蒙特卡洛算法思想,进行多次的循环,再计算平均
    for q=1:Simu_Times
        %通过注水法得到的每个Powers1,然后进行sub_carrier pairing
        %通过注水法得到的每个Powers1,然后进行sub_carrier pairing
        Num_sc1 = randperm(Num_sc);
        Num_sc2 = randperm(Num_sc);        
        for kk = 1:length(Num_sc2)
            h1k(kk)= func_h1(Delay,Gain,Num_sc,SB,Dist_Tx_Rn(Ss),Path_loss_factor(2),Num_sc1(kk));
            h2k(kk)= func_h2(Delay,Gain,Num_sc,SB,Dist_Tx_Rn(Ss),Path_loss_factor(3),Num_sc2(kk));
            hk(kk) = h1k(kk)*h2k(kk)/(h1k(kk) + h2k(kk));
            delta  = (SNR)^2/2;
            a1k(kk)= (abs(h1k(kk)))^2/delta;
            a2k(kk)= (abs(h2k(kk)))^2/delta;
        end
        %排序
        A1k = sort(a1k);
        A2k = sort(a2k);
        for kk = 1:Num_sc
            %均匀分配
            Pk      = SP/Num_sc;
            tmp1(kk)=(A1k(kk)*A2k(kk))/(A1k(kk)+A2k(kk));
            C1(kk)  = log2(1 + tmp1(kk)*Pk); 
        end
        C1s(q) = SB/(2*Num_sc)*sum(C1); 
    end
    uPA_W_P(Ss) = mean(C1s)/1e6;
end
%**************************************************************************
%**************************************************************************
%**************************************************************************
%**************************************************************************



%%
%不分集OFDM的均匀功率分配不带子载波配对算法下的信道容量;
%uniform PA without pairing without diversity
for Ss = 1:length(Dist_Tx_Rn)
    Ss
    %利用蒙特卡洛算法思想,进行多次的循环,再计算平均
    for q=1:Simu_Times
        Num_sc1 = randperm(Num_sc);
        Num_sc2 = randperm(Num_sc);
        for kk = 1:Num_sc
            h1k(kk)    = func_h1(Delay,Gain,Num_sc,SB,Dist_Tx_Rn(Ss),Path_loss_factor(2),Num_sc1(kk));
            h2k(kk)    = func_h2(Delay,Gain,Num_sc,SB,Dist_Tx_Rn(Ss),Path_loss_factor(3),Num_sc2(kk));
            delta      = (SNR)^2/2;
            a1k(kk)    = (abs(h1k(kk)))^2/delta;
            a2k(kk)    = (abs(h2k(kk)))^2/delta;
            %均匀分配
            Pk         = SP/Num_sc;
            tmp2(kk)   =(a1k(kk)*a2k(kk))/(a1k(kk)+a2k(kk));
            C1(kk)     = log2(1 + tmp2(kk)*Pk); 
        end
        C1s(q) = SB/(2*Num_sc)*sum(C1); 
    end
    uPA_Wo_P(Ss) = mean(C1s)/1e6;
end
%**************************************************************************
%**************************************************************************
%**************************************************************************
%**************************************************************************


%%
%不分集OFDM的不使用功率分配和子载波配对算法下的信道容量;
%direct link
for Ss = 1:length(Dist_Tx_Rn)
    dirl(Ss) = SB*log(1+SNR)/1e6;
end
%**************************************************************************
%**************************************************************************
%**************************************************************************
%**************************************************************************

figure;
plot(Dist_Tx_Rn,PA_W_P,'k-^','LineWidth',2);
hold on
plot(Dist_Tx_Rn,PA_Wo_P,'b-*','LineWidth',2);
hold on
plot(Dist_Tx_Rn,uPA_W_P,'r-o','LineWidth',2);
hold on
plot(Dist_Tx_Rn,uPA_Wo_P,'m-s','LineWidth',2);
hold on
plot(Dist_Tx_Rn,dirl,'g-+','LineWidth',2);
hold off
legend('PA with Pairing','PA without Pairing','Uniform PA with Pairing','Uniform PA without Pairing','Direct link');
grid on;
xlabel('The distance between TX and RN(without diversity)');
ylabel('Capacity bps/Hz');
axis([300,660,1,2]);
axis square 

4.仿真结论

·不分集OFDM的功率分配带子载波配对算法下的信道容量;

·不分集OFDM的功率分配不带子载波配对算法下的信道容量;

·不分集OFDM的均匀功率分配带子载波配对算法下的信道容量;

·不分集OFDM的均匀功率分配不带子载波配对算法下的信道容量;

·不分集OFDM的不使用功率分配和子载波配对算法下的信道容量;

我们的仿真结果如下所示:

 

    这个部分主要是仿真如下的五个部分内容:

·分集OFDM的功率分配带子载波配对算法下的信道容量;

·分集OFDM的功率分配不带子载波配对算法下的信道容量;

·分集OFDM的均匀功率分配带子载波配对算法下的信道容量;

·分集OFDM的均匀功率分配不带子载波配对算法下的信道容量;

·分集OFDM的不使用功率分配和子载波配对算法下的信道容量;

我们的仿真结果如下所示:

 这个部分主要是仿真如下的五个部分内容:

·不分集2跳OFDM的功率分配带子载波配对算法下的信道容量(SIR);

·不分集2跳OFDM的功率分配不带子载波配对算法下的信道容量(SIR);

·不分集2跳OFDM的均匀功率分配带子载波配对算法下的信道容量(SIR);

·不分集2跳OFDM的均匀功率分配不带子载波配对算法下的信道容量(SIR);

·不分集2跳OFDM的不使用功率分配和子载波配对算法下的信道容量(SIR);

我们的仿真结果如下所示:

·不分集3跳OFDM的功率分配带子载波配对算法下的信道容量(SIR);

·不分集3跳OFDM的功率分配不带子载波配对算法下的信道容量(SIR);

·不分集3跳OFDM的均匀功率分配带子载波配对算法下的信道容量(SIR);

·不分集3跳OFDM的均匀功率分配不带子载波配对算法下的信道容量(SIR);

·不分集3跳OFDM的不使用功率分配和子载波配对算法下的信道容量(SIR);

我们的仿真结果如下所示:

·分集2跳OFDM的功率分配带子载波配对算法下的信道容量(SIR);

·分集2跳OFDM的功率分配不带子载波配对算法下的信道容量(SIR);

·分集2跳OFDM的均匀功率分配带子载波配对算法下的信道容量(SIR);

·分集2跳OFDM的均匀功率分配不带子载波配对算法下的信道容量(SIR);

·分集2跳OFDM的不使用功率分配和子载波配对算法下的信道容量(SIR);

我们的仿真结果如下所示:

5.参考文献

[1] Ying W ,  Qu X C ,  Tong W , et al. Power Allocation and Subcarrier Pairing Algorithm for Regenerative OFDM Relay System[C]// IEEE Vehicular Technology Conference-vtc-spring. IEEE, 2007.A01-64