126 lines
4.6 KiB
Matlab
126 lines
4.6 KiB
Matlab
%% PSD Comparison of ADMM1, ADMM2, CFR and seperated OICF
|
||
%%% 经过SSPA后的性能比较
|
||
clc;clear;
|
||
%% System Parameter
|
||
% load system_parameter.mat K1 K2 deltaK2 B N1 N2 G L Finv1 Finv2 F1 F2
|
||
|
||
global X1 X2 x_mixed
|
||
% load Index4CCDF_Comparison.mat Index X1 X2 x_mixed
|
||
|
||
M = 4;
|
||
modu = [0 0 1 1; 0 1 0 1];
|
||
% load CCDF_Comparison_ADMM_P5_5000.mat zmixed_m_A1 zmixed_m_A2
|
||
% load CCDF_Comparison_OICF_P5_5000.mat zmixed_m_O
|
||
% load CCDF_Comparison_ICF_P5_5000.mat zmixed_m_R
|
||
% save PSD_comparison.mat...
|
||
% x_mixed zmixed_m_A1 zmixed_m_A2 zmixed_m_R zmixed_m_O
|
||
% load PSD_comparison.mat...
|
||
% x_mixed zmixed_m_A1 zmixed_m_A2 zmixed_m_R zmixed_m_O
|
||
load(['TXPackets\rx_for_User' num2str(1) '.mat'],'rx'); % 加载用户数据
|
||
x_mixed = rx;
|
||
symNum = length(x_mixed);
|
||
%% 取出PAPR最大的100个数据
|
||
[PAPR_dex,MeanPower_Orignal] = calculate_PAPR(x_mixed);
|
||
symNum = 1000;
|
||
for i = 1:symNum
|
||
[a(i),b(i)] = max(PAPR_dex);
|
||
PAPR_dex(b(i)) = 0;
|
||
end
|
||
% b = randi([1 5000],1,symNum);
|
||
x_mixed = x_mixed(:,b);[PAPR_dex,~] = calculate_PAPR(x_mixed);10*log10(mean(PAPR_dex));
|
||
% zmixed_m_A1=zmixed_m_A1(:,b);[PAPR_dex,~] = calculate_PAPR(zmixed_m_A1);10*log10(mean(PAPR_dex))
|
||
% zmixed_m_A2=zmixed_m_A2(:,b);[PAPR_dex,~] = calculate_PAPR(zmixed_m_A2);10*log10(mean(PAPR_dex))
|
||
% zmixed_m_R=zmixed_m_R(:,b); [PAPR_dex,~] = calculate_PAPR(zmixed_m_R);10*log10(mean(PAPR_dex))
|
||
% zmixed_m_O=zmixed_m_O(:,b); [PAPR_dex,~] = calculate_PAPR(zmixed_m_O);10*log10(mean(PAPR_dex))
|
||
%% SSPA Model
|
||
p = 3;IBO = 5;L=4;
|
||
% Original symbol with SSPA
|
||
x_origin_out = SSPA_model(p,IBO,x_mixed);
|
||
[~,MeanPower] = calculate_PAPR(x_origin_out);
|
||
x_origin_out = x_origin_out./sqrt(MeanPower*L);
|
||
% % ADMM1 symbol with SSPA
|
||
% x_A1_out = SSPA_model(p,IBO,zmixed_m_A1);
|
||
% [~,MeanPower] = calculate_PAPR(x_A1_out);
|
||
% x_A1_out = x_A1_out./sqrt(MeanPower*L);
|
||
% % ADMM2 symbol with SSPA
|
||
% x_A2_out = SSPA_model(p,IBO,zmixed_m_A2);
|
||
% [~,MeanPower] = calculate_PAPR(x_A2_out);
|
||
% x_A2_out = x_A2_out./sqrt(MeanPower*L);
|
||
% % CFR symbol with SSPA
|
||
% x_R_out = SSPA_model(p,IBO,zmixed_m_R);
|
||
% [~,MeanPower] = calculate_PAPR(x_R_out);
|
||
% x_R_out = x_R_out./sqrt(MeanPower*L);
|
||
% % OICF symbol with SSPA
|
||
% x_O_out = SSPA_model(p,IBO,zmixed_m_O);
|
||
% [~,MeanPower] = calculate_PAPR(x_O_out);
|
||
% x_O_out = x_O_out./sqrt(MeanPower*L);
|
||
%% PSD plot
|
||
mode = 1; % 1.周期图法:periodogram 2.周期图法加汉明窗 2.文氏窗法:pwelch
|
||
N = (512+36)*2;shift = -N/8;
|
||
|
||
[pxx,freq] = sprectrum(x_origin_out,mode,N);
|
||
pxx = circshift(pxx,shift);
|
||
plot(freq/pi,10*log10(pxx),'k','LineWidth',1);hold on;grid on
|
||
|
||
% [pxx,freq] = sprectrum(x_A1_out,mode,N);
|
||
% pxx = circshift(pxx,shift);
|
||
% plot(freq/pi,10*log10(pxx),'r','LineWidth',1);
|
||
%
|
||
% [pxx,freq] = sprectrum(x_A2_out,mode,N);
|
||
% pxx = circshift(pxx,shift);
|
||
% plot(freq/pi,10*log10(pxx),'b','LineWidth',1);
|
||
%
|
||
% [pxx,freq] = sprectrum(x_R_out,mode,N);
|
||
% pxx = circshift(pxx,shift);
|
||
% plot(freq/pi,10*log10(pxx),'.-r','LineWidth',1);
|
||
%
|
||
% [pxx,freq] = sprectrum(x_O_out,mode,N);
|
||
% pxx = circshift(pxx,shift);
|
||
% plot(freq/pi,10*log10(pxx),'g','LineWidth',1);
|
||
%
|
||
% xlim([-1 1]);ylim([-38 0.5])
|
||
% legend('Origin','ADMM1','ADMM2','CFR','OICF')
|
||
% xlabel('Normalized Frequency')
|
||
% ylabel('PSD (dB)')
|
||
|
||
%% APPENDIX FUNCTIONS
|
||
function [x_out] = SSPA_model(p,IBO,x)
|
||
[~,Mean_Power] = calculate_PAPR(x);
|
||
% PAPR_out_O = 10*log10(PAPR_dex);
|
||
C = sqrt(Mean_Power)*10^(IBO/20);
|
||
x_out = x./ (1+(abs(x)./C).^(2*p)).^(1/(2*p));
|
||
end
|
||
|
||
function [pxx,freq] = sprectrum(x,mode,N)
|
||
switch mode
|
||
case 1
|
||
[pxx,freq] = periodogram(x *sqrt(2*pi),[],N,'centered');
|
||
case 2
|
||
[pxx,freq] = periodogram(x *sqrt(2*pi),hamming(length(x(:,1))),N,'centered');
|
||
case 3
|
||
[pxx,freq] = pwelch(x *sqrt(2*pi),[],[],N,'centered');
|
||
end
|
||
pxx = mean(pxx,2);
|
||
end
|
||
|
||
function [PAPR_dex,Mean_Power] = calculate_PAPR(x)
|
||
% PAPR_dex 计算得到所有符号各自的PAPR
|
||
% Mean_Power 符号的平均功率
|
||
Signal_Power = abs(x).^2;
|
||
Peak_Power = max(Signal_Power,[],1); % norm(x,Inf)^2
|
||
Mean_Power = mean(Signal_Power,1); % norm(x,2)^2/(K*IF)
|
||
PAPR_dex = Peak_Power./Mean_Power;
|
||
end
|
||
|
||
function [EVM1,EVM2,EVM3,EVM_sum] = calculate_EVM(s1,s2,s3,symNum)
|
||
% 计算得到所有符号各自的EVM
|
||
global X1 X2_1 X2_2
|
||
EVM1=zeros(1,symNum);EVM2=zeros(1,symNum);EVM3=zeros(1,symNum);EVM_sum=zeros(1,symNum);
|
||
for i = 1:symNum
|
||
EVM1(i) = norm(X1(:,i)-s1(:,i),2)/norm(X1(:,i),2);
|
||
EVM2(i) = norm(X2_1(:,i)-s2(:,i),2)/norm(X2_1(:,i),2);
|
||
EVM3(i) = norm(X2_2(:,i)-s3(:,i),2)/norm(X2_2(:,i),2);
|
||
EVM_sum(i) = EVM1(i) + EVM2(i) + EVM3(i);
|
||
end
|
||
end
|