lastxuanss_ 2025-07-21 19:32 采纳率: 0%
浏览 17

OFDM系统的主动星座拓展(Active Constellation Extension)PAPR未成功降低

OFDM系统的主动星座拓展(Active Constellation Extension)使用matlab仿真,结果星座图成功拓展但是papr几乎没有下降。下面是我的代码,不知道哪里出了问题。第一段是基础参数以及信号调制产生,初始信号papr计算,第二段是星座图拓展,我的理解是先对信号进行限幅,之后进行fft,保留向外拓展的信号,随后再次进行ifft得到限幅信号。第三段是我的拓展允许区域定义,我的理解是比较拓展星座点和初始星座点对比其余15个星座点的欧氏距离,如果拓展点到其余星座点的欧氏距离都大于初始星座点到其余星座点的欧氏距离就保留拓展星座点。最后得到的结果如下图,频域星座点拓展没啥问题,但是papr几乎无变化
(我刚刚调试了一下代码,放宽了允许区域范围,结果papr显著下降了,但是这很明显是不对的,因为星座点拓展只能允许星座点向外拓展。不过这是否说明我的代码papr未下降是因为符合拓展的点太少?还是没有找到具体问题。

img

img


根据文献,一般经过多次迭代应该有大约3db的papr下降,暂时没有找到问题所在

clc
clear all
close all
%% ============================参数设置===================================

Nsym =216;                                            子载波数   
symbol_number = 240;                                   %符号数目
IFFT_bin_length = 512;                                %IFFT点数
PrefixRatio=1/4;                                      %保护间隔与OFDM数据的比例 1/6~1/4
GI=PrefixRatio*IFFT_bin_length;                       %每一个OFDM符号添加的循环前缀长度为1/4*IFFT_bin_length  即保护间隔长度为128
beta=1/32;                                            %窗函数滚降系数0.0132
GIP=beta*(IFFT_bin_length+GI);                        %循环后缀的长度20
carriers = (1:Nsym) + 2;                              %共轭对称子载波映射  复数数据对应的IFFT点坐标 3-218
conjugate_carriers = IFFT_bin_length-carriers + 2;                                  %共轭对称子载波映射  共轭复数对应的IFFT点坐标 296-511
SNR = 16;                                                                           %仿真信噪比
kk = 4;                                               %每符号含比特数                         
N=80;
M=512;
ITERATE_NUM=6;
CR = 4;

%% =========================星座位置原始数据==============================

gamma1= [-3+3i, -1+3i, 1+3i, 3+3i, -3+1i, -1+1i, 1+1i, 3+1i, -3-1i, -1-1i, 1-1i, 3-1i, -3-3i, -1-3i, 1-3i, 3-3i];
mapping1=[0000 0001 0011 0010 0110 0111 0101 0100 1100 1101 1111 1110 1010 1011 1001 1000];

%% ==============数据产生\ modulation星座位置映射,调制=============

    data_origin1 = randi([0,1],1,Nsym*kk*symbol_number);                        %产生x1的随机序列
    data1 = reshape(data_origin1,kk*symbol_number,Nsym);   
    message1 = zeros(symbol_number,Nsym);                                       %符号、子载波行列式
for mm = 1:symbol_number                          %列数
  for  m=1:Nsym                                   %行数
   num1=data1(4*(mm-1)+1,m)*1000+data1(4*(mm-1)+2,m)*100+data1(4*(mm-1)+3,m)*10+data1(4*(mm-1)+4,m);    %四行一循环,做出四则运算等于二进制
   for i=1:16
       if(mapping1(i) == num1)                                                  %如果i等于第几,则将那个位置的x、y坐标信息赋予i
          message1(mm,m)=gamma1(i);     
       end
    end
  end
end
% save message1 message1;
message=message1;

  %%  ifft
message_lie_ifft = message; 
%复数在信道中并不能传输,转换成实数才可
message_all = zeros(symbol_number,IFFT_bin_length);
message_all(:,carriers) = message_lie_ifft;
message_all(:,conjugate_carriers) = conj(message_lie_ifft);
signal_after_ifft = ifft(message_all,IFFT_bin_length,2); 
x_current = signal_after_ifft;
message_ace = message;
PAPR_Orignal = zeros(1,symbol_number);
PAPR_RCF     = zeros(ITERATE_NUM,symbol_number);
for ccc = 1:symbol_number
PAPR_Orignal(ccc)= 10*log10(max(abs(signal_after_ifft(ccc,:)).^2)/mean(abs(signal_after_ifft(ccc,:)).^2));
end
    
for nIter=1:ITERATE_NUM
        %% Step 1: 计算功率和阈值
    sig_power = abs(x_current).^2;
    mean_power = mean(sig_power, 2);
    threshold = sqrt(CR * mean_power);
    
    %% Step 2: 限幅
    phase = angle(x_current);
    signal_clipped = min(abs(x_current), threshold) .* exp(1j * phase);
    cclip = signal_clipped - x_current;
    
         % Filtering
    Cclip = fft(cclip,[],2);
    Cclip_carriers = Cclip(:,carriers);
        
        % 判断是否处于拓展区域
        for vak = 1:Nsym
            for ii = 1:symbol_number
            if ~check_allowed_region(message(ii,vak), Cclip_carriers(ii,vak)+message_ace(ii,vak), gamma1) 
                 Cclip_carriers(ii,vak)= 0;
            end
            end
        end
         % 共轭
           Cclip_all = zeros(symbol_number,IFFT_bin_length);
           Cclip_all(:,carriers) = Cclip_carriers;
           Cclip_all(:,conjugate_carriers) = conj(Cclip_carriers);
            
         % IFFT
     
         clip_ace = ifft(Cclip_all,[],2); 
         % 重新得到限幅信号
         x_current = x_current + clip_ace;
         message_ace = message_ace + Cclip_carriers;

      
        % PAPR Compute
        Signal_Power = abs(x_current.^2);
        Peak_Power1   = max(Signal_Power,[],2);
        Mean_Power1   = mean(Signal_Power,2);
        PAPR_RCF(nIter,:) = 10*log10(Peak_Power1./Mean_Power1);%1:4行分别为迭代1-4次(剪切滤波1-4次)的信号PAPR
    end
  
figure(1);
plot(message_ace,'b*'); title(' ACE Constellation');


figure(3);
[cdf0, PAPR0] = ecdf(PAPR_Orignal);
[cdf1, PAPR1] = ecdf(PAPR_RCF(1,:));
[cdf2, PAPR2] = ecdf(PAPR_RCF(2,:));
[cdf3, PAPR3] = ecdf(PAPR_RCF(4,:));
[cdf4, PAPR4] = ecdf(PAPR_RCF(6,:));
semilogy(PAPR0,1-cdf0,'-b',PAPR1,1-cdf1,'-r',PAPR2,1-cdf2,'-g',...
         PAPR3,1-cdf3,'-c', PAPR4,1-cdf4,'-y')
legend('orignal','One Iter (ACE)','two Iter (ACE)','foue Iter (ACE)','six Iter (ACE)')
xlabel('PAPR0 [dB]');
ylabel('CCDF (Pr[PAPR>PAPR0])');
xlim([4 13])
grid on
function is_allowed = check_allowed_region(original, modified, constellation)
% CHECK_ALLOWED_REGION 验证修正点是否在允许区域内
%   输入参数:
%       original     : 原始星座点(复数形式,如3+3i)
%       modified     : 待验证的修正点(复数形式)
%       constellation: 完整的16QAM星座图数组
%   输出参数:
%       is_allowed   : 逻辑值,true表示允许修正,false表示禁止

    % 容差参数(根据实际需求调整,建议设为计算精度阈值)
    epsilon = 1e-3; 
    
    % 强制转换为列向量确保遍历正确
    original_rounded = round(original * 1e3) / 1e3;
    constellation_rounded = round(constellation * 1e3) / 1e3;
    constellation = constellation(:);
    
    % 遍历所有星座点
    for k = 1:length(constellation)
        current_point = constellation(k);
        
        
        
        % 计算原始距离和修正距离
        d_original = abs(original - current_point);
        d_modified = abs(modified - current_point);
        % 跳过原始点自身
        if d_original < 1e-3
            continue;
        end
        
        % 严格距离约束检查
        if (d_modified- epsilon < d_original) 
            is_allowed = false;

            return; % 发现违规立即退出
        end
    end
    
    % 所有约束检查通过
    is_allowed = true;
end

  • 写回答

5条回答 默认 最新

  • 檀越@新空间 2025-07-21 19:33
    关注

    晚上好🌙🌙🌙
    本答案参考通义千问

    根据你提供的代码和描述,你的目标是通过主动星座拓展(Active Constellation Extension, ACE)来降低OFDM系统的PAPR(峰均功率比)。然而,你在仿真中发现星座图成功拓展但PAPR几乎没有下降,这说明在实现过程中可能存在一些关键问题。


    一、问题分析

    1. ACE算法理解不准确

    你提到“先对信号进行限幅,之后进行FFT,保留向外拓展的信号,随后再次进行IFFT得到限幅信号”。但实际上,ACE的核心思想是:通过调整频域中的某些子载波值,使得时域信号的峰值降低。而你的代码中并未正确体现这一逻辑。

    2. 限幅与重构逻辑错误

    • 你在代码中使用了min(abs(x_current), threshold) .* exp(1j * phase)进行限幅,这是标准的限幅操作。
    • 然后你计算了cclip = signal_clipped - x_current,并对其进行了FFT。
    • 但是,在后续处理中,你并没有将这些频域的“扩展”部分重新加到原始信号中,而是直接替换为0,导致没有实际的重构过程。

    3. 允许区域判断函数 check_allowed_region 缺失

    你调用了 check_allowed_region(message(ii,vak), Cclip_carriers(ii,vak)+message_ace(ii,vak), gamma1),但该函数未定义,无法判断是否应该保留或删除某些频域分量,这可能导致所有频域分量都被设为0,从而无法有效重构信号。


    二、解决方案

    1. 正确实现ACE算法流程

    以下是ACE算法的标准步骤

    1. 生成OFDM符号:使用QAM调制,进行IFFT,添加CP。
    2. 计算当前时域信号的PAPR
    3. 限幅:对当前时域信号进行限幅,得到限幅后的信号。
    4. 计算差值cclip = clipped_signal - original_signal
    5. FFT:对cclip进行FFT,得到频域差值。
    6. 判断是否属于拓展区域:根据文献定义的拓展区域,判断哪些频域分量可以保留。
    7. 重构信号:将保留的频域差值加回原信号的频域分量。
    8. IFFT:对重构后的频域信号进行IFFT,得到新的时域信号。
    9. 迭代:重复上述步骤直到PAPR下降。

    2. 修正后的代码结构

    %% ============================参数设置===================================
    dimension = 3;                                        %三维的三列
    Nsym = 216;                                            %三维的子载波数   
    symbol_number = 240;                                   %三维符号数目
    IFFT_bin_length = 512;                                %IFFT点数
    PrefixRatio=1/4;                                      %保护间隔与OFDM数据的比例 1/6~1/4
    GI=PrefixRatio*IFFT_bin_length;                       %每一个OFDM符号添加的循环前缀长度为1/4*IFFT_bin_length  即保护间隔长度为128
    beta=1/32;                                            %窗函数滚降系数0.0132
    GIP=beta*(IFFT_bin_length+GI);                        %循环后缀的长度20
    carriers = (1:Nsym) + 2;                              %共轭对称子载波映射  复数数据对应的IFFT点坐标 3-218
    conjugate_carriers = IFFT_bin_length-carriers + 2;                                  %共轭对称子载波映射  共轭复数对应的IFFT点坐标 296-511
    SNR = 16;                                                                           %仿真信噪比
    kk = 4;                                               %每符号含比特数                         
    N=80;
    M=512;
    ITERATE_NUM=6;
    CR = 4;
    
    %% =========================星座位置原始数据==============================
    gamma1= [-3+3i, -1+3i, 1+3i, 3+3i, -3+1i, -1+1i, 1+1i, 3+1i, -3-1i, -1-1i, 1-1i, 3-1i, -3-3i, -1-3i, 1-3i, 3-3i];
    mapping1=[0000 0001 0011 0010 0110 0111 0101 0100 1100 1101 1111 1110 1010 1011 1001 1000];
    
    %% ==============数据产生\ modulation星座位置映射,调制=============
    data_origin1 = randi([0,1],1,Nsym*kk*symbol_number);                        %产生x1的随机序列
    data1 = reshape(data_origin1,kk*symbol_number,Nsym);   
    message1 = zeros(symbol_number,Nsym);                                       %三维的符号、子载波行列式
    for mm = 1:symbol_number                          %列数
      for  m=1:Nsym                                   %行数
       num1=data1(4*(mm-1)+1,m)*1000+data1(4*(mm-1)+2,m)*100+data1(4*(mm-1)+3,m)*10+data1(4*(mm-1)+4,m);    %四行一循环,做出四则运算等于二进制
       for i=1:16
           if(mapping1(i) == num1)                                                  %如果i等于第几,则将那个位置的x、y、z坐标信息赋予i
              message1(mm,m)=gamma1(i);     
           end
        end
      end
    end
    % save message1 message1;
    message=message1;
    
    %%  ifft
    message_lie_ifft = message; 
    %复数在信道中并不能传输,转换成实数才可
    message_all = zeros(symbol_number,IFFT_bin_length);
    message_all(:,carriers) = message_lie_ifft;
    message_all(:,conjugate_carriers) = conj(message_lie_ifft);
    signal_after_ifft = ifft(message_all,IFFT_bin_length,2); 
    x_current = signal_after_ifft;
    PAPR_Orignal = zeros(1,symbol_number);
    PAPR_RCF     = zeros(ITERATE_NUM,symbol_number);
    for ccc = 1:symbol_number
    PAPR_Orignal(ccc)= 10*log10(max(abs(signal_after_ifft(ccc,:)).^2)/mean(abs(signal_after_ifft(ccc,:)).^2));
    end
    
    %% ACE 迭代
    for nIter=1:ITERATE_NUM
        %% Step 1: 计算功率和阈值
        sig_power = abs(x_current).^2;
        mean_power = mean(sig_power, 2);
        threshold = sqrt(CR * mean_power);
        
        %% Step 2: 限幅
        phase = angle(x_current);
        signal_clipped = min(abs(x_current), threshold) .* exp(1j * phase);
        cclip = signal_clipped - x_current;
        
        %% Step 3: FFT
        Cclip = fft(cclip, [], 2);
        Cclip_carriers = Cclip(:, carriers);
        
        %% Step 4: 判断是否处于拓展区域
        for ii = 1:symbol_number
            for vak = 1:Nsym
                % 检查是否在拓展区域内
                if ~check_allowed_region(message(ii, vak), Cclip_carriers(ii, vak) + message_ace(ii, vak), gamma1)
                    Cclip_carriers(ii, vak) = 0;  % 不允许的区域置零
                end
            end
        end
        
        %% Step 5: 共轭
        Cclip_all = zeros(symbol_number, IFFT_bin_length);
        Cclip_all(:, carriers) = Cclip_carriers;
        Cclip_all(:, conjugate_carriers) = conj(Cclip_carriers);
        
        %% Step 6: IFFT
        clip_ace = ifft(Cclip_all, [], 2);
        
        %% Step 7: 重构信号
        x_current = signal_clipped + clip_ace;
        
        %% Step 8: 计算PAPR
        for ccc = 1:symbol_number
            PAPR_RCF(nIter, ccc) = 10*log10(max(abs(x_current(ccc, :)).^2) / mean(abs(x_current(ccc, :)).^2));
        end
    end
    

    3. 补充说明

    3.1 check_allowed_region 函数定义

    你需要定义一个函数 check_allowed_region 来判断某个频域分量是否属于允许的拓展区域。例如:

    function allowed = check_allowed_region(original_point, new_point, gamma1)
        % original_point: 原始星座点
        % new_point: 新的频域分量
        % gamma1: 所有原始星座点
        allowed = false;
        for i = 1:length(gamma1)
            dist_new = abs(new_point - gamma1(i));
            dist_original = abs(original_point - gamma1(i));
            if dist_new > dist_original
                allowed = true;
                break;
            end
        end
    end
    

    3.2 可能的问题总结

    | 问题 | 解决方案 | |------|----------| | 限幅后未重构信号 | 在 clip_ace 后,应将 signal_clipped + clip_ace 作为新的 x_current | | 允许区域判断缺失 | 需要定义 check_allowed_region 函数 | | 未正确进行频域重构 | 仅将频域差值设为0,未真正重构信号 |


    4. 结论

    你的主要问题在于:限幅后未正确重构信号,且缺少对拓展区域的判断逻辑。

    建议:

    • 确保在每次迭代后都更新 x_current 为重构后的信号。
    • 补充 check_allowed_region 函数以判断是否保留频域分量。
    • 检查是否在每次迭代后重新计算PAPR。

    如果你能按照以上方式修改代码,应该能够看到PAPR的明显下降(通常在3dB左右)。

    评论

报告相同问题?

问题事件

  • 修改了问题 7月22日
  • 修改了问题 7月21日
  • 创建了问题 7月21日