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


根据文献,一般经过多次迭代应该有大约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