【PAPR抑制算法】对IPTS,OPTS,CE,PMCE等常见的PAPR抑制算法进行仿真分析

1.软件版本

matlab2017b

2.本算法理论知识

《减少OFDM系统的峰均功率比的研究》

3.部分源码

clc;
clear;
close all;
warning off;
RandStream.setDefaultStream(RandStream('mt19937ar','seed',1));

%FFT变换长度  
Npts         = 8;
Nfft         = 256;                                                                             
ij           = sqrt(-1);
Map_qpsk     = [1 -1 ij -ij];  
Init_Phase   = [1 -1];
Nframes      = 10000;
PAPRo        = zeros(1,Nframes);
load_data;
Phase_length = 2^Npts;
PAPR_pts     = zeros(1,Nframes);
Po           = 0.1;%稀有参数
alpha        = 0.7;%平滑参数
Iter         = 20; %迭代次数,上交博士论文中有提到设置固定的迭代次数简化算法
J            = 10;%每次随机产生J个采样集合cJ
Out          = 0;%lemda估计值的输出
for k=1:Nframes
    if mod(k,10) == 0
       k/10
    end
    %产生数据源
    QPSK_Ind     = randint(1,Nfft,length(Map_qpsk)) + 1;
    %调制,这里为了研究PAPR性能,所以不加入编码模块和交织模块
    Qpsk_mod     = Map_qpsk(QPSK_Ind(1,:));   
    %进行IFFT变换
    Dat_Ifft     = ifft(Qpsk_mod,[],2); 
    %计算功率和PAPR
    Signal_Power = abs(Dat_Ifft.^2);
    Peak_Power   = max(Signal_Power,[],2);
    Mean_Power   = mean(Signal_Power,2);
    PAPRo(k)     = 10*log10(Peak_Power./Mean_Power);
    %随机分块
    QPSK_Ind     = randperm(Nfft);
    A            = zeros(Npts,Nfft);
    for v=1:Npts
        A(v,QPSK_Ind(v:Npts:Nfft)) = Qpsk_mod(QPSK_Ind(v:Npts:Nfft));
    end
    a            = ifft(A,[],2); 
    %限幅
    Tho          = mean2(abs(a));
    [rr,cc] = size(a);
    for i = 1:rr
        for j = 1:cc
            if abs(a(i,j)) > Tho
               a(i,j) = Tho*(real(a(i,j)) + ij*imag(a(i,j)))/abs(a(i,j));
            end
        end
    end
    %PCME算法
    P0   = 0.5*ones(1,Npts);%初始概率为0.5
    Ps   = zeros(Iter,Npts);
    P    = zeros(Iter,Npts);
    for iter = 1:Iter
        %根据随机分布,产生一组序列c
        if iter == 1
           for pp=1:Npts
               c(:,pp) = random('Binomial',1,P0(pp),J,1);%第一次迭代的时候,就用0.5来处理
           end
        else
           for pp=1:Npts
               c(:,pp) = random('Binomial',1,Ps(iter-1,pp),J,1);%第一次迭代的时候,就用0.5来处理
           end
        end
        
        for j = 1:J
            Phase_Factor = repmat(1-2*c(j,:)',1,Nfft);  
            aa           = sum(a.*Phase_Factor);
            Signal_Power = abs(aa.^2);
            Peak_Power   = max(Signal_Power,[],2);
            Mean_Power   = mean(Signal_Power,2);
            F(j)         = 10*log10(Peak_Power./Mean_Power);
        end
        
        %对当前迭代产生的J个F进行增序排序
        [F2,IND]      = sort(F);
        %计算rj
        r(iter)   = sum(F2(1:ceil(Po*J)))/ceil(Po*J);
        IND2      = find(F <= r(iter));
        
        if isempty(IND2) == 1
           IND2 = 1;
        else
           IND2 = IND2;  
        end
        
        for pp = 1:Npts
            
            for s1 = 1:J
                I(pp,s1) = c(IND(s1),pp);
                tmp11s(s1) = I(pp,s1)*exp(-1*F2(s1)); 
                tmp12s(s1) = exp(-1*F2(s1)); 
            end
            P(iter,pp) =  sum(tmp11s)/sum(tmp12s);
        end        
        %更新概率P
        if iter == 1
           Ps(iter,:) = P0;
        else
           Ps(iter,:) = alpha * P(iter,:) + (1-alpha) * P(iter-1,:); 
           if sum(Ps(iter,:)) == round(sum(Ps(iter,:)));
              break;
           end           
        end
    end
    %根据PMCE计算得到的相位因子来计算PAPR值
    aa                = sum(a.*repmat(sign((1-2*Ps(iter,:)))',1,Nfft));
    Signal_Power      = abs(aa.^2);
    Peak_Power_temp   = max(Signal_Power,[],2);
    Mean_Power_temp   = mean(Signal_Power,2);
    PAPR_temp(k)      = 10*log10(Peak_Power_temp./Mean_Power_temp);
end
[cdf,PAPR] = ecdf(PAPR_temp);
figure;
semilogy(PAPR,1-cdf,'b','LineWidth',2);
xlabel('PAPR0[dB]');
ylabel('CCDF (Pr[PAPR>PAPR0])');
title('CEPTS的时候的系统CCDF图');
grid on;
axis([5,12,1e-4,1]);
save CEPTS.mat PAPR cdf
 

4.仿真结论

 

 

 

 

 

5.参考文献

[1]王亚军. 减少OFDM系统的峰均功率比的研究[D]. 上海交通大学.A01-62

猜你喜欢

转载自blog.csdn.net/ccsss22/article/details/124812687