m分集2跳OFDM系统中基于功率分配和子载波配对算法的信道容量matlab仿真

111 阅读6分钟

1.算法描述

       随着当代无线通信事业的迅猛发展,无线频谱资源已显得越来越匮乏,传统固定静态的无线频谱分配模式和策略,很难为未来的无线通信事业的进一步发展提供更多可利用的无线频谱带宽和更高的频谱利用率。认知无线电技术是实现动态频谱机会接入并有效解决无线频谱资源匮乏问题的关键技术之一;正交频分复用技术具有抗多径干扰与抗频率选择性衰落能力强,以及频谱利用率高等优点,使其成为实现认知无线电系统的理想备选方案之一。功率分配不但是传统正交频分复用系统中的关键核心技术,而且还是认知无线电系统中频谱分析与判决的重要手段。在认知无线电系统中,认知用户通信链路信道容量的最大化,同样也需要深化对功率分配的研究。本文针对正交频分复用调制子载波的IEEE802.11a下行链路的认知无线电系统,进行了发射功率分配算法研究。

 

       本课题,我们参考文献《Power Allocation and Subcarrier Pairing Algorithm

for Regenerative OFDM Relay System》对OFDM的功率分配和子载波配对算法的信道容量进行matlab仿真分析研究。

 

        随着无线通信的飞速发展,所需要的无线频谱资源越来越多,当前频谱资源已显得越来越缺乏。认知无线电提供了一种按伺机的方式共享和利用频谱的手段,可以有效地解决这一问题。认知无线电技术通过智能感知通信环境中未使用的频谱,并加以利用来提高频谱的利用效率。OFDM的频谱利用效率高,并且抗频率选择性衰落特性强,已成为4G的主要应用技术。随着人们对通讯业务和质量的要求不断提高,OFDM技术的应用也越来越广泛。OFDM系统为了实现系统容量最大化通常会对系统用户进行合理的功率分配,因此功率分配是OFDM系统的关建技术之一。

 

       在基于OFDM的认知无线电系统中,授权用户会受到认知用户带内子载波带外旁瓣泄漏功率的干扰。这里引入了功率控制参数来调整授权用户的干扰功率约束值,提出了一种认知用户子载波间的最优功率分配算法,通过求解一个凸优化问题来获得最优的功率分配方案。仿真结果表明:与其他算法相比,采用该方法获得的功率分配方案,在满足授权用户干扰功率约束值的条件下,可以使认知用户的信道容量最大化。

 

       为了使N路子信道信号在接收时能够完全分离,需要满足在每个码元持续时间Ts内,任意两个载波相互正交。三角函数系{1,sint,cost,...,sinnt,cosnt,...}满足任意两个不同函数之间相互正交(在[−π,π]内两个不同函数乘积积分为0),利用这一性质,可以得到彼此相互正交的载波。从时域上来看,发送端信号在空间中的叠加可以写作:

 

1.png

 

       从复数形式上可以看出,当对时间t进行离散化,OFDM其实就是对各路子载波上的传输信号(Bi)进行了求傅里叶反变换的操作,OFDM在进行调制时也是利用IFFT模块实现的。  

 

2.png

 

       从频域上来看OFDM。调制时,时域上是一个正弦载波和一个码元波形(门函数)的乘积,频域上体现的是对门函数频谱的搬移(门函数的频谱为sinc函数),OFDM为了保证载波的正交性,最小子载频间隔Δf=1Ts。  

 

2.仿真效果预览

matlab2022a仿真结果如下:

3.png

4.png

5.png

3.MATLAB部分代码预览 `%%

%不分集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(SCB0.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

01_064_m`